|
|
|||||
|
Un problème souvent rencontré dans eVB est l'impossibilité d'avoir recours à une collection afin de stocker une liste de valeurs ou d'objets. Ce manquement n'est cependant pas irrémédiable grâce au C++ et ATL. On entend par Collection, tout objet permettant de stocker une série d'informations (entiers, chaînes, objets, ...). Pour l'obtenir, il suffit de créer un composant comme tout autre et de fournir, en plus de l'interface normale pour une collection (taille, nombre d'éléments, contenu, ...), un support pour l'instruction for...each. ATL fournit pour cela une implémentation de l'interface d'énumération compatible avec les iterator de la STL. Bien sûr, la STL n'est pas fournie avec eVC, cependant une très brève recherche sur internet nous permet d'en trouver un adaptation (sur Google entrez le critère : STL "Windows CE"). Il est dès lors possible de créer un composant COM pour chaque type de Collection (list, vector, map, ...).
Il faut bien attendu commencer par créer son composant (reportez vous à l'article " ATL à la rescousse de eVB "). Le composant doit bien évidemment contenir une instance d'un objet de ATL par exemple vector. Il est possible de spécialiser son vecteur en précisant un type de donnée particulier : typedef vector<short> IntCollection; Ensuite une instance de IntCollection vous permettra de stocker des Integer et rien d'autre. En général on préférera avoir une collection de Variant. Bien sûr, le traitement des variants est plus lent mais la souplesse offerte par ce type de données compense grandement ce désavantage. typedef vector<VARIANT> Collection; Les objets essentiels de la STL sont les suivants : La classe du composant héritera donc d'une de ces classes : class ATL_NO_VTABLE CVBCollectionObj : Il est préférable d'utiliser CComVariant car l'objet initialise directement le variant à Empty.
La collection doit permettre l'utilisation du for...each de Visual Basic, pour cela notre composant doit posséder une propriété spéciale en lecture seule qui retourne un énumérateur. La propriété s'appelle _NewEnum, et doit posséder un dispid valant DISPID_NEWENUM. Dans le fichier .idl on ajoute donc la déclaration de la propriété : [propget, id(DISPID_NEWENUM), helpstring("property
_NewEnum")] _NewEnum retourne un pointeur sur une interface d'énumération, dans notre cas il s'agit de l'interface IEnumVARIANT. ATL fournit une implémentation des interfaces d'énumération compatible avec les itérateurs de la STL. L'implémentation de la fonction get__NewEnum n'offre donc aucune surprise.
|
|||||
|
|
|||||
|
Copyright 2001-2004 - Tous droits réservés
|
|||||
|
iPAQ
est un produit de COMPAQ.
|