Autres [Résolu]un seul evenement control gerant x controles identiques SANS MODULE CLASSE

patricktoulon

XLDnaute Barbatruc
bonjour a tous
dranreb propose un calendrier conçu dans un userform
et utilise un mappage "withevents" dans un userform
je ne comprends pas bien comment il fait sans instancier de classe avec un seul "withevents" dans le userform
si quelqu'un sait un petit exemple simplifié serait le bien venu
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
bonjour a tous
le mien est ici
c'est la nouvelle version
elle rassemble tout les sujets que j'ai lancé ces derniers jours ;)
le télécharger a nouveau c'est la next version
pas lourd en fonctionnement
le unload automatique(donc userform déchargé après choix )sans perte de valeur
2 méthodes d'appel et les deux sont linéaires
toujours les 3 principaux formats de dates les plus utilisé
très basse consommation en fonctionnement
placement sur range et activX
définition des jours fériés dans la propriété controltiptext
etc...
a tester
 
Dernière édition:

ChTi160

XLDnaute Barbatruc
Bonsoir Patrick
Bonsoir le Fil ,le Forum

Patrick !
j'utilise ta méthode de gestion de plusieurs Control(Label) sans Module de Classe ;
et je rencontre un problème lorsque j'initialise le tableau dans la procédure Initialise et pas dans UserForm_Activate
VB:
Private TabButtons() As New Usf_Saisie
Private Sub LblBt_Click(): ShowPage LblBt.Name: End Sub
Private Sub UserForm_Activate()
xx = 0
With Usf_Saisie
        With .Frm_BOUTONS
             For Each CtrLbl In .Controls
              If CtrLbl.Name Like "Lbl_Bt_*" Then
                 xx = xx + 1
               ReDim Preserve TabButtons(1 To xx)
                  Set TabButtons(xx).LblBt = CtrLbl
              End If
             Next 'CtrLbl               
                     ShowPage (.Lbl_Bt_Accueil)
        End With 'Frm_BOUTONS
et ci dessous ça ne fonctionne pas
VB:
Private Sub UserForm_Initialize()
xx = 0
With Usf_Saisie
        With .Frm_BOUTONS
             For Each CtrLbl In .Controls
              If CtrLbl.Name Like "Lbl_Bt_*" Then
                 xx = xx + 1
               ReDim Preserve TabButtons(1 To xx)
                  Set TabButtons(xx).LblBt = CtrLbl         
              End If
             Next 'CtrLbl
               
                     ShowPage (.Lbl_Bt_Accueil)

        End With 'Frm_BOUTONS
As tu une explication ?
Car si j'ai des trucs dans UserForm_Initialize
et que je mets la boucle dans le UserForm_Activate
Chaque enregistrement dans le Tableau me ramène a l'événement UserForm_Initialize
Est ce du au fait que le Tableau est déclaré TabButtons() As New Usf_Saisie
merci par avance
jean marie
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
je vois pas le map dans ton code (public withevents nomcomun as msforms.[type de control])
et oui on peut declancher le click d'un bouton precis

exemple avec des commandbuttons
VB:
Public WithEvents LblBt As MSForms.CommandButton
Dim TabButtons() As New Usf_Saisie

Private Sub CommandButton4_Click()
'simulation du click sur le bouton 3 dans l'instance 3 de la classe en cliquant sur le 4eme qui n'est pas classé
Set LblBt = TabButtons(3).LblBt ' provisoirement LblBt devien le bouton qui se trouve dans la 3 eme intance
LblBt_Click 'apel le click commun des boutons
End Sub

Private Sub LblBt_Click()
MsgBox LblBt.Name
End Sub

