VB Melanger des textboxs

Résolu
Bonjour , je cherche désespérément le moyen de mélanger mes 4 textboxs.

J'ai 4 textboxs, et en dessous, j'ai un bouton " Aléatoire", j'aimerais que lorsque que l'on clique sur le bouton aléatoire, le contenu des 4 textboxs se mélangent, sans doublons.

Est ce que quelqu'un aurait une piste ?

15 réponses

  1. Merci ! , cela fonctionne parfaitement. j'ai juste du changer Randomize(VB.Timer())

    par Randomize(TimeOfDay.ToOADate())

    Par contre je ne comprend absolument pas comment le code fonctionne en lui même, mais c'est pas grave ._.
    1. Bonjour,

      La précision sur la version utilisée aurait certainement été utile et aurait fait gagner du temps à tout le monde.

      Je n'ai pas la version 2010. J'ai importé le projet VB 6 dans la version VB 2008.
      Voilà ce que ça donne, avec le code que j'ai donné plus haut:

      Option Strict Off
      Option Explicit On
      Imports VB = Microsoft.VisualBasic
      
      Friend Class Form1
      	Inherits System.Windows.Forms.Form
      	
      	Private mTab() As Object
      	Private ind As Short
      	
      	
          Private Sub BoutonAleatoire_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BoutonAleatoire.Click
              ind = 0
              InitTab()
              SearchAlea()
          End Sub
      	
      	Private Sub InitTab()
      		Dim txt As System.Windows.Forms.Control
      		
      		ReDim mTab(0)
      		For	Each txt In Me.Controls
                  If TypeOf txt Is System.Windows.Forms.TextBox Then
                      ReDim Preserve mTab(ind)
                      mTab(ind) = txt.Text
                      ind = ind + 1
                      txt.Text = ""
                  End If
      		Next txt
      				
      	End Sub
      	
      	Private Sub SearchAlea()
              Dim str As Object
      		Dim cpt As Short
      		
      		While cpt <= 3
                  str = returnAlea()
      			If doesExistAlea(str) = False Then
      				Affiche((str))
      				cpt = cpt + 1
      			End If
      		End While
      		
      	End Sub
      	
          Private Sub Affiche(ByVal str As Object)
              Dim txt As System.Windows.Forms.Control
      
              For Each txt In Me.Controls
                  If TypeOf txt Is System.Windows.Forms.TextBox Then
                      If txt.Text = "" Then
                          txt.Text = mTab(str)
                          Exit Sub
                      End If
                  End If
              Next txt
      
          End Sub
      	
      	Private Function returnAlea() As Object
      		Dim alea As Short
      		
      		Randomize(VB.Timer())
      		
      		alea = CShort(Rnd() * (ind - 1))
      		If alea > UBound(mTab) Then alea = UBound(mTab)
              returnAlea = alea
      		
      	End Function
      	
          Private Function doesExistAlea(ByVal str As Object) As Boolean
              Dim txt As System.Windows.Forms.Control
      
              For Each txt In Me.Controls
                  If TypeOf txt Is System.Windows.Forms.TextBox Then
                      If txt.Text = mTab(str) Then
                          doesExistAlea = True
                          Exit Function
                      End If
                  End If
              Next txt
      
              doesExistAlea = False
      
          End Function
      
      End Class


      Ce n'est pas très propre.

      Il faut réorganiser le code. Certaines méthodes n'ont rien à faire dans la classe de la form.

      ;o)
      1. No problème , je vais étudier les pistes que vous m'avez donné.

        Merci encore :p
        1. j'utilise des windows forms et non des feuilles.

          textbox1 dans les lignes

          For i = 0 To 3 : AR(i) = TextBox1(i).text : Next i

          et

          TextBox1(i).text = AR(R) : AR(R) = ""

          me donne l'erreur

          Class 'System.Windows.Forms.TextBox' cannot be indexed because it has no default property.
          1. Contributeur
            Bon, tu me confirme que tu est bien en VB.Net, malheureusement je ne connaîs pas la syntaxe des versions .Net.
            Le principe de la méthode que je t'ai donné est bonne, à toi de trouver la syntaxe adéquoite à ta version.
            Désolé mais je sais pas aller plus loin.
            A+
        2. Contributeur
          Ton VB c'est bien du Visual basic non ?
          Tu ne sais pas ce que c'est des contrôles indexés ?
          Sur ta feuille tu colle un textbox (qu'importe le nom)
          Tu le sélectionne (qu'il ai des poignées.
          Tu tape Ctrl + C
          ensuite Ctrl + V
          Tu va avoir un message.. Ce textbox existe déja voulez_vou... tu dis oui
          Ensuite tu tape encore deux fois Ctrl + V et tu auras tes 4 TextBox
          si tu va voir dans la fenêtre des propriétés tu verra qu'il auront un index de 0 à 3
          Tu ne doit pas les renommer.
          et si le nom est textbox1
          tu change Text1(i) par TextBox1(i).text
          Essaye déja ça...
          L'expérience instruit plus sûrement que le conseil. (André Gide)
          Si tu te cogne à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
          1. j'ai remplacer text1 par textbox1.text

            TextBox1.Text(i) = AR(R)

            Ce morceau me donne l'erreur :

            Property 'chars' is 'ReadOnly'.
            1. Contributeur
              Rectifier avec des contrôles Text indexé de 0 à 3
              Private Sub Command1_Click()
              Dim AR(3)
              Dim i As Byte, R
                  For i = 0 To 3: AR(i) = Text1(i): Next i
                  For i = 0 To 3
              Reco:
                      R = Int((4 * Rnd) + 1) - 1 'moins 1 pour avoir le zéro
                      If AR(R) <> "" Then
                          Text1(i) = AR(R): AR(R) = ""
                      Else: GoTo Reco
                      End If
                  Next i
              End Sub

              Et tout le reste n'est pas nécessaire.
              Randomize n'est pas obligatoir, c'est pour réinitialiser le pseudo compteur aléatoir RND.
              C'est en VB6 mais ça devrait pas poser trop de problème.
              1. Vraiment désolé...

                Comme précisé dans le titre j'utilise le VB et non le C

                En utilisant les index ?
                1. Bon j'ai essayer, et j'ai des problèmes pour les deux versions....

                  Je tiens a préciser que j'utilise visual studio 2010 RC

                  et sinon ce n'est pas du VBA :p

                  Pour le code de lermite222

                  CoText(i) = AR(R)

                  Ce morceau me donne l'erreur :

                  Property 'Item' is 'ReadOnly'.

                  sinon j'ai du changer de 1 à 4 en 0 à 3 car apparemment le plus petit ne peut être que 0 ._.

                  pour le premier code, j'ai des fonctions telle que Randomize Timer qui ne fonctionne pas, la syntaxe n'as pas l'air d'être compatible.
                  1. Contributeur
                    Comme quoi... Quand ont ne précise pas le language employer !!!!!
                    Et tu dis ensuite...
                    Je tiens a préciser que j'utilise visual studio 2010 RC
                    Mais tu utilise quoi, le C le VB..
                    Et de toute façon c'est en .Net
                    En gardant le même principe que dans mon code mais en employant les Index il y a possibilité d'y arriver.
                    Tu dis.
                2. Ok merci beaucoup, je vais essayer ca de suite et je vous tiens au courant !

                  Encore merci .,.
                  1. Contributeur
                    Bonjour,
                    Une autre solution ?
                    J'ai choisi de faire une collection cela raccouci le code du bouton.
                    Dans le tag de 4 textBox mettre de 1 à 4 .. textBox1.Tag =1, textBox2.Tag =2.. etc
                    Comme tu emploi des textBox je suppose que tu est en VBA ?
                    Code à coller dans le module d'ub UserForm
                    Si les TextBox sont sur une feuille le code doit être légérement modifié.
                    Option Explicit
                    Dim CoText As Collection
                    
                    Private Sub UserForm_Initialize()
                    Dim Cl
                        Set CoText = New Collection
                        For Each Cl In Me.Controls
                            If Cl.Tag <> "" Then
                                CoText.Add Cl, Cl.Tag
                            End If
                        Next Cl
                    End Sub
                    
                    Private Sub CommandButton1_Click()
                    Dim AR(1 To 4)
                    Dim i As Byte, n, R
                        For i = 1 To 4: AR(i) = CoText(i): Next i
                        Randomize
                        For i = 1 To 4
                    Reco:
                            R = Int((4 * Rnd) + 1)
                            If AR(R) <> "" Then
                                CoText(i) = AR(R): AR(R) = ""
                            Else: GoTo Reco
                            End If
                        Next i
                        
                    End Sub


                    A+
                    1. Test ça, à coller dans le formulaire:

                      Option Explicit
                      
                      Private mTab()
                      Private ind As Integer
                      
                      
                      Private Sub BoutonAleatoire_Click()
                          ind = 0
                          InitTab
                          SearchAlea
                      End Sub
                      
                      Private Sub InitTab()
                      Dim txt As Control
                      
                          ReDim mTab(0)
                          For Each txt In Me.Controls
                              If TypeOf txt Is TextBox Then
                                  ReDim Preserve mTab(ind)
                                  mTab(ind) = txt.Text
                                  ind = ind + 1
                                  txt.Text = ""
                              End If
                          Next txt
                      
                          
                      End Sub
                      
                      Private Sub SearchAlea()
                      Dim str As Variant
                      Dim cpt As Integer
                      
                          While cpt <= 3
                              str = returnAlea
                              If doesExistAlea(str) = False Then
                                  Affiche (str)
                                  cpt = cpt + 1
                              End If
                          Wend
                          
                      End Sub
                      
                      Private Sub Affiche(ByVal str As Variant)
                      Dim txt As Control
                      
                              For Each txt In Me.Controls
                              If TypeOf txt Is TextBox Then
                                  If txt.Text = "" Then
                                      txt.Text = mTab(str)
                                      Exit Sub
                                  End If
                              End If
                          Next txt
                      
                      End Sub
                      
                      Private Function returnAlea() As Variant
                      Dim alea As Integer
                      
                          Randomize Timer
                          
                          alea = CInt(Rnd * (ind - 1))
                          If alea > UBound(mTab()) Then alea = UBound(mTab())
                          returnAlea = alea
                      
                      End Function
                      
                      Private Function doesExistAlea(ByVal str As Variant) As Boolean
                      Dim txt As Control
                      
                          For Each txt In Me.Controls
                              If TypeOf txt Is TextBox Then
                                  If txt.Text = mTab(str) Then
                                      doesExistAlea = True
                                      Exit Function
                                  End If
                              End If
                          Next txt
                      
                          doesExistAlea = False
                          
                      End Function
                      


                      ;o)
                      1. par défaut :

                        Player 1
                        Player 2
                        Player 3
                        Player 4

                        C'est un logiciel pour géré des crews et brackets de tournois. Le contenu des textboxs est récupéré ensuite par des labels, etc pour la gestion de l'évent.