Novità

Mente da programmatore

Fatto

Codice:
Public Class cltSelRuote
    Private Check() As clsChekBoxModificata
    Private Const nCheck As Integer = 12
    Private mBackColorNormale As Color = SystemColors.Control
    Private mBackColorSelected As Color = Color.Red
    Private mForeColorNormale As Color = SystemColors.WindowText
    Private mForeColorSelected As Color = Color.White
    Public Property BackColorNormale As Color
        Get
            Return mBackColorNormale
        End Get
        Set(value As Color)
            mBackColorNormale = value
        End Set
    End Property
    Public Property BackColorSelected As Color
        Get
            Return mBackColorSelected
        End Get
        Set(value As Color)
            mBackColorSelected = value
        End Set
    End Property

    Public Property ForeColorNormale As Color
        Get
            Return mForeColorNormale
        End Get
        Set(value As Color)
            mForeColorNormale = value
        End Set
    End Property

    Public Property ForeColorSelected As Color
        Get
            Return mForeColorSelected
        End Get
        Set(value As Color)
            mForeColorSelected = value
        End Set
    End Property

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

    Sub LoadCampi()

        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
        Dim aRuote() = {"", "Ba", "Ca", "Fi", "Ge", "Mi", "Na", "Pa", "Rm", "To", "Ve", "Nz", "TT"}
        Me.Controls.Clear()
        For r As Integer = 1 To nCheck
            Check(r) = New clsChekBoxModificata
            With Check(r)
                .AutoSize = False
                .Checked = False
                .Left = nX
                .Top = nY
                .Width = Larghezza
                .Height = Altezza
                .BackColorSelected = mBackColorSelected
                .ForeColorSelected = ForeColorSelected
                .ForeColorNormale = mForeColorNormale
                .TextAlign = ContentAlignment.MiddleCenter
                .Appearance = Appearance.Button
                .Text = aRuote(r)
                Me.Controls.Add(Check(r))
                AddHandler Check(r).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 UBound(aRuote)
            Check(aRuote(x)).Checked = True
        Next
    End Sub
    Sub SetRuoteSelezionate(aRuote() As Boolean)
        For x As Integer = 1 To UBound(aRuote)
            Check(x).Checked = aRuote(x)
        Next
    End Sub
End Class
 
buongiorno Edoardo , manca una proprietà erano 4

.BackColorSelected = mBackColorSelected
.ForeColorSelected = ForeColorSelected
.ForeColorNormale = mForeColorNormale

poi attento a non confonderti con la proprieta e la sua variabile associata , come mai non c'è la m sulla seconda ?


appena ti è possibile scarica questo file ci sono 2 controlli che ho fatto io per l'occorrenza, uno è un pannello che serve per selezionare i numeri , l'altra una combobox speciale che consente di selezionare i colori.
Come al solito importa le 2 rispettive classi nei tuoi sorgenti e senza fare nulla manda in run cosi verranno compilate e si potranno usare, dopo di che avvertimi.

 
all'interno delle proprieta che poi coinvolgono le checkbox, quando fa l'assegnazione devi rilanciare la funzione loadcampi , in modo che se cambi il colore quelle vengono ricaricate col colore giusto
 
all'interno delle proprieta che poi coinvolgono le checkbox, quando fa l'assegnazione devi rilanciare la funzione loadcampi , in modo che se cambi il colore quelle vengono ricaricate col colore giusto
Fatto

Codice:
Public Class cltSelRuote
    Private Check() As clsChekBoxModificata
    Private Const nCheck As Integer = 12
    Private mBackColorNormale As Color = SystemColors.Control
    Private mBackColorSelected As Color = Color.Red
    Private mForeColorNormale As Color = SystemColors.WindowText
    Private mForeColorSelected As Color = Color.White
    Public Property BackColorNormale As Color
        Get
            Return mBackColorNormale
        End Get
        Set(value As Color)
            mBackColorNormale = value
            LoadCampi()
        End Set
    End Property
    Public Property BackColorSelected As Color
        Get
            Return mBackColorSelected
        End Get
        Set(value As Color)
            mBackColorSelected = value
            LoadCampi()
        End Set
    End Property

    Public Property ForeColorNormale As Color
        Get
            Return mForeColorNormale
        End Get
        Set(value As Color)
            mForeColorNormale = value
            LoadCampi()
        End Set
    End Property

    Public Property ForeColorSelected As Color
        Get
            Return mForeColorSelected
        End Get
        Set(value As Color)
            mForeColorSelected = value
            LoadCampi()
        End Set
    End Property

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

    Sub LoadCampi()

        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
        Dim aRuote() = {"", "Ba", "Ca", "Fi", "Ge", "Mi", "Na", "Pa", "Rm", "To", "Ve", "Nz", "TT"}
        Me.Controls.Clear()
        For r As Integer = 1 To nCheck
            Check(r) = New clsChekBoxModificata
            With Check(r)
                .AutoSize = False
                .Checked = False
                .Left = nX
                .Top = nY
                .Width = Larghezza
                .Height = Altezza
                .ForeColorNormale = mForeColorNormale
                .BackColorNormale = mBackColorNormale
                .BackColorSelected = mBackColorSelected
                .ForeColorSelected = mForeColorSelected
                .TextAlign = ContentAlignment.MiddleCenter
                .Appearance = Appearance.Button
                .Text = aRuote(r)
                Me.Controls.Add(Check(r))
                AddHandler Check(r).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 UBound(aRuote)
            Check(aRuote(x)).Checked = True
        Next
    End Sub
    Sub SetRuoteSelezionate(aRuote() As Boolean)
        For x As Integer = 1 To UBound(aRuote)
            Check(x).Checked = aRuote(x)
        Next
    End Sub
