Novità

Mente da programmatore

Per quanto riguarda me ho creato l'user controll con 12 Checkbox da runtime. Ed il risultato è il seguente :

UserControll.png

Per quanto riguarda l'implementazione di codice è la seguente:

Codice:
Public Class cltSelRuote
    Private Check() As CheckBox
    Private nCheck As Integer = 12
    Private RetRuote() As Integer
    Private mRetNumeri As Integer
    Private mRetNumeriBool As Integer
    Private RetRuoteBool() As Integer
    Public Property nRetNumeri() As Integer
        Get
            Return mRetNumeri
        End Get
        Set(value As Integer)

        End Set
    End Property

    Public Property ArrayRuote(ByVal Index As Integer) As Integer
        Get
            Return RetRuote(Index)
        End Get
        Set(ByVal value As Integer)

        End Set
    End Property
    Public Property nRetNumeriBool() As Integer
        Get
            Return mRetNumeriBool
        End Get
        Set(value As Integer)

        End Set
    End Property

    Public Property ArrayRuoteBool(ByVal Index As Integer) As Boolean
        Get
            Return RetRuoteBool(Index)
        End Get
        Set(ByVal value As Boolean)

        End Set
    End Property

    Private Sub cltSelRuote_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        LoadCampi()
    End Sub

    Sub LoadCampi()
        Dim i As Integer
        Dim nX As Integer, nY As Integer
        Dim nHTxt As Integer = 15, nWTxt As Integer = 25
        Dim Altezza As Integer = 21, Larghezza As Integer = 35
        Dim nLeft As Integer = 10
        ReDim Check(nCheck)
        nX = 0
        nY = 0
        For r As Integer = 1 To nCheck
            i += 1
            Check(i) = New CheckBox
            With Check(i)
                .AutoSize = False
                .Checked = False
                .Left = nX
                .Top = nY
                .Width = Larghezza
                .Height = Altezza
                .TextAlign = ContentAlignment.MiddleCenter
                .Appearance = Appearance.Button
                .Text = NomiRuote(i).NomeAbbreviato
                Me.Controls.Add(Check(i))
                AddHandler Check(i).CheckStateChanged, AddressOf Gestione_CheckstateChanged
                .Visible = True
            End With
            nX = nX + Larghezza
        Next

    End Sub
    Private Sub Gestione_CheckstateChanged(sender As Object, e As EventArgs)

        mRetNumeri = GetRuoteSelezionate(RetRuote)
        mRetNumeriBool = GetRuoteSelezionate(RetRuoteBool)
    End Sub

    Function GetRuoteSelezionate(ByRef aRetRuote() As Integer) As Integer

        Dim n As Integer
        Dim m As Integer
        For i As Integer = 1 To nCheck
            n += 1
            If Check(i).Checked = True Then
                m += 1
                ReDim Preserve aRetRuote(i)
                aRetRuote(m) = n
            End If
        Next
        Return m
    End Function

    Function GetRuoteSelezionate(ByRef aRetRuote() As Boolean) As Integer
        Dim n As Integer
        Dim m As Integer
        ReDim aRetRuote(nCheck)
        For x As Integer = 1 To nCheck
            aRetRuote(x) = False
        Next
        For i As Integer = 1 To nCheck
            If Check(i).Checked = True Then
                m += 1
                ReDim Preserve aRetRuote(i)
                aRetRuote(i) = True
            End If
        Next
        Return m
    End Function
End Class

Procedo nel modo corretto?
 
aalcune cose vanno bne altre no

la creazione a runtime dei controlli va bene.
per ora leva tutte quelle proprietà che hai messo , ci devono essere solo 2 funzioni

GetArrayRuote (byref aRuote() as integer)
GetArrayRuote (byref aRuote() as boolean)

in ambedue le funzioni cicli sull'array delel chekbox e se la proprietà checked della checkbox X è true procedi o ad accodare ad un array integer il numero della ruota , o a valorizzare l'elemento ruota dell'array boolean a true.
In tuttti i casi incrementi una variabile che conta quante ruote sono state selezionate che userai per dare i lvalore di ritorno.


