IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

IHM Discussion :

Accès aux controles d'un sous-formulaire


Sujet :

IHM

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Points : 135
    Points
    135
    Par défaut Accès aux controles d'un sous-formulaire
    Bonjour,

    habituellement je n'ai pas de problème pour accéder aux contrôles d'un sous formulaire, mais là, je bute sur la syntaxe.
    J'ai créé une procédure externe pour traduire les libellés d'un formulaire quelconque en différentes langues (les textes sont stockés en table).
    Le nom de mon formulaire est donc une variable. De même, je ne suis pas certain de la présence d'un sous-formulaire dans le formulaire, encore moins de son nom.

    Voilà mon code (version simplifiée, j'ai laissé de coté tous les traitements)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    Public Sub AfficherLangue(NomForm As String)
    
        Dim ctl As Control, subctl As Control
        
        For Each ctl In Forms(NomForm).Controls
            If (ctl.ControlType = acLabel) Then
                'je traduis...
            End If
            If ctl.ControlType = acSubform Then
                'si c'est un sous-formulaire, je dois lister tous les controles et traduire les étiquettes
                For Each subctl In Forms(NomForm).Control(ctl.Name).Form(ctl.SourceObject).Controls
                    'je dois traduire les étiquettes...
                Next
            End If
        Next
    end sub
    Je bute donc sur la syntaxe de la ligne en rouge.

    Merci d'avance à celui qui pourra m'éclairer.

  2. #2
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Bonjour,
    Attention, je n'ai pas testé !
    Ceci devrait fonctionner (en tout cas une piste)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Sub AfficherLangue(NomForm As String)
     
        Dim ctl As Control, NomDuSousForm as string    
        For Each ctl In Forms(NomForm).Controls
            If (ctl.ControlType = acLabel) Then
                'je traduis...
            End If
            If ctl.ControlType = acSubform Then
                'si c'est un sous-formulaire, je dois lister tous les controles et traduire les étiquettes
                NomDuSousForm=ctl.name            
                AfficherLangue(NomDuSousForm)
            End If
        Next
    end sub

    NB dans ton code, il faudrait aussi testé "onglet" qui peut lui-aussi contenir un sub form.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Points : 135
    Points
    135
    Par défaut
    Merci pour la piste, malheureusement, ça ne fonctionne pas (pourtant passer en récursif, c'était une bonne idée).
    Et je sais pourquoi (enfin je crois) : lorsqu'on ouvre un formulaire A avec un sous-formulaire B à l'intérieur, le formulaire A fait partie de la collection Forms (collection des formulaires ouverts, je le rappelle pour les débutants) mais pas le formulaire B.
    Du coup, lors du 2ème appel à la procédure, Access me répond qu'il ne trouve pas le formulaire B dans la collection Forms.
    Dommage, la solution était élégante et me plaisait bien.

    Une autre solution, peut-être ?

    PS : pour les onglets, je n'avais pas oublié de les traiter (ni les boutons non plus) mais j'avais simplifié le code pour garder juste mon problème.

  4. #4
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    ici, tu trouves un exemple pour boucler sur tous les sous-formulaires
    http://www.developpez.net/forums/d97...e/#post5503957
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Points : 135
    Points
    135
    Par défaut
    Je vais regarder ça, je vous tiens au courant.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Points : 135
    Points
    135
    Par défaut
    Malheureusement, je n'ai pas trouvé comment employer ton code.
    Par contre, j'ai fini par trouver la syntaxe correcte pour la ligne :

    For Each subctl In Forms(NomForm).Controls(ctl.Name).Form.Controls

    Pour ceux que ça intéresserait, voici ma procédure pour traduire les libellés des formulaires en fonction d'une table de traduction (comportant 4 champs : Formulaire, Etiquette, Langue, Traduction) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Public Sub AfficherLangue(NomForm As String)
    On Error GoTo erreur
     
        Dim trad As Recordset, Langue As String
        Dim ctl As Control, subctl As Control
        Dim frm As Form
     
        'on va chercher la langue de l'application stockée dans une table de paramètres utilisateur, par défaut anglais
        Langue = Nz(DLookup("ValeurTxt", "Parametres Utilisateur", "Parametre = 'Langage'"), "English")
     
        Set trad = CurrentDb.OpenRecordset("SELECT * FROM Traduction WHERE Langue ='" & Langue & "'")
     
        'le nom du formulaire pour commencer
        trad.FindFirst "(Formulaire='" & NomForm & "') AND (Etiquette ='Form Name')"
        Forms(NomForm).Caption = trad![traduction]
        'on balaie tous les contrôles un à un
        For Each ctl In Forms(NomForm).COntrols
            'les étiquettes
            If (ctl.ControlType = acLabel) Then
                trad.FindFirst "(Formulaire ='" & NomForm & "') AND (Etiquette ='" & ctl.Name & "')"
                ctl.Caption = trad![traduction]
            End If
            'les onglets
            If ctl.ControlType = acTabCtl Then
                For Each pg In ctl.Pages
                    trad.FindFirst "(Formulaire ='" & NomForm & "') AND (Etiquette ='" & ctl.Name & "-page" & pg.PageIndex & "')"
                    ctl.Pages(pg.PageIndex).Caption = trad![traduction]
                Next pg
            End If
            'les boutons
            If ctl.ControlType = acCommandButton Then
                If ctl.Picture = "(aucune)" Then
                    trad.FindFirst "(Formulaire ='" & NomForm & "') AND (Etiquette ='" & ctl.Name & "')"
                    ctl.Caption = trad![traduction]
                End If
            End If
            'les sous-formulaires
            If ctl.ControlType = acSubform Then
                For Each subctl In Forms(NomForm).COntrols(ctl.Name).Form.COntrols
                    If (subctl.ControlType = acLabel) Then
                        trad.FindFirst "(Formulaire ='" & ctl.Name & "') AND (Etiquette ='" & subctl.Name & "')"
                        subctl.Caption = trad![traduction]
                    End If
                Next
            End If
        Next
        trad.Close
        Set trad = Nothing
        Exit Sub
     
    erreur:
        MsgBox err.Description
        Resume Next
     
    End Sub
    Il suffit ensuite d'appeler la procédure à l'ouverture de chaque formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Form_Open(Cancel As Integer)
     
        AfficherLangue Me.Name
     
    End Sub
    Ma procédure n'est pas forcément exhaustive au niveau des cas possibles mais elle en traite la très grande majorité.

  7. #7
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Merci pour l'info

    As-tu testé ce qui se passe si ton onglet contient un sous-formulaire ?
    A mon avis, il échappe à l'énumération
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 106
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par ClaudeLELOUP Voir le message
    Merci pour l'info

    As-tu testé ce qui se passe si ton onglet contient un sous-formulaire ?
    A mon avis, il échappe à l'énumération
    C'est aussi ce que j'aurais cru, mais en fait, non il est bien pris en compte. Apparement le sous-formulaire fait à la fois partie du formulaire et à la fois de l'onglet. L'objet est listé dans les 2 collections.
    Tant mieux, ça facilite le code !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Acces aux champs d'un sous formulaire
    Par mmo74 dans le forum IHM
    Réponses: 1
    Dernier message: 05/10/2012, 16h13
  2. Accés aux controls d'un formulaire créé par new
    Par Abdou dans le forum Windows Forms
    Réponses: 4
    Dernier message: 25/08/2008, 23h07
  3. Accès aux controles dans un formulaire
    Par tonton67 dans le forum C++Builder
    Réponses: 3
    Dernier message: 25/03/2008, 13h10
  4. Acces aux objets dans un sous-formulaire
    Par Destiny dans le forum Access
    Réponses: 3
    Dernier message: 13/02/2007, 08h28
  5. Accès aux base de données sous Delphi 7 Edition Studio Perso
    Par renorx dans le forum Bases de données
    Réponses: 4
    Dernier message: 16/02/2005, 14h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo