Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [VB8]Aiuto per fixare funzione di controllo

    Ciao a tutti,
    sto facendo un piccolo software che mi randomizza lettere e numeri in delle label... ora vorrei eliminare i doppioni.... e pensavo utilizzare una funzione (che mi da dei problemi) che mi controllasse una ad una tutte le etichette... vi posto il codice per più facile comprensione:

    codice:
    Public Class frmMain
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Timer1.Enabled = True
            Timer1.Start()
    
    
        End Sub
    
    
        Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
            Timer1.Stop()
            Timer1.Enabled = False
            Timer2.Stop()
            Timer2.Enabled = False
    
        End Sub
    
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    
    
            lblA.Text = GenKey.rndLetters(1)
            lblB.Text = GenKey.rndLetters(1)
            lblC.Text = GenKey.rndLetters(1)
            lblD.Text = GenKey.rndLetters(1)
            lblE.Text = GenKey.rndLetters(1)
            lblF.Text = GenKey.rndLetters(1)
            lblG.Text = GenKey.rndLetters(1)
            lblH.Text = GenKey.rndLetters(1)
            lblI.Text = GenKey.rndLetters(1)
            lblL.Text = GenKey.rndLetters(1)
            lblM.Text = GenKey.rndLetters(1)
            lblN.Text = GenKey.rndLetters(1)
            lblO.Text = GenKey.rndLetters(1)
            lblP.Text = GenKey.rndLetters(1)
            lblQ.Text = GenKey.rndLetters(1)
            lblR.Text = GenKey.rndLetters(1)
            lblS.Text = GenKey.rndLetters(1)
            lblT.Text = GenKey.rndLetters(1)
            lblU.Text = GenKey.rndLetters(1)
            lblV.Text = GenKey.rndLetters(1)
            lblZ.Text = GenKey.rndLetters(1)
    
    
    
            lbl1.Text = GenKey.rndNumber(1)
            lbl2.Text = GenKey.rndNumber(1)
            lbl3.Text = GenKey.rndNumber(1)
            lbl4.Text = GenKey.rndNumber(1)
            lbl5.Text = GenKey.rndNumber(1)
            lbl6.Text = GenKey.rndNumber(1)
            lbl7.Text = GenKey.rndNumber(1)
            lbl8.Text = GenKey.rndNumber(1)
            lbl9.Text = GenKey.rndNumber(1)
            lbl10.Text = GenKey.rndNumber(1)
            lbl11.Text = GenKey.rndNumber(1)
            lbl12.Text = GenKey.rndNumber(1)
            lbl13.Text = GenKey.rndNumber(1)
            lbl14.Text = GenKey.rndNumber(1)
            lbl15.Text = GenKey.rndNumber(1)
            lbl16.Text = GenKey.rndNumber(1)
            lbl17.Text = GenKey.rndNumber(1)
            lbl18.Text = GenKey.rndNumber(1)
            lbl19.Text = GenKey.rndNumber(1)
            lbl20.Text = GenKey.rndNumber(1)
            lbl21.Text = GenKey.rndNumber(1)
    
            Timer2.Enabled = True
            Timer2.Start()
        End Sub
    
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            End
        End Sub
    
        Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
            controlla(lblA.Text)
        End Sub
    End Class
    codice:
    Module GenKey
    
        Public Function rndLetters(ByVal length As Integer) As String
    
            Dim sb As New System.Text.StringBuilder
            Dim chars() As String = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "L", _
                                     "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "Z"}
            Dim upperBound As Integer = UBound(chars)
    
            For x As Integer = 1 To length
                sb.Append(chars(Int(Rnd() * upperBound)))
            Next
    
            Return sb.ToString
    
        End Function
    
        Public Function rndNumber(ByVal length As Integer) As String
    
            Dim sb As New System.Text.StringBuilder
            Dim chars() As String = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", _
                                     "13", "14", "15", "16", "17", "18", "19", "20", "21"}
            Dim upperBound As Integer = UBound(chars)
    
            For x As Integer = 1 To length
                sb.Append(chars(Int(Rnd() * upperBound)))
            Next
    
            Return sb.ToString
        End Function
    
    'funzione che controlla l'array di etichette in funzione del testo generato...
        Public Function controlla(ByVal path As String) As Boolean
            Dim myArray() As String = {frmMain.lblA.Text, frmMain.lblB.Text, frmMain.lblC.Text, frmMain.lblD.Text, _
            frmMain.lblE.Text, frmMain.lblF.Text, frmMain.lblG.Text, frmMain.lblH.Text, frmMain.lblI.Text, _
            frmMain.lblL.Text, frmMain.lblM.Text, frmMain.lblN.Text, frmMain.lblO.Text, frmMain.lblP.Text, _
            frmMain.lblQ.Text, frmMain.lblR.Text, frmMain.lblS.Text, frmMain.lblT.Text, frmMain.lblU.Text, _
            frmMain.lblV.Text, frmMain.lblZ.Text}
            For Each path In myArray
                If String.Compare(path, myArray.ToString, 0, 2, True) = True Then
    
                    Return True
                    MsgBox(True)
                Else
                    Return False
                    MsgBox(False)
                End If
            Next
        End Function
    End Module
    grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2014
    residenza
    Vicenza
    Messaggi
    318
    Ok, ma se non dici che problemi hai come possiamo aiutarti ??

  3. #3
    Quote Originariamente inviata da SirJo Visualizza il messaggio
    Ok, ma se non dici che problemi hai come possiamo aiutarti ??
    Mi genera numeri o lettere doppie... in ogni label devo avere un numero o una lettera univoca ho risolto in parte creando questa funzione di controllo:

    codice:
        Public Function controlla(ByVal strA As String) As Boolean
            Dim strB As String
            Dim myArray() As String = {frmMain.lblA.Text, frmMain.lblB.Text, frmMain.lblC.Text, frmMain.lblD.Text, _
            frmMain.lblE.Text, frmMain.lblF.Text, frmMain.lblG.Text, frmMain.lblH.Text, frmMain.lblI.Text, _
            frmMain.lblL.Text, frmMain.lblM.Text, frmMain.lblN.Text, frmMain.lblO.Text, frmMain.lblP.Text, _
            frmMain.lblQ.Text, frmMain.lblR.Text, frmMain.lblS.Text, frmMain.lblT.Text, frmMain.lblU.Text, _
            frmMain.lblV.Text, frmMain.lblZ.Text}
            For Each strB In myArray
                If String.Compare(strA, strB, True) = True Then
                    MsgBox("so uguali")
                Else
                    MsgBox("diverse")
                End If
            Next
        End Function
    così mi trova i doppi ora dovrei fargli rigenerare solo quelli doppi.. mi puoi dare una mano?

    grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da kerberos5 Visualizza il messaggio
    Mi genera numeri o lettere doppie... in ogni label devo avere un numero o una lettera univoca ho risolto in parte creando questa funzione di controllo:

    codice:
        Public Function controlla(ByVal strA As String) As Boolean
            Dim strB As String
            Dim myArray() As String = {frmMain.lblA.Text, frmMain.lblB.Text, frmMain.lblC.Text, frmMain.lblD.Text, _
            frmMain.lblE.Text, frmMain.lblF.Text, frmMain.lblG.Text, frmMain.lblH.Text, frmMain.lblI.Text, _
            frmMain.lblL.Text, frmMain.lblM.Text, frmMain.lblN.Text, frmMain.lblO.Text, frmMain.lblP.Text, _
            frmMain.lblQ.Text, frmMain.lblR.Text, frmMain.lblS.Text, frmMain.lblT.Text, frmMain.lblU.Text, _
            frmMain.lblV.Text, frmMain.lblZ.Text}
            For Each strB In myArray
                If String.Compare(strA, strB, True) = True Then
                    MsgBox("so uguali")
                Else
                    MsgBox("diverse")
                End If
            Next
        End Function
    così mi trova i doppi ora dovrei fargli rigenerare solo quelli doppi.. mi puoi dare una mano?

    grazie
    Ciao
    A parte che hai scritto codice assolutamente ridondante.. Non sai che si può accede a ogni singolo controllo contenuto nel form con un index? Questo permette di ciclarli e fare le dovute operazioni senza scrivere tutto quel codice.
    Al di la di ciò, per evitare doppi dovresti fare la verifica man mano che crei la stringa random.
    Un modo potrebbe essere quello di creare un array con le lettere ad esempio, estrai un index, "peschi" una lettera dall'array e poi elimini quel item dall'array. In questo modo sarà impossibile che ti esca random di nuovo quella lettera.. Non so se mi sono spiegato.. Un po come con il sacchetto dei numeri della tombola. Estrazione casuale senza ripetizione..

  5. #5
    Quote Originariamente inviata da renygade Visualizza il messaggio
    Ciao
    A parte che hai scritto codice assolutamente ridondante.. Non sai che si può accede a ogni singolo controllo contenuto nel form con un index? Questo permette di ciclarli e fare le dovute operazioni senza scrivere tutto quel codice.
    Al di la di ciò, per evitare doppi dovresti fare la verifica man mano che crei la stringa random.
    Un modo potrebbe essere quello di creare un array con le lettere ad esempio, estrai un index, "peschi" una lettera dall'array e poi elimini quel item dall'array. In questo modo sarà impossibile che ti esca random di nuovo quella lettera.. Non so se mi sono spiegato.. Un po come con il sacchetto dei numeri della tombola. Estrazione casuale senza ripetizione..
    Navigando qui e li ho trovato la soluzione non era così banale! la funzione che segue sfrutta il principio del mazzo di carte!

    codice:
     Public Function rndNumber() As Integer
            Const N As Integer = 23 'ultimo numero generabile, intervallo (0...N)
            Static X(0 To N) As Integer 'il vettore con i numeri casuali
            Static pr As Integer 'l'indice progressivo del numero da restituire
            Dim i As Integer, j As Integer, s As Integer, v As Integer
    
            If pr = 0 Then
                'e' la prima chiamata o abbiamo esaurito i numeri: inizializziamo!
                For i = 1 To N
                    X(i) = i 'memorizziamo in X() i numeri, per ora in ordine...
                Next
                Randomize()
                For v = 1 To 3 'numero di "smazzate" per mischiare per bene
                    For i = 1 To N 'il numero d'ordine i lo scambiamo...
                        j = Int(Rnd() * (N + 1)) ' con quello j, scelto a caso
                        s = X(i)
                        X(i) = X(j)
                        X(j) = s
                    Next 'per tutti i numeri nel "mazzo"
                Next 'ripetiamo per il numero di "smazzate"
                'OK, ora i numeri sono in ordine "casuale"
                rndNumber = X(0) 'restituiamo il primo della lista
                pr = 1 'l'indice del prossimo da restituire
            Else
                'ci sono ancora numeri disponibili, semplicemente restituiamo quello d'indice pr
                rndNumber = X(pr)
                pr = pr + 1 'aggiorniamo l'indice
                If pr > N Then
                    'se abbiamo restituito l'ultimo, resettiamo pr per la successiva re-inizializzazione
                    pr = 0
                End If
            End If
        End Function
    P.S. Ora se volessi applicare la randomizzazione di 1 colore a delle label? mi spiego ho 20 label e randomicamente solo ad esempio 5 di queste devono colorarsi diversamente rispetto alle altre.... è fattibile?

    grazie

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da kerberos5 Visualizza il messaggio
    Navigando qui e li ho trovato la soluzione non era così banale! la funzione che segue sfrutta il principio del mazzo di carte!

    codice:
     Public Function rndNumber() As Integer
            Const N As Integer = 23 'ultimo numero generabile, intervallo (0...N)
            Static X(0 To N) As Integer 'il vettore con i numeri casuali
            Static pr As Integer 'l'indice progressivo del numero da restituire
            Dim i As Integer, j As Integer, s As Integer, v As Integer
    
            If pr = 0 Then
                'e' la prima chiamata o abbiamo esaurito i numeri: inizializziamo!
                For i = 1 To N
                    X(i) = i 'memorizziamo in X() i numeri, per ora in ordine...
                Next
                Randomize()
                For v = 1 To 3 'numero di "smazzate" per mischiare per bene
                    For i = 1 To N 'il numero d'ordine i lo scambiamo...
                        j = Int(Rnd() * (N + 1)) ' con quello j, scelto a caso
                        s = X(i)
                        X(i) = X(j)
                        X(j) = s
                    Next 'per tutti i numeri nel "mazzo"
                Next 'ripetiamo per il numero di "smazzate"
                'OK, ora i numeri sono in ordine "casuale"
                rndNumber = X(0) 'restituiamo il primo della lista
                pr = 1 'l'indice del prossimo da restituire
            Else
                'ci sono ancora numeri disponibili, semplicemente restituiamo quello d'indice pr
                rndNumber = X(pr)
                pr = pr + 1 'aggiorniamo l'indice
                If pr > N Then
                    'se abbiamo restituito l'ultimo, resettiamo pr per la successiva re-inizializzazione
                    pr = 0
                End If
            End If
        End Function
    P.S. Ora se volessi applicare la randomizzazione di 1 colore a delle label? mi spiego ho 20 label e randomicamente solo ad esempio 5 di queste devono colorarsi diversamente rispetto alle altre.... è fattibile?

    grazie
    Vabbè.. mazzo di carte o numeri della tombola, il principio è lo stesso...
    Tu puoi mescolare le carte e poi "estrarle" in ordine man mano oppure "estrarre" direttamente le carte in modo ramdom, avendo l'accortezza di togliere però la carta appena estratta. Questo modus operandi è migliore perché si applica anche ad altro, non solo ai numeri. Puoi estrarre a caso da un array di lettere o anche di colori usando lo stesso codice.
    Per i colori, chiedi se è fattibile.. certo. Qual'è la difficoltà? Selezionare le label? Impostare i colori? I colori random si possono ottenere banalmente estraendo 3 numeri compresi tra 0 e 255, che poi li usi per comporre un colore RGB... Per cambiare il colore, vedi backgroundcolor

  7. #7
    Asp! non devo randomizzare i colori devo randomizzare il numero delle label da colorare... mi sto impiccando... in pratica sono arrivato a questo....

    codice:
        Public Sub RandomColor()
            Const N As Integer = 23
            Static V(0 To N) As Integer 'vettore
            Dim numero As Integer
    
            Dim x() As Object = {lblA, lblB, lblC, lblD, _
            lblE, lblF, lblG, lblH, lblI, _
            lblL, lblM, lblN, lblO, lblP, _
            lblQ, lblR, lblS, lblT, lblU, _
            lblV, lblW, lblX, lblY, lblZ}
    
            numero = 1 <= V(N)
            For q As Integer = 0 To numero
                x(q).ForeColor = Color.Red
            Next q
    
        End Sub
    Ma si colora di rosso sola la prima! io vorrei che scegliesse 5 etichette in maniera casuale e le colorasse di rosso.. O_0'

    sto cercando spundo da qui

    grazie 1000
    Ultima modifica di kerberos5; 10-10-2014 a 12:35 Motivo: correzione concetto

  8. #8
    Sono riuscito!
    posto la funzione per completezza... magari può tornare utile ad altri!!!

    codice:
        Public Sub RandomColor()
    
            Dim x() As Object = {lblA, lblB, lblC, lblD, _
            lblE, lblF, lblG, lblH, lblI, _
            lblL, lblM, lblN, lblO, lblP, _
            lblQ, lblR, lblS, lblT, lblU, _
            lblV, lblW, lblX, lblY, lblZ}
    
            For i = 0 To 2
                ' Generate random value between 1 and 23.
                Randomize()
                Dim value As Integer = CInt(Int((23 * Rnd()) + 1))
                x(value).ForeColor = Color.Red
            Next i
            
        End Sub

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    237
    Quote Originariamente inviata da kerberos5 Visualizza il messaggio
    Sono riuscito!
    posto la funzione per completezza... magari può tornare utile ad altri!!!

    codice:
        Public Sub RandomColor()
    
            Dim x() As Object = {lblA, lblB, lblC, lblD, _
            lblE, lblF, lblG, lblH, lblI, _
            lblL, lblM, lblN, lblO, lblP, _
            lblQ, lblR, lblS, lblT, lblU, _
            lblV, lblW, lblX, lblY, lblZ}
    
            For i = 0 To 2
                ' Generate random value between 1 and 23.
                Randomize()
                Dim value As Integer = CInt(Int((23 * Rnd()) + 1))
                x(value).ForeColor = Color.Red
            Next i
            
        End Sub
    Come ti ho già detto, con VB.NET si può accedere ai controlli usando un index perché ogni controllo fa parte della collezione controls, array esposto dal form che li contiene.
    Puoi fare ad esempio:
    codice:
    For Each c As Control In Me.Controls
        If c.GetType Is GetType(TextBox) Then
            ' Do something
        End If
    Next
    Inoltre, attento al codice che hai scritto, perché può essere che estrae 2 volte la stessa laber e te la colora di rosso solo 1...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.