End Class

E controlli importati con successo :)
 
ok , allora ora dedichiamooci alla finestra ozioni cosi possiamo impostare il colore da dare ai numeri quando ci servira.

aggiungi un menu opzioni nel form mdi
aggiungi un form opzioni
sul form opzioni metti un tabcontrol e sulla prima scheda vai a posizionare il controllo ctlSelezionaNumeri
a questo tramite le proprieta impostaa false la proprietà AttivaSelezione , perche in questo caso i lcontrollo ci servira non per selezionare i numeri ma per gestirne il colore di sfondo e del font.

deve uscire un form tipo questo , naturalmente il mio è un abozzo tu lo devi fare piu bello

1636362830982.png


a questo punto bisogna gestire il colore dei singoli numeri e lo faremo tramite l'evento

CtlSelezionaNumeri1_OnCheckDoubleClick (num)

in questo evento viene ricevuto un parametro che contien il numero su cui si è fatto doppio click
sicche tu fara iapparire una nuova form in modo modale che consentira di selezionare i colori di sfondo e di font per quel numero

una form simile a questa

1636362990993.png

ora nella sub new della form aggiungi dei parametri in modo che quando il form verra creato potra preimpostarsi sui colori attuali

Codice:
Sub New(v As String, backColor As Color, foreColor As Color)


nella routine New a questo punto dovrai preimpostare le proprieta backcolor e fore color della label , la proprietà text con V
e selezionare i colori nelle combo in funzione dei colori attuali

la proprieta delal combo per selezioanre il colore è CmbColorPicker1.ColoreSel = colore

con il solito giochetto di scrivere "ok" nel tag del form quando si preme ok e poi nasconderlo tornera il controllo alla routine che stavi scrivendo e da sove hai aperto il form. a Questo punto potrai impostare le proprieta per quel numero con

Codice:
Me.CtlSelezionaNumeri1.SetColore(Num, frm.CmbColorPicker1.ColoreSel, frm.CmbColorPicker2.ColoreSel)

e chiudere il form con il metodo dispose.

fatto quest oaggiungi 4 membri al tipo enumerato del file di configurazione
SfondoColoreNumeri
ForeColorNumeri
SfondoColoreNumEvidenziato
ForeColorNumEvidenziato


poi vedremo come si fa per registrare questi valori
 
Bene, considerando che sarebbe troppo tortuoso pubblicare tutte le variazioni, posto il progetto con le aggiunte

 
ok ,anche se al momento non ho controllato mi fido.
A questo punto bisogna fare in modo che i colori impostati per i numeri vangano registrati nel file di configurazione.
dobbiamo registrare il colore sfondo e del carattere per 90 numeri , e dobbiamo registrare il colore sfondo e del carattere per i numeri selezionati.
al form load del form opzioni dovrai impostare le proprieta leggendole dal file ini , al form closing invece dovrai salvarle

per quanto riguarda i colori dei 90 numeri potrai ricevere la stringa da salvare nel file ini usando l'apposita funzione sel controllo.
Ti viene una riga simile

CtlSelezionaNumeri1.SetBackColorFromStringaColoriWin32(GetValoreCfg(eValoriAppConfig.BackColorNumeri))
CtlSelezionaNumeri1.SetForeColorFromStringaColoriWin32(GetValoreCfg(eValoriAppConfig.ForeColorNumeri))

per impostare le due combo per il colore dei numeri evidenziati invece userai la proprieta .NomeColoreSel

ti viene fuori una riga simile

CmbColorPicker1.NomeColoreSel = GetValoreCfg(eValoriAppConfig.ColoreSfondoNumEvidenziati)


per il salvataggio invece

userai la funzione CtlSelezionaNumeri1.GetStringaBackColorWin32()
e ti viene una riga simile
Call SalvaValoreCfg(eValoriAppConfig.BackColorNumeri, CtlSelezionaNumeri1.GetStringaBackColorWin32())