questa funzione è sbagliata , rifalla come ti ho detto io che è pure piu facile
Codice:
 Function GetRuoteSelezionate(ByRef aRetRuote() As Boolean) As Integer
        Dim n As Integer
        Dim m As Integer
        ReDim aRetRuote(nCheck)
        For x As Integer = 1 To nCheck
            aRetRuote(x) = False
        Next
        For i As Integer = 1 To nCheck
            If Check(i).Checked = True Then
                m += 1
                ReDim Preserve aRetRuote(i)
                aRetRuote(i) = True
            End If
        Next
        Return m
    End Function
 
fatte queste 2 funzioni ne devi fare altre 2

sub SetRuoteSelezionate (aRuote() as integer)
sub SetRuoteSelezionate (aRuote() as boolean)


come si capisce dai nomi a queste funzioni arriva in input un array che puo essere integer o boolean , ciascuna delle due sub deve settare le ruote in funzione del contenuto dell'array.
 
Ora se ho capito bene la situazione dovrebbe essere questa:

Codice:
    Function GetRuoteSelezionate(ByRef aRetRuote() As Integer) As Integer
        Dim i As Integer
        For x As Integer = 1 To nCheck
            If Check(x).Checked = True Then
                i += 1
                ReDim Preserve aRetRuote(x)
                aRetRuote(x) = x
            End If
        Next
        Return i
    End Function

    Function GetRuoteSelezionate(ByRef aRetRuote() As Boolean) As Integer
        Dim i As Integer
        For x As Integer = 1 To nCheck
            If Check(x).Checked = True Then
                i += 1
                ReDim Preserve aRetRuote(x)
                aRetRuote(x) = True
            End If
        Next
        Return i
    End Function

    Sub SetRuoteSelezionate(aRuote() As Integer)
        For x As Integer = 1 To aRuote.Length
            NomiRuote(x).Nome = aRuote(x)
        Next
    End Sub

    Sub SetRuoteSelezionate(aRuote() As Boolean)
        For x As Integer = 1 To aRuote.Length
            NomiRuote(x).Nome = aRuote(x)
        Next
    End Sub
 
ciao Edoardo , le prime 2 vanno quasi bene , le seconde no mica devi alorizzare i nomi delel ruote bensi la proprietà chek delle chekbox quando la ruota è presente nerll'array che viene passato alla funzione.

Andiamo con ordine
prima funzione

Codice:
Function GetRuoteSelezionate(ByRef aRetRuote() As Integer) As Integer
        Dim i As Integer
ReDim  aRetRuote (12) ' dimensiono al massimo possibile
        For x As Integer = 1 To nCheck
            If Check(x).Checked = True Then
                i += 1
            
                'aRetRuote(x) = x 'errato
                aRetRuote(i) = x   ' giusto
            End If
        Next
         ReDim Preserve aRetRuote(i) ' ridimensiono al numero di ruote trovate
        Return i
    End Function

seconda funzione
Codice:
    Function GetRuoteSelezionate(ByRef aRetRuote() As Boolean) As Integer
        Dim i As Integer
ReDim  aRetRuote (12) ' dimensiono al massimo possibile
        For x As Integer = 1 To nCheck
            If Check(x).Checked = True Then
                i += 1
              
                aRetRuote(x) = True
            End If
        Next
        Return i
    End Function

terza funzione

Codice:
Sub SetRuoteSelezionate(aRuote() As Integer)
        For x As Integer = 1 To aRuote.Length
           Check (aRuote(x)).checked  = true
        Next
    End Sub

quarta funzione

Codice:
Sub SetRuoteSelezionate(aRuote() As boolean)
        For x As Integer = 1 To aRuote.Length
           Check (x) .checked = aRuote(x)
        Next
    End Sub
 
il prossimo problema consiste nel registrare le ruote selezionate per potere reimpostare quando riapriamo il programma.
dobbiamo aggiungere un nuovo campo al tipo enumerato che gestisce i valori di configrazione
Poi però abbiamo un problema noi inseriamo un nuovo campo ma i valori da registrare sono 12 perche dobbiamo sempre registrare l ostato di tutte e 12 le check box.
Nel tuo modulo funzioni devi creare 2 funzioni una che prendendo in input un array di boolean torna una stringa composta da 0 e da 1
un 'altra che viceversa prendendo una stringa composta da 0 e 1 torna un array di boolean

Codice:
function ArrayBToStringa01 ( aB() as boolean ) as string
end function

function Stringa01ToArrayB ( s as string ) as boolean ()
end function


