none
VB6--> VB2005 : Qu'est devenue la propriété Index des controles de formulaire RRS feed

  • Question

  • Je ne retrouve pas dans VB2005, la propriété Index qui permettait en VB6 de définir des "tableaux de contrôles" dans des formulaires.

    C'était très pratique surtout que les procédures évènementielles associées transmettaient l'index de l'objet (par exemple : Sub MonBouton_Click (Index as Integer) ).

    Je suppose qu'il doit bien exister l'équivalent en VB 2005, mais cela complique la migration de VB6 en VB2005.

    Merci de m'aider

    JC
    mardi 24 avril 2007 14:44

Réponses

  • Sous .NET il n'existe rien pour pour les gestions des "Item()" comme sous VB 6.0.

     

    Pour obtenir un système équivalent et performant vous êtes obligé de créer un simple tableau "à la main" dans votre code :

     

    Code Snippet
    Dim
    tab() As Control = {TextBox1, TextBox2, TextBox3}

     

    Et ensuite il suffit de le manipuler comme tout tableau classique : tab(0).Text = "Blabla"...

     

    Cordialement

    vendredi 10 août 2007 14:33
    Modérateur
  • Pour les plateaux de jeux il faut utiliser tout simplement 2 boucles (pour la création, le positionnement et l'utilisation de plusieurs cases)... Et un TableLayoutPanel pour un positionnement rapide...

     

    Cordialement

    mardi 21 août 2007 15:36
    Modérateur

Toutes les réponses

  • Maintenant la méthode click retourne  le "sender", soit directement l'objet qui a été cliqué. Donc tu peux caster cet objet en Bouton et l'utiliser.
    mardi 24 avril 2007 14:49
    Modérateur
  • Caster ?  Il me semble que j'ai du rater quelques épisodes depuis le VB6

    Je donne un exemple de mon problème.

    En VB6 :
    J'ai un formulaire qui contient un groupe de 10 boutons (chaque bouton a la même propriété Name : Chiffre, mais une propriété Index qui varie de 0 à 9)

    Avec une seule sub (je n'ai d'ailleurs pas le choix, puisque quel que soit le bouton que je choisis, il déclenche le même évènement Click), je peux écrire :

    Sub Chiffre_Click (Index as Integer)   
        MsgBox "Vous avez cliqué sur le bouton n° " & Index
    End Sub

    En VB2005, je ne vois pas comment utiliser le paramètre sender...
    pour éviter un code du genre :

    Sub Chiffre1_Click (...)
         MsgBox "Vous avez cliqué sur le bouton n° 1"
    End Sub
    Sub Chiffre2_Click (...)
         MsgBox "Vous avez cliqué sur le bouton n° 2"
    End Sub
    ...

    C'est sans doute tout bête, mais j'ai plein d'applis VB6 qui utilisent cette technique et je ne sais pas comment les faire migrer...
    mardi 24 avril 2007 14:56
  • J'ai mis 3 boutons sur ma Form, chacun utilise la même fonction de clique(avec le handles), puis je cast le "sender" avec CType en "Button". Il y a surement plusieurs façon de faire, mais celle-ci est la méthode de base selon moi.

     

    Code Snippet

    Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button3.Click, Button2.Click

     

    Dim btn As Button

    btn = CType(sender, Button)

    MessageBox.Show("Vous avez appuyer sur le bouton " & btn.Text)

    End Sub

     

     

    mardi 24 avril 2007 18:31
    Modérateur
  • J'ai un problème du même genre.

    En VB6, dans un timer, je pouvais modifier les propriété d'un contrôle appartenant à un groupe de contrôle grace à la propriété index(Exemple:Modification du caption du bouton1)

    Je ne parviens pas à refaire la même chose en VB 2005.

    Bref, si vous pouviez m'aider!!!

     

     

     

    Exemple pour un shape

     

    Private Sub Timer1_Timer()
    mot_sortie = HScroll1.Value
    For i = 15 To 0 Step -1
        If (mot_sortie / (2 ^ i) >= 1) Then
        Shape1(i).FillColor = &HFF&
        mot_sortie = mot_sortie - (2 ^ (i))
                                Else
        Shape1(i).FillColor = &HFFFFFF
        End If
    Next i
    'Text2.Text = CStr(mot_sortie)
    End Sub

    vendredi 10 août 2007 10:36
  • Sous .NET il n'existe rien pour pour les gestions des "Item()" comme sous VB 6.0.

     

    Pour obtenir un système équivalent et performant vous êtes obligé de créer un simple tableau "à la main" dans votre code :

     

    Code Snippet
    Dim
    tab() As Control = {TextBox1, TextBox2, TextBox3}

     

    Et ensuite il suffit de le manipuler comme tout tableau classique : tab(0).Text = "Blabla"...

     

    Cordialement

    vendredi 10 août 2007 14:33
    Modérateur
  • OK, dans mon application, ça marche avec le code ci-dessous(obligé de mettre Dim Coll As New ArrayList). Bref on est obligé de remplir un par un le tableau avec les contrôles!
    c'est beaucoup moin élégant et facile qu'en VB6!
    Merçi beaucoup!!


    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Dim n As Int16
            Dim octet As Integer
            Dim Coll As New ArrayList

            octet = TrackBar1.Value
            TextBox2.Text = CStr(octet)

            Coll.Add(CheckBox1)
            Coll.Add(CheckBox2)
            Coll.Add(CheckBox3)
            Coll.Add(CheckBox4)
            Coll.Add(CheckBox5)
            Coll.Add(CheckBox6)
            Coll.Add(CheckBox7)
            Coll.Add(CheckBox8)

            CType(Coll(n), CheckBox).Checked = True
            For n = 0 To 7
                If (octet / (2 ^ n) >= 1) Then
                    CType(Coll(n), CheckBox).Checked = True
                Else
                    CType(Coll(n), CheckBox).Checked = False
                End If
                octet = octet - (2 ^ n)
            Next n
        End Sub

    vendredi 10 août 2007 14:53
  • Si vous connaissez à l'avance le nombre de contrôle à utilisez, préférez les tableaux typés, comme dans mon exemple de code précédent...

    Dans le cas contraire, typez votre collection !!!!!!

    Utilisez pour cela les Generics (et éviter d'utiliser les collections spécifique à VB). Cela permet de détecter beaucoup d'erreurs à la compilation et évite avoir recours à bon nombre de cast !

     

    Préférez donc :

     

    Code Snippet

    Dim tab As System.Collections.ObjectModel.Collection(Of TextBox)

    tab = New System.Collections.ObjectModel.Collection(Of TextBox)

     

    tab.Add(TextBox1)

    tab.Add(TextBox2)

    tab.Add(TextBox3)

     

    tab.Item(1).Text = "Blabla" 'Aucun cast nécessaire (CType(xxxx)) !

     

    Cordialement

     

    samedi 11 août 2007 11:53
    Modérateur
  • Avec un peu de retard, merci pour vos remarques.

    Cordialement

    dimanche 12 août 2007 18:29
  • Merci à Gilles et à biche pour vos conseils

     

    Cependant, je suis d'accord avec cresus : c'est beaucoup plus lourd qu'en VB6, surtout pour gérer des plateaux de jeux (64 contrôles pour un échiquier, 81 pour un sudoku,, 225 pour un scrabble, 361 pour plateau de Go et 480 pour un démineur...)

     

    JC

     

    mardi 21 août 2007 07:35
  • Pour les plateaux de jeux il faut utiliser tout simplement 2 boucles (pour la création, le positionnement et l'utilisation de plusieurs cases)... Et un TableLayoutPanel pour un positionnement rapide...

     

    Cordialement

    mardi 21 août 2007 15:36
    Modérateur
  •  JC PRO FORMA A écrit:

    Merci à Gilles et à biche pour vos conseils

     

    Cependant, je suis d'accord avec cresus : c'est beaucoup plus lourd qu'en VB6, surtout pour gérer des plateaux de jeux (64 contrôles pour un échiquier, 81 pour un sudoku,, 225 pour un scrabble, 361 pour plateau de Go et 480 pour un démineur...)

     

    JC

     



    Personnellement, je ne retournerais pas à la méthode de VB6, je trouve que c'est maintenant plus simple, mais surtout plus logique!
    mardi 21 août 2007 17:10
    Modérateur
  • Bonjour,

    Effectivement vb.net ne travaille pas avec des tableaux indexé de contrôles en revanche il permet une meilleure gestion des événements puisque maintenant nous pouvons les créer ou les supprimer comme bon nous semble de plus l'évenement n'est plus attaché systématiquement au controle. Le code suivant créé dynamiquent 10 boutons de barre d'outils (ToolStripButton), affecte certaineq propriétés, les ajoute à une barre d'outil nommée tsStandard (ToolStrip) et créé le gestionnaire d'événement associé.

     

    For i As UShort = 0 To 9

      'Création dynamique d'une nouvelle instance du contrôle ToolStripButton.

      Dim tsItem As New ToolStripButton

      'Affecte les propriétés voulues.

      With tsItem

        .DisplayStyle = ToolStripItemDisplayStyle.Image

        .Image = CType(Resources.GetObject("img" & i.ToString), System.Drawing.Image)

        .ImageTransparentColor = System.Drawing.Color.Magenta

        .Name = "tsButton" & i.ToString

        .Size = New System.Drawing.Size(23, 22)

        .Tag = "Mon bouton de barre d'outil N° " & i.ToString

        .ToolTipText = resources.GetString("TIP" & i.ToString)

      End With

      'Ajout du contrôle nouvellement créer à la barre d'outils.

      Me.tsStandard.Items.Add(tsItem)

      'Création du gestionnaire d'événement.

      AddHandler tsItem.Click, AddressOf tsButton_Click

    Next

     

    'Gestionnaire d'évenement associé aux ToolstripButton

    Private Sub tsButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

     

      'Effectue la conversion de l'objet sender en ToolStripButton afin d'obtenir la propriété Name

      'Plus rapide selon la MSDN que CTYPE lors de la conversion d'objets.

      Dim btnName As String = DirectCast(sender, ToolStripButton).Name

     

      'Utilisation de la variable btnName pour le traitement des commandes.

      Select Case btnName

        Case "tsButton1"

          'Traitement 1

        Case "tsButton2"

          'Traitement 2

        Case "tsButton3", "tsButton4"

          'Traitement 3,4 etc

      End Select

    End Sub

    Voila pour le code, l'avantage est la création dynamique des contrôles (sans devoir en créer un en guise de modéle comme sous VB6) De plus le même gestionnaire peut servir à plusieur type de contrôle il suffit de lié le contrôle au gestionnaire d'événements, ainsi dans mon exemple une barre d'outils, et un menu peuvent aisement partagé le même gestionnaire (ex: un menu et un bouton Nouveau fichier ou Ouvrir un fichier).

    En espérant que cela puisse vous servir 

    mardi 21 août 2007 18:19