Bonjour à tous ,
j'ai un petit soucis de conception, ma solution ne me semble pas très "fine" .
Je bosse avec le sdk d'un appareil photo, j'ai wrappé les appels aux méthodes du
sdk dans différentes classes.
J'ai donc une classe "Camera", avec différentes propriétés et méthodes retournant les réglages
possibles, genre :
- camera.GetShootingModes()
- camera.GetISOSpeeds()
sous forme de
Pour camera.GetISOSpeeds() (par exemple) les couples (clef, valeur) sont du genre ("ISO 400",
0x48), avec valeur = la valeur à passer à Camera.ISO (propriété) pour régler
l'appareil en ISO 400.
Et j'ai quelques combobox dans une IHM, remplies automatiquement avec les clefs
de ces collections, pour avoir par exemple une liste contenant "ISO 80", "ISO
200", etc etc.
Quasiment toutes les fonctions de l'appareil sont "mappables" sur
des combobox, car c'est quasiment toujours un réglage à sélectionner parmi une liste de
possibilités fournie par l'appareil.
Il s'avère que toutes mes combobox ont le même comportement, quand je click sur
"ISO 400" je veux :
- chopper 0x48 dans la collection contenant les couples pour l'ISO
- faire Camera.PROPRIETE = cette valeur (0x48), donc Camera.ISO=0x48; ici
Pour éviter d'implémenter autant de méthodes écoutant les évènements qu'il y a
de comboboxes, j'aurai bien tout cablé sur la même méthode, qui aurait utilisé
l'émetteur de l'évènement (donc la combobox) comme clef donnant accès, dans une
hashtable, à une struct "Triplet" contenant :
- la collection à utiliser pour trouver 0x48 (ou un delegate vers Camera.GetISOSpeeds() mais bon autant stocker tout ca...)
- le delegate vers Camera.ISO pour pouvoir faire le Camera.ISO = 0x48 (avec un peu de réflexivité)
- la combobox elle-même (ca peut servir, ou pas, faut voir)
Problème :
si je stock mon "Triplet", il me faut stocker en fait un
car l'une des données membre de la struct est un
car à l'origine, GetISOSpeeds() me retourne un
Code :
- Dictionary<string, struct_contenant_les_ISO_kisontdes_bytes>
|
Donc ma collection de Triplet<K,V> (avec pleins de K et V différents) est une
Hashtable (key=Combobox, value=Object)
mais le drame c'est que je ne peux pas sortir un Triplet directement,
ne connaissant pas les types K et V. Un coup c'est :
Code :
- Dictionary<string, int>
|
une autre fois ça sera
Code :
- Dictionary<string, byte>
|
ou
Code :
- Dictionary<int, type_a_la_kon>
|
Je pense pouvoir m'en sortir avec du typeof(instance) ou autre, mais bon
J'aurai bien aimé au moins un truc à la C++ genre :
Code :
- if (TypeA a = dynamic_cast<TypeA>(..)) { }
- else if (TypeB b = dynamic_cast<TypeB>(..)) { }
- ...
|
Si quelqu'un a une idée sur comment stocker cette association "combobox/collection
générique/property à appeler", je suis preneur
Message édité par Xavier_OM le 11-03-2008 à 10:10:54
---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.