quando vorray scrivere nel file ini il valore delel ruote userai la prima , quando lo vorrai reimpostare leggerai la stringa dal file ini e con la seconda funzione otterrai un array di boolean da passare all'apposita funzioen del controllo range


vai procediamo ...
 
Quindi :

Codice:
    Public Enum eValoriAppConfig
        Archivio
        RangeInizio
        Rangefine
        chkRuoteSel '<==========
    End Enum

Codice:
    Function ArrayBToStringa01(aB() As Boolean) As String
        Dim SB As New StringBuilder
        ReDim aB(12)
        For r As Integer = 1 To 12
            If aB(r) = True Then
                SB.Append("1")
                SB.Append(".")
            Else
                SB.Append("0")
                SB.Append(".")
            End If
        Next
        SB.Remove(SB.Length - 1, 1)
        Return SB.ToString
    End Function

    Function Stringa01ToArrayB(s As String) As Boolean()
        Dim str() As String
        Dim aB() As Boolean
        Dim i As Integer
        ReDim aB(12)
        str = Split(s, ".")
        For r = 1 To str.Length
            i += 1
            If str(r) = 1 Then
                aB(r) = True
            Else
                aB(r) = False
            End If
        Next
        ReDim Preserve aB(i)
        Return aB
    End Function
 
senza mettere il separatore non è necessario , se abbiamo valori 0/1 ogni carattere gia indica la posizione di quel valore

deve uscire una stringa di 12 caratteri composti da 0 e 1