Private Sub UserForm_Activate()
    With Usf_Saisie
        'With .Frm_BOUTONS' pas la peine dans une boucle for each (((dans une boucle for each  le contexte parent direct n'est plus:: tout appartient a l'userform)
        For Each CtrLbl In .Controls
            If CtrLbl.Name Like "Lbl_Bt_*" Then
                xx = xx + 1
                ReDim Preserve TabButtons(1 To xx)
                Set TabButtons(xx).LblBt = CtrLbl
            End If
        Next    'CtrLbl
        'ShowPage (.Lbl_Bt_Accueil)
    End With    'Frm_BOUTONS
End Sub
 

ChTi160

XLDnaute Barbatruc
Bonjour Patrick
Bonjour le Fil,le Forum
maps??(mises au point ?)
pas compris non plus :
Tu dis :
VB:
  'With .Frm_BOUTONS' pas la peine dans une boucle for each (((dans une boucle for each _
                            ' le contexte parent direct n'est plus: tout appartient a l'userform)
        For Each CtrLbl In .Controls
si je mets un compteur dans la boucle sans le With Frm_BOUTONS
je boucle sur 164 Objects
Avec le With .Frm_BOUTONS
je boucle sur 6 objects
Merci de l intérêt que tu portes a mes questions.
jean marie
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
ok
map >> quoiqu'est ce ;)

c'est vrai ça fait parti du jargon informatique de certains développeurs dont moi

en fait ca veux dire en quelque sorte une copie ou un calque comme tu veux
j'explique
quand tu classe tes controls tu les classe chacun dans une instance de la classe
et l’événement du control est géré ensuite par par la COPIE DE L ÉVÉNEMENT ORIGINAL qui est public withevents nomcommun as msforms.[typedecontrol])

la classe peut être un module classe ou comme dans le cas de cette discussion le module userform qui est lui même un module classe a part entière

JE DIT BIEN LE MODULE DE L ' USERFORM !!! JE NE DIS PAS USERFORM (dédicace a dranreb ;) )
ne pas confondre vbcomponents.module et userform

on a donc en CHARGE !! mémoire après classement et!! en fonctionnement

1 module userform(original + object userform + controls + code et tout et tout )
ET!!!
x moduleS userform (avec seulement le code et SEULEMENT les controls classés ET C'EST TOUT )'c'est un MAP ou COPIE ou CALQUE ou faux JUMEAU comme tu veux

pour te la faire courte
une map monde c'est une carte du monde pas le monde ;)

les boucles sur controls

en effet la boucle for each ctrl in Userform1.controls est récursive

c'est a dire que
si le parent dans la boucle c'est l'userform elle va lister les enfants directs et !! les sub enfants (ceux qui sont dans frames par exemple ,etc..)

bref comme j'ai dis précédemment avec cette méthode le contexte parent direct/control n'est plus tout les object appartiennent a l'userform

PERSO je préfère cette boucle dans les classe car justement le contexte parent/enfants direct et plus compliqué a gérer selon si l'on classe parent+enfants ou pas dans un soucis d’économie de mémoire physique
(je rapelle tout de même que pour 2007 par exemple l'application dispose de 2 giga de mémoire seulement )
sur les versions sup a 2007 je sais pas


conclusion
pour classer tes controls
il te faut le MAP events(All evenement) qui est public withevents nomcommun as msforms.[typedecontrol])
une variable (tableau ou collection si plus de 1 controls a classer) dim maclass() as new (nom moduleclasse ou nom userform)
et le maPping se fait dans la boucle redim preserve variable (1 to index of class) et le SET
et dans un soucis de mémoire minimum a utiliser choisir de seulement mapper les evenement object et propriétés qui seront utiles


j’espère avoir répondu a tes questions ;)
 

Dranreb

XLDnaute Barbatruc
JE DIT BIEN LE MODULE DE L ' USERFORM !!! JE NE DIS PAS USERFORM (dédicace a dranreb ;) )
Arrête tes inepsies !
Chaque élément du tableau est un exemplaire à part entière du jeu de données de tout l'UserForm un point c'est tout. Au même titre que celui qui est gardé pour utilisation comme calendrier tant qu'on n'en a pas fait de Uload, les parties dessinées affichées en moins s'il n'est pas visible.
La preuve: comme le soulignait ChTi160, à la première utilisation de chaque élément, puisqu'il y a New dans la déclaraction, la UserForm_Initialize de son type de donnée est éxécutée pour lui.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
bonjour dranreb

ben c'est simple prend un userform +2 bouton + 1 label

colle ceci
et observe le comportement du bouton 1 par raport au 2

et dis moi encre que la classe "maclasse" embarque avec elle le label1 ;)

VB:
Option Explicit

Public WithEvents bout As MSForms.CommandButton
Dim maclasse As New UserForm1

Private Sub bout_Click()
ecritdanslelabel1 "bonjour"
End Sub

Private Sub CommandButton2_Click()
ecritdanslelabel1bis "au revoir "
End Sub

Private Sub UserForm_Activate()
Set maclasse.bout = CommandButton1
End Sub

Public Sub ecritdanslelabel1(mot)
Label1.Caption = mot'ne pourra jamais fonctionner !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
'UserForm1.Label1.Caption = mot
'ca parcontre oui mais la le parent est le control sont nommés explicitement ca aurait le meme effet dans n'importe quel module 
End Sub

Public Sub ecritdanslelabel1bis(mot)'lancé par le bouton 2 non classé'
Label1.Caption = mot
End Sub

tu constatera que la sub1 ne plante pas MAIS !!! ELLE NE FAIT RIEN!!!!!!

tout simplement parce que;
elle plante pas car le code est écrit dans le module
elle ne fait rien parce que label1 est INCONNU DANS LA CLASSE
tu peux dire ce que tu veux les faits sont la ;)
 

patricktoulon

XLDnaute Barbatruc
si tu a raison alors dit moi comment pourrait on avoir accès a ce label sans le nommer lui et son parent explicitement
et la preuve que tu te trompe test cette fois ci en classant le bouton et le label
VB:
Option Explicit

Public WithEvents bout As MSForms.CommandButton
Public WithEvents lab As MSForms.Label
Dim maclasse As New UserForm1

Private Sub bout_Click()
ecritdanslelabel1 "bonjour"
End Sub

Private Sub CommandButton2_Click()
ecritdanslelabel1bis "au revoir "
End Sub

Private Sub UserForm_Activate()
Set maclasse.bout = CommandButton1
Set maclasse.lab = Label1
End Sub

Public Sub ecritdanslelabel1(mot)
'Label1.Caption = mot
'UserForm1.Label1.Caption = mot
lab.Caption = mot
End Sub

Public Sub ecritdanslelabel1bis(mot)
Label1.Caption = mot
End Sub
la oui la sub1 va opérer

 

patricktoulon

XLDnaute Barbatruc
re
Maclasse à sa propre version de Label1
si tu veux mais ce n'est pas un object label c'est simplement du code comme je l'ai dit plus haut
je serais curieux d'en récupérer le clisd
les seuls object accessibles sont ceux nommés explicitement y compris le parent (explicitement) ou ceux qui ont été classés

et non même une première fois label1 est inconnu bataillon de "maclasse"
si tu le choppe d'une manière ou d'une autre c'est tout simplement par ce que le code est (ecrit et executé )dans le module du userform original et ca biaise le resultat

et c'est loin de peser le poids que prend un userform (la version 0 du userform original en fonctionnement)
perso j'ai pas de soucis avec ça
une classe c'est une instance de
un userform c'est un userform
 
Dernière édition:

Membres actuellement en ligne

Statistiques des forums

Discussions
311 725
Messages
2 081 941
Membres
101 848
dernier inscrit
Djigbenou