per il salvataggio dei colori delle 2 combo invece usa la stessa proprieta di prima che hai usato epr leggerla


fai le provee vedi se chiudendo il programam i colorisi reimpostano
 
Fatto. Il salvataggio funziona correttamente ma c'è un piccolo bug di poco conto. Al caricamento delle impostazione nel load del form va tutto perfettamente ma scompaiono i numeri nella griglia del controllo sel numeri.

 
il motivo è semplice , quando vai ad impostare le proprieta gli passi lo stesso colore

1636390954094.png
 
quando esegui questo
1636391292329.png




non devi passare i colori delle combo ma i colori del numero , le combo servono per gestire i colori del numero selezioanto


1636391479674.png
 
cancella il file ini senno si ricorda le impostazioni sbagliate di prima e non funziona


inoltre nel form selColore quando cambi i colori nelle combo cambiali pure alla label che mostra l'anteprima
 
ok quindi :

Codice:
Public Class frmOpzioni
    Private Sub frmOpzioni_Load(sender As Object, e As EventArgs) Handles Me.Load
        CtlSelezionaNumeri1.SetBackColorFromStringaColoriWin32(GetValoreCfg(eValoriAppConfig.SfondoColoreNumeri))
        CtlSelezionaNumeri1.SetForeColorFromStringaColoriWin32(GetValoreCfg(eValoriAppConfig.ForeColorNumeri))
        Colore1.NomeColoreSel = GetValoreCfg(eValoriAppConfig.SfondoColoreNumEvidenziato)
        colore2.NomeColoreSel = GetValoreCfg(eValoriAppConfig.ForeColorNumEvidenziato)
    End Sub

    Private Sub CtlSelezionaNumeri1_OnCheckDoubleClick(Num As Integer) Handles CtlSelezionaNumeri1.OnCheckDoubleClick
        Dim b As Color, f As Color
        CtlSelezionaNumeri1.GetColore(Num, b, f)
        Dim frm As New frmSelColore(Num, b, f)
        frm.ShowDialog()
        If frm.Tag = "OK" Then
            Me.CtlSelezionaNumeri1.SetColore(Num, frm.ColoreScelto1.ColoreSel, frm.ColoreScelto2.ColoreSel)
            frm.Close()
            frm.Dispose()
        End If
    End Sub

    Private Sub frmOpzioni_Closed(sender As Object, e As EventArgs) Handles Me.Closed
        SalvaValoreCfg(eValoriAppConfig.SfondoColoreNumeri, CtlSelezionaNumeri1.GetStringaBackColorWin32())
        SalvaValoreCfg(eValoriAppConfig.ForeColorNumeri, CtlSelezionaNumeri1.GetStringaForeColorWin32())
        SalvaValoreCfg(eValoriAppConfig.SfondoColoreNumEvidenziato, Colore1.NomeColoreSel)
        SalvaValoreCfg(eValoriAppConfig.ForeColorNumEvidenziato, colore2.NomeColoreSel)

    End Sub

    Private Sub ButtonAnnulla_Click(sender As Object, e As EventArgs) Handles ButtonAnnulla.Click
        Me.Hide()
    End Sub

    Private Sub ButtonOK_Click(sender As Object, e As EventArgs) Handles ButtonOK.Click
        Me.Close()
    End Sub
End Class

e poi

Codice:
Public Class frmSelColore
    Sub New(v As String, backColor As Color, foreColor As Color)

        ' La chiamata è richiesta dalla finestra di progettazione.
        InitializeComponent()
        LabNumSel.Text = v
        LabNumSel.BackColor = backColor
        LabNumSel.ForeColor = foreColor
        ' Aggiungere le eventuali istruzioni di inizializzazione dopo la chiamata a InitializeComponent().

    End Sub

    Private Sub ButtonAnnulla_Click(sender As Object, e As EventArgs) Handles ButtonAnnulla.Click
        Me.Tag = ""
        Me.Hide()
    End Sub

    Private Sub ButtonOK_Click(sender As Object, e As EventArgs) Handles ButtonOK.Click
        Me.Tag = "OK"
        Me.Hide()
    End Sub

    Private Sub ColoreScelto1_OnItemClick() Handles ColoreScelto1.OnItemClick
        LabNumSel.BackColor = ColoreScelto1.ColoreSel
    End Sub

    Private Sub ColoreScelto2_OnItemClick() Handles ColoreScelto2.OnItemClick
        LabNumSel.ForeColor = ColoreScelto2.ColoreSel
    End Sub
End Class
 
visto che hai messo il pulsante ok e annulla , la procedura che salva invece di farla al form closed mettilaal pulsante ok , poi riposta il progetto cosi prima di procedere ancora diamo un controllo
 