deve tornare un array boolean dimensionato alla lunghezza della stringa ( che poi all'atto pratico sarà 12) che abbia true se trova un 1 , false se trova uno 0
 
ah ok:

Codice:
    Function ArrayBToStringa01(aB() As Boolean) As String
        Dim SB As New StringBuilder
        ReDim aB(12)
        For r As Integer = 1 To 12
            If aB(r) = True Then
                SB.Append("1")
            Else
                SB.Append("0")
            End If
        Next
        Return SB.ToString
    End Function
 
attenzione .. cerca sempre di capire quell oche fai e che effetto hanno le istruzioni , alla funzione arriva un array che fai prima di leggerlo lo svuoti con redim ?
 
Ora mi beccherò un ca**iatone enorme ahaha ma se ho capito allora diventa cosi:

Codice:
    Function ArrayBToStringa01(aB() As Boolean) As String
        Dim SB As New StringBuilder
        For r As Integer = 1 To aB.Length
            If aB(r) = True Then
                SB.Append("1")
            Else
                SB.Append("0")
            End If
        Next
        Return SB.ToString
    End Function

    Function Stringa01ToArrayB(s As String) As Boolean()
        Dim str As String
        Dim aB() As Boolean
        Dim i As Integer
        ReDim aB(12)
        For r As Integer = 1 To s.Length
            i += 1
            str = s.Substring(r, 1)
            If Val(str) = 1 Then
                aB(r) = True
            Else
                aB(r) = False
            End If
        Next
        ReDim Preserve aB(i)
        Return aB
    End Function
 
la prima sembra perfetta , la seconda ha dei problemini

intanto non serve usare il contatore i perche hai gia r
poi devi testare se il carattere è uguale a "0" oppure uguale ad "1" come stringa
l'array lo so che all'atto pratico ha 12 elementi ma la funzione deve lavorare a prescindere quindi dimensionalo alla lunghezza della stringa e non c'è bisogno del preserve
 
il messaggio sopra è vuoto , comunque appena hai fatto e sei riuscito a gestire il salvataggio delle ruote selezionate e la loro successiva reimpostazione posta il progetto
 
Codice:
    Function Stringa01ToArrayB(s As String) As Boolean()
        Dim str As String
        Dim aB() As Boolean
        ReDim aB(s.Count - 1)
        For r As Integer = 0 To s.Length - 1
            str = s.Substring(r, 1)
            If str = "1" Then
                aB(r) = True
            Else
                aB(r) = False
            End If
        Next
        Return aB
    End Function
 
si solo che devi andare da 1 a 12

ReDim aB(s.length)
Ho pensato di implementare salvataggio e acquisizione impostazioni in questo modo :

Codice:
Imports System.Windows.Forms

Public Class frmSchermataPrincipale
    Private Sub frmSchermataPrincipale_Load(sender As Object, e As EventArgs) Handles Me.Load

        AggiornaStato()
        CtlRangeEstrazioni1.Inizio = ConvertToInt(GetValoreCfg(eValoriAppConfig.RangeInizio))
        CtlRangeEstrazioni1.Fine = ConvertToInt(GetValoreCfg(eValoriAppConfig.Rangefine))

        CltSelRuote1.SetRuoteSelezionate(Stringa01ToArrayB(GetValoreCfg(eValoriAppConfig.chkRuoteSel)))
    End Sub
    Sub SalvaParametriCfg()
        Dim aRetRuote() As Boolean
        SalvaValoreCfg(eValoriAppConfig.RangeInizio, (CtlRangeEstrazioni1.Inizio).ToString)
        SalvaValoreCfg(eValoriAppConfig.Rangefine, (CtlRangeEstrazioni1.Fine).ToString)
        CltSelRuote1.GetRuoteSelezionate(aRetRuote)
        SalvaValoreCfg(eValoriAppConfig.chkRuoteSel, ArrayBToStringa01(aRetRuote))
    End Sub
    Sub AggiornaStato()
        CtlRangeEstrazioni1.Inizio = 1
        CtlRangeEstrazioni1.Fine = ConvertToInt(cArchivio.QuantitaEstrazioni)
        CtlRangeEstrazioni1.Estrazionitotali = ConvertToInt(cArchivio.QuantitaEstrazioni)
        If ConvertToInt(GetValoreCfg(eValoriAppConfig.RangeInizio)) = 0 And ConvertToInt(GetValoreCfg(eValoriAppConfig.Rangefine)) = 0 Then
            SalvaValoreCfg(eValoriAppConfig.RangeInizio, "1")
            SalvaValoreCfg(eValoriAppConfig.Rangefine, cArchivio.QuantitaEstrazioni.ToString)
        End If
        If GetValoreCfg(eValoriAppConfig.chkRuoteSel) = "" Then
            SalvaValoreCfg(eValoriAppConfig.chkRuoteSel, "00000000000")
        End If
    End Sub

    Private Sub frmSchermataPrincipale_Closed(sender As Object, e As EventArgs) Handles Me.Closed
        SalvaParametriCfg()
    End Sub
    Private Sub BrowserEstrazioniToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles BrowserEstrazioniToolStripMenuItem.Click

        Dim frm As New frmBroserEstr
        frm.MdiParent = Me
        frm.Show()

    End Sub

    Private Sub CtlRangeEstrazioni1_OnScegliValoreInizio() Handles CtlRangeEstrazioni1.OnScegliValoreInizio


        Dim frm As New frmSelLimRange
        With frm


            .ScrollBarInizio.Minimum = 1
            .ScrollBarInizio.Maximum = ConvertToInt(cArchivio.QuantitaEstrazioni)

            .ScrollBarFine.Minimum = 1
            .ScrollBarFine.Maximum = ConvertToInt(cArchivio.QuantitaEstrazioni)


            .ScrollBarFine.Value = CtlRangeEstrazioni1.Fine
            .ScrollBarInizio.Value = CtlRangeEstrazioni1.Inizio


            .ShowDialog()
            If frm.Tag = "OK" Then
                CtlRangeEstrazioni1.Inizio = .ScrollBarInizio.Value
                CtlRangeEstrazioni1.Fine = .ScrollBarFine.Value
            End If
            .Close()
            .Dispose()
        End With

    End Sub

    Private Sub CtlRangeEstrazioni1_OnScegliValoreFine() Handles CtlRangeEstrazioni1.OnScegliValoreFine


        Dim frm As New frmSelLimRange
        With frm


            .ScrollBarInizio.Minimum = 1
            .ScrollBarInizio.Maximum = ConvertToInt(cArchivio.QuantitaEstrazioni)

            .ScrollBarFine.Minimum = 1
            .ScrollBarFine.Maximum = ConvertToInt(cArchivio.QuantitaEstrazioni)


            .ScrollBarFine.Value = CtlRangeEstrazioni1.Fine
            .ScrollBarInizio.Value = CtlRangeEstrazioni1.Inizio


            .ShowDialog()
            If frm.Tag = "OK" Then
                CtlRangeEstrazioni1.Inizio = .ScrollBarInizio.Value
                CtlRangeEstrazioni1.Fine = .ScrollBarFine.Value
            End If
            .Close()
            .Dispose()
        End With
    End Sub

End Class

All'interno dell'usercontro la situazione è la seguente :
Codice:
Public Class cltSelRuote
    Private Check() As CheckBox
    Private Const nCheck As Integer = 12

    Private Sub cltSelRuote_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        LoadCampi()
    End Sub

    Sub LoadCampi()
        Dim i As Integer
        Dim nX As Integer, nY As Integer
        Dim nHTxt As Integer = 15, nWTxt As Integer = 25
        Dim Altezza As Integer = 21, Larghezza As Integer = 35
        Dim nLeft As Integer = 10
        ReDim Check(nCheck)
        nX = 0
        nY = 0
        For r As Integer = 1 To nCheck
            i += 1
            Check(i) = New CheckBox
            With Check(i)
                .AutoSize = False
                .Checked = False
                .Left = nX
                .Top = nY
                .Width = Larghezza
                .Height = Altezza
                .TextAlign = ContentAlignment.MiddleCenter
                .Appearance = Appearance.Button
                .Text = NomiRuote(i).NomeAbbreviato
                Me.Controls.Add(Check(i))
                AddHandler Check(i).CheckStateChanged, AddressOf Gestione_CheckstateChanged
                .Visible = True
            End With
            nX = nX + Larghezza
        Next

    End Sub
    Private Sub Gestione_CheckstateChanged(sender As Object, e As EventArgs)

    End Sub

    Function GetRuoteSelezionate(ByRef aRetRuote() As Integer) As Integer
        Dim i As Integer
        ReDim aRetRuote(nCheck) ' dimensiono al massimo possibile
        For x As Integer = 1 To nCheck
            If Check(x).Checked = True Then
                i += 1
                aRetRuote(i) = x   ' giusto
            End If
        Next
        ReDim Preserve aRetRuote(i) ' ridimensiono al numero di ruote trovate
        Return i
    End Function

    Function GetRuoteSelezionate(ByRef aRetRuote() As Boolean) As Integer
        Dim i As Integer
        ReDim aRetRuote(nCheck) ' dimensiono al massimo possibile
        For x As Integer = 1 To nCheck
            If Check(x).Checked = True Then
                i += 1
                aRetRuote(x) = True
            End If
        Next
        Return i
    End Function

    Sub SetRuoteSelezionate(aRuote() As Integer)
        For x As Integer = 1 To aRuote.Length
            Check(aRuote(x)).Checked = True
        Next
    End Sub
    Sub SetRuoteSelezionate(aRuote() As Boolean)
        For x As Integer = 1 To aRuote.Length
            Check(x).Checked = aRuote(x)
        Next
    End Sub
End Class

in modfunzioni cosi :

Codice:
    Function ArrayBToStringa01(aB() As Boolean) As String
        Dim SB As New StringBuilder
        For r As Integer = 1 To aB.Length
            If aB(r) = True Then
                SB.Append("1")
            Else
                SB.Append("0")
            End If
        Next
        Return SB.ToString
    End Function

    Function Stringa01ToArrayB(s As String) As Boolean()
        Dim str As String
        Dim aB() As Boolean
        ReDim aB(s.Length)
        For r As Integer = 0 To s.Length - 1
            str = s.Substring(r, 1)
            If str = "1" Then
                aB(r) = True
            Else
                aB(r) = False
            End If
        Next
        Return aB
    End Function

ma all'uscita di "Stringa01ToArrayB" il valore di aB è 13 e quindi quanto passato a "SetRuoteSelezionate" l'indice supera il limiti dell'array
 

Ultima estrazione Lotto

  • Estrazione del lotto
    sabato 11 gennaio 2025
    Bari
    73
    43
    01
    58
    81
    Cagliari
    69
    60
    18
    02
    10
    Firenze
    25
    32
    18
    55
    54
    Genova
    48
    05
    40
    34
    69
    Milano
    10
    07
    70
    44
    79
    Napoli
    11
    89
    01
    34
    80
    Palermo
    37
    80
    82
    44
    77
    Roma
    78
    04
    38
    39
    56
    Torino
    08
    13
    30
    27
    24
    Venezia
    56
    75
    36
    18
    70
    Nazionale
    63
    83
    19
    31
    80
    Estrazione Simbolotto
    Bari
    35
    34
    12
    23
    20
Indietro
Alto