Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Microsoft 365 Récupérer l'userform parent d'un controle

Florian53

XLDnaute Impliqué
Bonjour à tous,

Je souhaite récupérer l'objet Userform parent d'un control, j'ai créer des évènements de substitution mais je peux avoir plusieurs UserForm d'ouvert en même temps, et de mes événements il faut que je redirige vers le bon formulaire, je n'arrive à récupérer avec une fiabilité infaillible l'userform parent.

J'ai essayé de créer une fonction qui boucle vers l'élément parent est détecter si l'objet parent est un formulaire alors je le 'Set' et l'affecte à la fonction mais cela ne fonctionne pas tout le temps, est ce que vous avez une astuce pour récupérer le formulaire parent d'un contrôle ? j'ai essayé de regarder par les API , en récupérant le handle de celui ci mais je penses entamer une usine à gaz alors que je penses qu'il doit y avoir un moyen plus simple.

Voici l'exemple pour l'événement de substitution :
VB:
Private Sub CText_Click()
    Check_Txt_Parent(CText).Click_sur_TextBox CText.Caption, CText.Name
End Sub

La fonction qui boucle, en supposant que le nom du formulaire commence par 'UF', mais je ne suis pas fan de la méthode:
VB:
Function Check_Txt_Parent(ct As MSForms.Control)
    Set Check_Txt_Parent = Nothing

    On Error Resume Next
    Set Check_Txt_Parent = ct.Parent

    Do Until Check_Txt_Parent.Name Like "UF* "
        If Check_Txt_Parent.Name Like "UF*" Then Exit Do
        Set Check_Txt_Parent = Check_Txt_Parent.Parent
    Loop
   
End Function

J'ai essayé avec:
TypeName(Check_Txt_Parent)
mais le résultat est le nom de l'userform

Merci
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Ne pouvez vous le conserver dans une variable globale du module détenant le contrôle initialisée en même temps que lui ?
Ou bien gérer votre collection de contrôles dans un module de classe qui déclenchera un évènement pour votre UserForm ?
 

Florian53

XLDnaute Impliqué
Actuellement je gère déjà les contrôles dans un module de classe :

VB:
Option Explicit
Option Base 1

Public WithEvents CText     As MSForms.TextBox
Public WithEvents CCombo    As MSForms.ComboBox
Public WithEvents CImg      As MSForms.Image
Public WithEvents CCbx      As MSForms.CheckBox
Public WithEvents CBtn      As MSForms.CommandButton
Public WithEvents CLbl      As MSForms.Label
Public WithEvents CFr       As MSForms.Frame
Public WithEvents CUF       As MSForms.UserForm
Public WithEvents Forme     As UserForm
Dim Mctl()                  As New FWCUF

'Procédure de détection du type de controles
Sub Collection_Ctl(uf, Ctls As MSForms.Control, Optional Transformation As Byte = 0)
    Dim hWnd    As Long

    ReDim Preserve Mctl(Nb_Ctl)
    Set Mctl(Nb_Ctl).Forme = uf
    
    Select Case UCase(TypeName(Ctls))
    
        Case "TEXTBOX"
            Set Mctl(Nb_Ctl).CText = Ctls
        Case "IMAGE"
            Set Mctl(Nb_Ctl).CImg = Ctls
        Case "COMBOBOX"
            Set Mctl(Nb_Ctl).CCombo = Ctls
        Case "CHECKBOX"
            Set Mctl(Nb_Ctl).CCbx = Ctls
        Case "COMMANDBUTTON"
            Set Mctl(Nb_Ctl).CBtn = Ctls
        Case "LABEL"
            Set Mctl(Nb_Ctl).CLbl = Ctls
        Case "FRAME"
            Set Mctl(Nb_Ctl).CFr = Ctls
    End Select
    
End Sub

Private Sub CText_Click()
    Check_Txt_Parent(CText).Click_sur_TextBox CText.Caption, CText.Name
End Sub

Private Sub CText_Change()
    Check_Txt_Parent(CText).Change_sur_TextBox CText.Caption, CText.Name
End Sub

Private Sub CText_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
    Check_Txt_Parent(CText).Keypress_sur_TextBox KeyAscii, CText.Name
End Sub

Private Sub CText_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Check_Txt_Parent(CText).KeyDown_sur_TextBox KeyCode, CText.Name
End Sub


Function Check_Txt_Parent(ct As MSForms.Control)
    Set Check_Txt_Parent = Nothing

    On Error Resume Next
    Set Check_Txt_Parent = ct.Parent

    Do Until Check_Txt_Parent.Name Like "UF* "
        If Check_Txt_Parent.Name Like "UF*" Then Exit Do
        Set Check_Txt_Parent = Check_Txt_Parent.Parent
    Loop
    
End Function

et je vois pas comment je peux garder en mémoire l'userform en mémoire en sachant que ça peut varier, je ne vois pas comment donner le focus à l'userform parent meme en utilisant un module de classe pour la gestion des userforms.
 

Florian53

XLDnaute Impliqué
Voici le code de l'userform :

VB:
Private Sub UserForm_Initialize()
    Dim Ctl     As MSForms.Control
    Dim hWnd
   
    If G_FW_BLN_Main = True Then
                       
        Nb_Ctl = Nb_Ctl + 1
        Set Ctl = Me.Controls.Add("forms.TextBox.1", "test")
        G_OBJ_Control.Collection_Ctl Me, Ctl, 1

    End If
End Sub
 

Florian53

XLDnaute Impliqué
Afin que ce code :

VB:
Private Sub CText_Click()
    Check_Txt_Parent(CText).Click_sur_TextBox CText.Caption, CText.Name
End Sub

redirige bien vers (avec le bon formulaire), car le code cis dessous est inscrit dans le formulaire:
VB:
Sub Click_sur_TextBox(a, b)
End Sub
 

Florian53

XLDnaute Impliqué
Je viens d'ouvrir ton fichier, je vais en avoir pour un petit moment pour comprendre, je vais regarder ça dans la soirée, de ce que je comprends au premier abord, les évènements de substitutions ne sont plus géré dans l'userform mais directement par les modules de classes?

Moi ce que je faisais avant, c'était juste les créer par les modules de classes puis par la suite je les utilisaient dans les formulaires alors que toi, de ce que je comprends tu fais les 2 par les modules de classes ?

Encore merci
 
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…