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

VB 6 et antérieur Discussion :

utiliser des for each sur les objets de plusieurs groupes de contrôles ?


Sujet :

VB 6 et antérieur

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut utiliser des for each sur les objets de plusieurs groupes de contrôles ?
    Bonjour tout le monde,

    J'ai plusieurs groupes de contrôles qui contiennent chacun des zones de texte.

    J'aimerais sur le clic d'un bouton, appeler deux fonctions sur chacun des objets des groupes de contrôles.

    Je dois utiliser for each mais for each quoi ?

    J'ai essayé ceci mais sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Command1_Click()
        Dim i As Integer
        i = 0
        For Each zone_de_texte In txtNouveauClient(Index)
            i = i + 1
            MsgBox i
        Next zone_de_texte
     
    End Sub
    Mes trois groupes de contrôles sont donc :

    txtNouveauClient
    txtNouveauClientChiffre
    txtNouveauClientChiffresEtLettres_GotFocus
    Merci d'avance pour votre aide.

    beegees

  2. #2
    Membre habitué
    Homme Profil pro
    Analyste développeur VB6, SQL, VB.NET, C#
    Inscrit en
    Avril 2003
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste développeur VB6, SQL, VB.NET, C#
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2003
    Messages : 111
    Points : 141
    Points
    141
    Par défaut
    bonjour,

    un bout de code sur la gestion des contrôles qui pourrait intéresser...
    dans un formulaire, j'ai tendance à mettre le nom des contrôles dans les propriétés TEXT ou CAPTION pour avoir un visuel explicite.
    ceci permet de "nettoyer" ces propriétés:

    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
    Option Explicit
     
    Private Sub Command1_Click()
        subClearControls Me
    End Sub
     
    '---------------------------------------------------------------------------------------
    ' Procedure :   subClearControls
    ' Purpose   :   permet de vider le contenu des propriétés TEXT et CAPTION de façon générique
    ' Parameter :   objForm_E   formulaire à traiter
    ' Return    :
    ' Update    :
    '---------------------------------------------------------------------------------------
    '
    Public Sub subClearControls(objForm_E As Form)
    On Error GoTo subClearControls_Error
     
        Dim objCtrl As Object       'contrôle en cours de traitement
        Dim lngCtrlIndex As Long    'index du contrôle
        Dim strCtrlType As String   'type de contrôle
     
        '--- pour tous les contrôles du formulaire ---
        For lngCtrlIndex = 0 To (objForm_E.Controls.Count - 1)
     
            'instanciation de l'objet contrôle
            Set objCtrl = objForm_E.Controls(lngCtrlIndex)
            'récupération du type (TextBox, Label, CommandButton, etc.)
            strCtrlType = TypeName(objCtrl)
     
            '--- traitement en fonction du type de contrôle ---
            Select Case strCtrlType
                'cas avec la propriété "TEXT"
                Case "ComboBox", "TextBox"
                    objCtrl.Text = ""
                'cas avec la propriété "CAPTION"
                Case "Label", "CommandButton", "CheckBox", "Frame", "OptionButton"
                    objCtrl.Caption = ""
            End Select
     
        Next lngCtrlIndex
     
    'gestion des erreurs
    subClearControls_Error:
        If Err Then
            MsgBox CStr(Err.Number) & vbCrLf & Err.Description
        End If
    End Sub
    cdlt,

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2007
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 512
    Points : 671
    Points
    671
    Par défaut
    Bonjour,

    Pourquoi ne fais-tu pas tout simplement un groupe de contrôles indexé?

    txtNouveauClient(0)
    txtNouveauClient (1) 'remplace txtNouveauClientChiffre
    txtNouveauClient(2) 'rempllace txtNouveauClientChiffresEtLettres_GotFocus

    puis un "select case" sur l'index ou autre chose dans ton "Command1_Click()"
    A+

  4. #4
    Membre habitué
    Homme Profil pro
    Analyste développeur VB6, SQL, VB.NET, C#
    Inscrit en
    Avril 2003
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste développeur VB6, SQL, VB.NET, C#
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2003
    Messages : 111
    Points : 141
    Points
    141
    Par défaut
    re...

    je me suis penché sur ton code de test. je te propose 2 méthodes:
    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
    Private Sub Command1_Click()
    On Error GoTo Command1_Click_Error
        Dim lngCrtlIndex As Long
        Dim lngCounter As Long
        Dim objCtrlTextBox As TextBox
     
        'txtNouveauClientChiffre (contrôle x3 sur le formulaire)
     
        lngCounter = 0
     
    '<<< METHODE 1 -----------------------------------------------------
        For lngCrtlIndex = 0 To txtNouveauClientChiffre.Count - 1
            lngCounter = lngCounter + 1
            MsgBox CStr(lngCounter)
        Next lngCrtlIndex
        '--> affiche 3 fois la MsgBox avec "1", "2" et "3"
    '>>>
     
    '<<< METHODE 2 -----------------------------------------------------
        For Each objCtrlTextBox In txtNouveauClientChiffre
            lngCounter = lngCounter + 1
            MsgBox CStr(lngCounter)
        Next objCtrlTextBox
        '--> affiche 3 fois la MsgBox avec "4", "5" et "6"
    '>>>
     
    'gestion des erreur
    Command1_Click_Error:
        If Err Then
            MsgBox CStr(Err.Number) & vbCrLf & Err.Description
        End If
    End Sub
    NOTE: l'utilisation de ces 2 méthodes NE fonctionne QUE pour un groupe de contrôles. je n'ai pas trouvé une manière générique de savoir si le contrôle traité est un groupe ou est unique pour le traiter différemment. je sais seulement que s'il s'agit d'un groupe, la propriété Count est disponible.

    cdlt,

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Bonjour, tous,

    Z'avez fini ?

    Analyser et comprendre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    toto = Array(Command5, Text1) ' on met dans cet array les groupes à parcourir
      For i = 0 To UBound(toto)
        For Each Item In toto(i)
          MsgBox "on a " & Item.Name & " d'index " & Item.Index
          Item.FontSize = 20 ' car item, c'est l'ensemble (pour chaque contrôle trouvé dans le groupe concerné)
        Next
      Next

  6. #6
    Membre habitué
    Homme Profil pro
    Analyste développeur VB6, SQL, VB.NET, C#
    Inscrit en
    Avril 2003
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste développeur VB6, SQL, VB.NET, C#
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2003
    Messages : 111
    Points : 141
    Points
    141
    Par défaut
    bonjour ucfoutu,

    ton code génère une erreur:
    438: L'objet ne gère pas cette propriété ou cette méthode
    à la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        For Each Item In toto(i)
    est-ce du au fait que Item (plutôt associé à un élément de collection) ne peut s'appliquer au variant retourné par la fonction array()

    cdlt,

  7. #7
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 537
    Points
    5 537
    Par défaut
    Tu ne peux avoir cette erreur si ce que tu as dans l'array toto est une suite de groupes de contrôles indexés (c'était la demande de beegees)
    Celà veut donc dire que tu y as également mis un contrôle non en groupe !

    Maintenant (et bien que l'on s'écarte de la demande de beegees) : si tu veux en plus t'en sortir en ajoutant dans l'array toto non seulement des noms de groupes mais également des noms de contrôles simples, une gestion d'erreur à 5 soles péruviens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    toto = Array(Command1, Text1, Command5) ' on met dans cet array les groupes à parcourir (command5 et Text1) + un contrôle sans groupe (Command1)
      For i = 0 To UBound(toto)
        On Error GoTo 10
        For Each Item In toto(i)
          MsgBox "on a " & Item.Name & " d'index " & Item.Index
          Item.FontSize = 20
        Next
    10:  If Err Then toto(i).FontSize = 20: Err.Clear
      Next

  8. #8
    Membre habitué
    Homme Profil pro
    Analyste développeur VB6, SQL, VB.NET, C#
    Inscrit en
    Avril 2003
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyste développeur VB6, SQL, VB.NET, C#
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2003
    Messages : 111
    Points : 141
    Points
    141
    Par défaut
    en effet, mon contrôle Command 5 (qui permettait de lancer le code) était unique.

    désolé

    merci pour ce code en tout cas, je vais pouvoir alléger pas mal de code de gestion de contrôles...

    cdlt,

Discussions similaires

  1. Utilisation des listener sur les objets UML
    Par sanchou dans le forum UML
    Réponses: 2
    Dernier message: 11/08/2010, 16h48
  2. Réponses: 2
    Dernier message: 10/09/2009, 08h30
  3. [AC-2003] boucle For Each sur les donnees d'une table
    Par TheRRb dans le forum VBA Access
    Réponses: 6
    Dernier message: 20/07/2009, 12h15
  4. Réponses: 2
    Dernier message: 27/01/2009, 13h47
  5. Réponses: 1
    Dernier message: 22/04/2008, 21h25

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