VB Melanger des textboxs

Résolu
Qual -  
 Qual -
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. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
  2. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  3. Polux31 Messages postés 7219 Statut Membre 1 204
     
    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
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. Polux31 Messages postés 7219 Statut Membre 1 204
     
    Bonjour,

    Est-ce que les textboxes contiennent déjà un contenu ?

    ;o)
    0
  6. Qual
     
    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.
    0
  7. Qual
     
    Ok merci beaucoup, je vais essayer ca de suite et je vous tiens au courant !

    Encore merci .,.
    0
  8. Qual
     
    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.
    0
    1. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      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.
      0
  9. Qual
     
    Vraiment désolé...

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

    En utilisant les index ?
    0
  10. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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.
    0
  11. Qual
     
    j'ai remplacer text1 par textbox1.text

    TextBox1.Text(i) = AR(R)

    Ce morceau me donne l'erreur :

    Property 'chars' is 'ReadOnly'.
    0
  12. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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)
    0
  13. Qual
     
    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.
    0
    1. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      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+
      0
  14. Qual
     
    No problème , je vais étudier les pistes que vous m'avez donné.

    Merci encore :p
    0
  15. Qual
     
    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 ._.
    0