Utilisation de ImageList dans un UserControl

cs_Djedj Messages postés 17 Date d'inscription samedi 9 décembre 2000 Statut Membre Dernière intervention 6 mai 2007 - 9 janv. 2007 à 16:05
cs_Djedj Messages postés 17 Date d'inscription samedi 9 décembre 2000 Statut Membre Derniè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 )

gRömK

2 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
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
0
cs_Djedj Messages postés 17 Date d'inscription samedi 9 décembre 2000 Statut Membre Derniè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.

Merci de ton aide

gRömK
0
Rejoignez-nous