fatto

 
ciao Edoardo, buongiorno. Allora mi sembra che tutto funzioni bene , facciamo solo qualche piccolo aggiustamento

inizia sostituendo la classe del controllo combobox colori con quella che è presente in questo file da scaricare
ad ambiente chiuso vai e sostituisci il file CmbColorPicker.vb




poi fai cosi questa routine , in modo tale che pure le combo dei colori si impostano sul colore giusto

1636443639851.png

nel modulo funzioni aggiungi questa che serve per ottenre un array di colori gradienti che useremo per dare i colori di default ai numeri
Codice:
Sub GetArrayColoriGradienti(ByVal ColoreIni As Color, ByVal ColoreFine As Color, ByRef aRetColori() As Color, ByVal nPunti As Integer)

        Dim rect As New Rectangle(0, 0, 1000, 10)
        Dim bmp As Bitmap = New Bitmap(rect.Width, rect.Height)
        Dim g As Graphics = Graphics.FromImage(bmp)

        Dim br As New System.Drawing.Drawing2D.LinearGradientBrush(rect, ColoreIni, ColoreFine, System.Drawing.Drawing2D.LinearGradientMode.Horizontal)
        Dim nx As Integer = 0, ny As Integer = 5
        Dim nW As Integer = rect.Width / nPunti

        g.FillRectangle(br, rect)
        ReDim aRetColori(nPunti)
        For k As Integer = 1 To nPunti
            aRetColori(k) = bmp.GetPixel(nx + nW / 2, ny)
            nx += nW
        Next
        bmp.Dispose()
        br.Dispose()
        g.Dispose()

    End Sub


nella finestra opzioni metti un pulsante "DEFAULT" e scrivi una routine che va ad impostare i colori dei 90 numeri

fai finta che io vcolessi colorare i numeri da 1 a 9 con un colore gradiente che va dal bianco al nero

' prima ottengo un array di 9 punti colore gradiente dal bianco al nero con

Codice:
dim aBackColor () as color
   Call GetArrayColoriGradienti(Color.White, Color.Black, aBackColor, 9)

poi con un ciclo vado ad impostare il colore di sfondo colo colore gradiente e il colore del font con il nero

Codice:
  For n = 1 To 9
            CtlSelezionaNumeri1.SetColore(n, aBackColor(n), Color.Black)

        Next


ecco tu devi tipetere questo ciclo cambiando ovviamente i colori limite del gradiente per le 10 righe del pannello ,quindi ci saranno 2 cicli nidificati uno per le righe e l'altro per le colonne dove effettivamente vai ad impostare i colori,a te la scelta dei colori di default
 
Ultima modifica di un moderatore:
Fatto :D

Codice:
    Private Sub ButtonDefault_Click(sender As Object, e As EventArgs) Handles ButtonDefault.Click
        Dim i As Integer
        Dim aBackColor() As Color
        GetArrayColoriGradienti(Color.White, Color.Blue, aBackColor, 90)
        For r = 1 To 9
            For c = 1 To 10
                i += 1
                CtlSelezionaNumeri1.SetColore(i, aBackColor(i), Color.Black)
            Next
        Next

    End Sub

Senza titolo.png
 
eheh hai scelto la strada piu veloce , io dicevo di fare 10 righe con 10 gradienti diversi :-) ahahha vabe è uguale ..
ok , ora facciamo qualche altra modifica

questa struttura fatta cosi è sbagliata anche se funziona lo stesso

Codice:
    Public Structure StrEstrazione
        Dim Ruote() As StrNumeriEstrazione
        Sub DimensionaRuote()
            ReDim Ruote(11)
            For r = 1 To 11
                For e = 1 To 5
                    ReDim Ruote(r).Estratto(e)
                Next
            Next
        End Sub
        Dim Data As StrDataEstrazione
        Dim identifier As Integer
    End Structure


il motivo per cui è sbaglaita è che ridimensioniamo gli estratti per 5 volte e alla fine giustamente viene da 5 elementi , ma in realtà dovremmo dimensionarlo direttamente a 5 senza il ciclo e

inoltre è meglio se andiamo a scrivere una routine DimensionaEstratti dentro la struttura degli estratti in modo da poterla richiamare dentro il ciclo r
fai la modifica e avvertimi ..
 
Ciao , perché non fare un menu dove si può scegliere i colori ? Esempio tasti con gradienti oppure bianchi , sempre restando la differenza tra premuto e non.

Magari anche per i form .

Praticamente posso scegliere l aspetto.
Io avevo fatto qualcosa del genere su uno script.
Ma forse per una cosa del genere bisognava stabilirlo prima.
Cerco di seguirvi per quanto mi è possibile.
Ciao :)
 

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