cs_Djedj
Messages postés17Date d'inscriptionsamedi 9 décembre 2000StatutMembreDernière intervention 6 mai 2007
-
9 janv. 2007 à 16:05
cs_Djedj
Messages postés17Date d'inscriptionsamedi 9 décembre 2000StatutMembreDernière intervention 6 mai 2007
-
9 janv. 2007 à 20:06
Bonjour!
Je souhaiterais pouvoir utiliser un contrôle ImageList dans mon UserControl, à l'instar de TreeView, TabView, ListView, etc... de la librairie mscomctl : ce ImageList est donc un contrôle placé sur le Form qui contient mon UserControl.
Voici le code et l'explication du problème :
Dim s_imagelist As MSComctlLib.ImageList
Public Property Get ImageList() As Object
Set ImageList = s_imagelist
End Property
Public Property Set ImageList(ByRef New_ImageList As Object)
If TypeOf New_ImageList Is MSComctlLib.ImageList Then Set s_imagelist = New_ImageList
End Property
...ainsi que WriteProperties et ReadProperties qui enregistrent ou récupèrent la propriété Name du ImageList associé à mon UserControl
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
If s_imagelist Is Nothing Then
Call PropBag.WriteProperty("ImageList", "", "")
Else
Call PropBag.WriteProperty("ImageList", s_imagelist.Name, "")
End If
End Sub
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
Set s_imagelist = GetParentImageList(PropBag.ReadProperty("ImageList", ""))
End Sub
La fonction GetParentImageList (aussi appelée depuis une page de propriété) est la suivante :
Friend Function GetParentImageList(ByVal imlName As String) As Object
If imlName = "" Then
Set GetParentImageList = Nothing
Else
Dim imlCtrl As Object
For Each imlCtrl In UserControl.ParentControls
If
imlCtrl.Name
imlName Then Set GetParentImageList imlCtrl
Next
End If
End Function
Cette fonction retourne donc un objet ImageList à partir de son nom... Appelée depuis la procédure ApplyChanges() de ma page de propriétés, aucun problème, la propriété ImageList de mon UserControl correspond bien au contrôle ImageList désigné dans la liste déroulante. Par contre, le problème est que, lorsqu'elle est appelée depuis ReadProperties (après avoir fermé puis rouvert un Form contenant une instance de mon UserControl, le tout en mode Création), cette fonction ne marche pas, car le contrôle ImageList désigné par la propriété de mon UserControl n'est pas encore chargé, et n'appartient donc pas encore à la collection ParentControls ...! Ainsi, GetParentImageList renvoie Nothing, alors que le paramètre imlName est valide...
Comment dois-je procéder? Suis-je obligé d'utiliser un String dans la propriété ImageList du UserControl, et d'appeler ma fonction GetParentImageList uniquement lors de l'utilisation du contrôle ImageList?
Merci à ceux qui auront le courage de se plonger dans le problème (et tant pis pour les autres )
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 9 janv. 2007 à 18:21
http://www.vbfrance.com/auteurdetail.aspx?ID=2204 Salut
Sans essayer, je commencerais par changer le nom de la propriété Get ImageList car ce nom, ImageList, est réservé à un objet.
Le problème peut venir de là ...
D'autre part, si ton objet est une ImageList, dis lui que c'est une ImageList au lieu de Object, plus logique, non ?
Public Property Get xImageList() As Object
Essaye
Public Property Get xImageList() As MSComctlLib.ImageList
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
Champion du monde de boule de cristal - 2005 Le savoir est la seule matière qui s'accroit quand on
cs_Djedj
Messages postés17Date d'inscriptionsamedi 9 décembre 2000StatutMembreDernière intervention 6 mai 2007 9 janv. 2007 à 20:06
Salut!
Non, le nom ImageList fonctionne bien (même si je conçois que ça puisse gêner certains)
Non, ImageList à la place de Object de fonctionne pas
Le problème vient vraiment du fait que dans le contexte de ReadProperties, lorsqu'une nouvelle instance du UserControl vient d'être créée, ParentControls ne contient pas encore le contrôle ImageList...
J'ai résolu le problème en procédant comme je l'avais évoqué : la fonction GetParentImageList n'est plus appelée dès la création de l'instance, mais plutôt lorsqu'il y a besoin de dessiner les images... Je ne suis pas complètement satisfait, mais ça marche parfaitement, et le code n'est que légèrement allourdi.