Icône de la ressource

Collection module classe 2024 patricktoulon (classe controls) gérer Enter/exit TextBox 1.0 1.0

patricktoulon

XLDnaute Barbatruc
Ceci dit, j'ai essayé ça et ça ne marche pas car en déclarant l'instance mère (du UserForm) dans les instances filles, elle ne se termine pas à la fermeture du UserForm car elle est toujours référencée dans les instances filles qui sont encore présentes.

Edit: la question est donc pourquoi ça marche avec ton Classeur2 et pas le UserForm ni dans mon Classeur3 ?

C'est pour ça que dans la version qui fonctionne, je n'ai pas déclaré l'instance mère (du UserForm) dans les instances filles, mais seulement le UserForm pour l'utiliser pour accéder l'instance mère (Me.UserForm.ClasseUserForm).
c'est bien ce que je dis
je le redis pourquoi je fais ça;
c'est pour avoir une référence commune a toutes les filles par exemple ici la ref OldControl membre de la classe
quand une classe est mis en route memoire. oldcontrol devient le control de l'instance de classe
si je faisais set me.oldcontrol =ctrl
au prochain keyup ou mousedown old control serait inconnu de la classe du control actuel

je pourrait certes mettre une variable public dans le userform public Oldcontrol as object
et l'utiliser dans les event de la classe

ca veut dire que la pour gerer le enter et exit on travaille avec 2 module (le module classe et le module userform) hors je fait du transportable
tu glisse le module dans ton projet tu fait les appels et et arrêts dans ton userform et terminé tu n'a pas à gérer d'autres variables qui se communique entre module

C'est pour ça que, pour le code Exit/Enter, tu as intérêt à utiliser comme Classe mère la Classe déclarée dans le UserForm car à la fermeture du UserForm elle sera automatiquement terminée (logique car portée UserForm) et donc toutes ses filles avec. Sans que tu aies à terminer la Classe mère par le code
je ne termine pas la mère par le code je termine les filles c'est pas la même chose
la mère se termine toute seule à la fermeture du Userform


quand a la question pourquoi ca marche pas ben donne moi ton classeur3 qui marche pas je vais vérifier
 

patricktoulon

XLDnaute Barbatruc
Par contre je ne comprends pas pourquoi la collection de l'instance mère contient les 5 items puisque c'est dans les instances filles qu'on fait l'ajout à la collection (de l'instance fille et pas de l'instance mère).
certainement pas c'est faux
visiblement tu maitrise pas encore bien le contexte
si je fait
set classe = new classe1'ça c'est la mère
et qu'ensuite j'appelle la fonction AddChild du module classe comme suit
classe.addchild 'ici l 'action se fait à partir de la classe mère donc j'ajoute une fille à la mère
maintenant si je fait
classe.child(1).addchild ' là j'ajoute une fille à la fille(1) de la mère c'est donc la petite fille de la mère
 

Dudu2

XLDnaute Barbatruc
Oui tout ça je l'ai compris à l'examen du code et donc j'ai modifié mes Post #29 et #30 qui t'expliquent que ce que tu fais, collection ou table même combat, est très joli mais ne sert à rien dans le cas du code Exit/Enter.

Parce que ton schéma est faux:
1727595312672.png
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
A moins de déclarer Public la Classe mère (en Module ou UserForm) pour pouvoir y faire référence dans les instances filles. En UserForm c'est un peu plus délicat car il faut qualifier la classe Public par le UserForm et donc propager l'objet UserForm dans les instances filles.

C'est d'ailleurs exactement ce que j'ai fait dans ma ressource en utilisant une table dans l'instance mère au lieu d'une collection, mais ça revient au même.

Edit: Je viens d'ailleurs de remplacer la Table par une Collection pour être dans le vent de la modernité, et c'est vrai que ça simplifie bien la gestion des ajouts et suppressions d'items.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
A moins de déclarer Public la Classe mère (en Module ou UserForm) pour pouvoir y faire référence dans les instances filles. En UserForm c'est un peu plus délicat car il faut qualifier la classe Public par le UserForm et donc propager l'objet UserForm dans les instances filles.
??????????????????????????????? :oops: 🤔🤔
fait moi un petit exemple concret dans un petit userform
 

patricktoulon

XLDnaute Barbatruc
re
oui c'est bien ce que je pensais
a aucun moment dans le userform tu peux remonter au parent
la mère tu l'identifie dans la Addchild c'est pas dans la classe que l'on doit identifier le parent mais dans le userform sinon ça sert à rien
d'autant plus que tu fait tout tes addchild en un coup et dans la classe en plus
essaie ça dans ton userform
VB:
Option Explicit

Public Classe As New Classe1

Private Sub UserForm_Activate()
    Call Classe.Initialize(Me)
MsgBox Classe.Child(2).Name
MsgBox Classe.Child(2).Parent.Name   'ne peut pas fonctionner
End Sub

Private Sub CommandButton1_Click()
    Unload Me
End Sub
 

Dudu2

XLDnaute Barbatruc
Classe.Child(2) est une instance de classe fille.
Classe.Child(2).Name fonctionne puisque Name est une propriété de cette instance de classe fille.
Classe.Child(2).Parent.Name ne veut rien dire car il n'y a pas de Parent à la classe.

Si tu veux retrouver la classe mère à partir d'une instance fille tu fais:
Classe.Child(2).CallerUserForm.Classe.Name
Ou toute autre propriété conservée dans la classe mère comme dans mon dernier exemple:
Classe.Child(2).CallerUserForm.Classe.UserFormControl
 

Dudu2

XLDnaute Barbatruc
Donc dans le code du Exit/Enter lorsque tu es dans une instance de Control (fille) en cours d'exécution tu veux connaître le Control en cours du UserForm tu fais:
ControlEnCours = Me.CallerUserForm.Classe.UserFormControl

Quand tu veux le setter parce qu'il a changé tu fais:
Me.CallerUserForm.Classe.UserFormControl = ControlEnCours

Puisque par principe c'est l'instance mère qui conserve les valeurs communes.
Me représentant ici l'instance de Control (fille) en cours d'exécution.

C'est pour ça que la propriété de classe CallerUserForm doit être propagée dans toutes les instances de Control (fille).
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
dans le contexte ou tu veux faire des pseudo events de controls comme c'est le cas dans cette ressource
il te faut bien memoriser celui qui vient de "ENTER" pour savoir si l'actuel est un sortant ou entrant
donc pour cela il te faut une variable commune connue de toute les instances
alors soit tu te sert d'une variable public dans un module standard ou même le userform
ou tu fait comme je le fait avec une variable référence circulaire dans la classe

dans le cas de la référence circulaire effectivement ca implique le kill des child par code

dans ton dernier exemple tu n'a rien de tout ca
c'est juste une classe avec 3 childs

si tu fait une classe (enter/ exit) p"ar exemple avec ce procédé ça ne peut pas fonctionner
 

patricktoulon

XLDnaute Barbatruc
re
Classe.Child(2).CallerUserForm.Classe.UserFormControl
ok tu remonte a l'object userform pour redescendre vers les classe
ce qui revient à dire que ceci
Code:
'MsgBox Classe.Child(2).CallerUserForm.Classe.Name

est la même chose que cela

Code:
MsgBox Me.Classe.Name

tu le fait donc avec la ref externe (en l'occurence de l'userform)

c'est bien ce que je disais tu fait la même chose que moi avec une ref externe à la classe
 

Statistiques des forums

Discussions
314 338
Messages
2 108 573
Membres
110 215
dernier inscrit
ClemHopp