VB Melanger des textboxs

Résolu/Fermé
Qual - 2 mai 2010 à 02:37
 Qual - 3 mai 2010 à 14:49
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 ?


A voir également:

15 réponses

Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
2 mai 2010 à 20:54
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
2 mai 2010 à 23:41
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
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
3 mai 2010 à 10:13
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
up :/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Polux31 Messages postés 6917 Date d'inscription mardi 25 septembre 2007 Statut Membre Dernière intervention 1 novembre 2016 1 204
2 mai 2010 à 19:48
Bonjour,

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

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

Encore merci .,.
0
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
3 mai 2010 à 00:46
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
Vraiment désolé...


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

En utilisant les index ?
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
3 mai 2010 à 00:57
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
j'ai remplacer text1 par textbox1.text

TextBox1.Text(i) = AR(R)

Ce morceau me donne l'erreur :

Property 'chars' is 'ReadOnly'.
0
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
Modifié par lermite222 le 3/05/2010 à 01:13
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
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
lermite222 Messages postés 8702 Date d'inscription dimanche 8 avril 2007 Statut Contributeur Dernière intervention 22 janvier 2020 1 190
3 mai 2010 à 01:55
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
No problème , je vais étudier les pistes que vous m'avez donné.

Merci encore :p
0
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