Novità

Mente da programmatore

Ho già inserito una gestione errore... se la lunghezza del campo testo è uguale a zero genera un messaggio di errore ...ed attraverso il return permette di non perdere i dati inseriti e spingere l'utente ad inserirla
Non ho considerato il caso in cui l'utente non inserisca una data corretta hai ragione aspetta
 
si l'ho visto ma se uno mette i blank ? la stinga avrebbe length > 0 lo stesso ...
fai una funzione di conversioen e gestisci l'errore cosi è pure piu pulito quando la usi e stai sicuro.

cisono dei problemini

faccio nuovo , sia abilita salva , faccio anulla salva riamae abilitato , ti consigliodi disabilitare sdalva direttamente ogni volta che leggi un'estrazione
faccio nuovo , invece di inserire i numeri misposto con la scrollbar e mi fa vedere le altre estrazioni con il tasto conscritto ancora ANNULLA ,devi gestire meglio le diverse situazioi per abilitare ocambiare la text ai pulsanti
 
Ok ho sistemato tutto.

 
Implementazione ctlRange fatta:

Codice:
Public Class frmSchermataPrincipale


    Private Sub frmSchermataPrincipale_Load(sender As Object, e As EventArgs) Handles Me.Load
        AggiornaStato()
        CtlRangeEstrazioni1.Inizio = GetValoreCfg(eValoriAppConfig.RangeInizio)
        CtlRangeEstrazioni1.Fine = GetValoreCfg(eValoriAppConfig.Rangefine)
    End Sub
    Sub SalvaParametriCfg()
        SalvaValoreCfg(eValoriAppConfig.RangeInizio, (CtlRangeEstrazioni1.Inizio).ToString)
        SalvaValoreCfg(eValoriAppConfig.Rangefine, (CtlRangeEstrazioni1.Fine).ToString)
    End Sub
    Sub AggiornaStato()
        CtlRangeEstrazioni1.Inizio = 1
        CtlRangeEstrazioni1.Fine = cArchivio.QuantitaEstrazioni
        CtlRangeEstrazioni1.Estrazionitotali = cArchivio.QuantitaEstrazioni
    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
End Class


Codice:
  Public Enum eValoriAppConfig
        Archivio
        RangeInizio
        Rangefine
    End Enum
 
bene , sembra funzionare come si deve , alcuni accorgimenti
per evitare che consenta di salvare nuove estrazioni dove l'utente non ha digitato i numeri puoi creare una funzione che faccia la verifica
Ora nel nostro caso tu potresti ciclare sull'array dei campi testo , pero si puo ciclare anche sull'insieme dei controlli appartenenti ad un controllo che è in grado di assolvere la funzione di container di altri controlli. Un panel ade esempio lo è , ti metto qui l'esempio , la funzione torna false appena trova un campo vuoto

Codice:
    Function VerificaPresenzaInputUtente() As Boolean



        For Each o As Control In Panel1.Controls
            If TypeOf o Is MaskedTextBox Then
                If o.Text.trim = "" Then
                    Return False
                End If
            End If
        Next

        Return True

    End Function

dovresti predisporre due nuovi valori per il file ini RangeInizio e RangeFine , per farlo basta aggiungere due nuovo membri al tipo enumerato presente nel modulo che gestisce la configurazione.

al load del form mdi devi impostare le proprieta del controllo range , quindi le estrazioni totali e i valori inizio e fine
all'evento closing del form dovrai salvare i valori correnti prendendoli dalle proprietà inizio e fine del controllo

per leggere esalvare i valori le funzioni ci sono gia nel modulo che gestisce la configurazione.
quindi fai una sub LeggiValoriCfg e un altra SalvaValoriCfg
nel form mdi dove raggrupperai le operazioni di lettura e salvataggi odei valori che possono essere mantenuti alla riapertura del programma
 
ah non avevo visto , comunque attento che se nel file cfg non ci sono valori deve mettere 1 e Max ed attualmente non lo fa , poi dato che si tratta di valori interi usa sempre la funzione di conversione , per esempio ora che li hai appena implementati nel file ini quei valori non ci sono e se lanci il programma anche se impostavi inizio e fine come 1 e max poi li reimposti con 0 per via del fatto che quei valori non sono proprio presenti
 
Quindi se ho capito bene:

Codice:
    Private Sub ButtonSalva_Click(sender As Object, e As EventArgs) Handles ButtonSalva.Click
        Dim strEst As StrEstrazione
        strEst.DimensionaRuote()
        Dim i As Integer
        strEst.identifier = ConvertToInt(LabEstrTot.Text)
        strEst.Data.Numero = ConvertToInt(LabNumEstr.Text)
        If TextData.Text.Length > 0 Then
            strEst.Data.Data = ConvertTodate(TextData.Text)
        Else
            MessageBox.Show("Devi inserire una data", "Rilevata assenza dati", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Return
        End If
        For r As Integer = 1 To 11
            For es As Integer = 1 To 5
                i += 1
                strEst.Ruote(r).Estratto(es) = ConvertToInt(aTxtNumeri(i).Text)
            Next
        Next
        If IsEstrazioneValida(strEst) Then
            If VerificaPresenzaInputUtente() = True Then
                cArchivio.ScriviEstrazione(ConvertToInt(LabEstrTot.Text), strEst)
                ImpostaLimitiScrollBar()
                AlimentaContenutiForm()
                MessageBox.Show("Estrazione salvata correttamente", "Salvataggio concluso", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Else
                MessageBox.Show("Estrazione incompleta", "Salvataggio non concluso", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
        Else
                MessageBox.Show("Dati non inseriti correttamente", "Rilevato errore", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Return
        End If
    End Sub

Codice:
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))
    End Sub
    Sub SalvaParametriCfg()
        SalvaValoreCfg(eValoriAppConfig.RangeInizio, (CtlRangeEstrazioni1.Inizio).ToString)
        SalvaValoreCfg(eValoriAppConfig.Rangefine, (CtlRangeEstrazioni1.Fine).ToString)
    End Sub
    Sub AggiornaStato()
        CtlRangeEstrazioni1.Inizio = 1
        CtlRangeEstrazioni1.Fine = cArchivio.QuantitaEstrazioni
        CtlRangeEstrazioni1.Estrazionitotali = 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
    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
End Class
 
Ciao .
Sono riuscito ad aprire il file.
Ora lo studio un po.
Mi dice che ci sono degli errori ma lancio lo stesso il file.
Se io facessi delle modifiche perché non riesco a vederle nel debug?
Tutto complicato ma ci proverò.
Grazie ragazzi :)
 
If VerificaPresenzaInputUtente() = True Then
va messo priam di tutto , anzi i lcontenuto dell'evento click spostalo in una sub GestioeneSalva

If VerificaPresenzaInputUtente() = True Then gestionesalva

e tutti i controlli come ad esempio la data vall ia fare li.


Legend posta le schermate , per accedere al codice vai nella gestione progetti clicchi su quello che vuoi e fai visualizza codice

1636129187648.png
 
Ciao .
Sono riuscito ad aprire il file.
Ora lo studio un po.
Mi dice che ci sono degli errori ma lancio lo stesso il file.
Se io facessi delle modifiche perché non riesco a vederle nel debug?
Tutto complicato ma ci proverò.
Grazie ragazzi :)
Non sono errori ma avvisi di stesura codice. Visual studio 2019 è fornito di un intellicode ed intellisense (una sorta di automa) che verifica la stesura del codice. Se vi è in fase di runtime un procedura, una variabile o una funzione che ne casi registrati può dare errore, da il warning. Naturalmente ogni codice ha una sua funzione ed una sua logica e per tale motivo "l'automa" non può sapere il perché di quella precisa stesura. Serve solo come spunto al programmatore qualora vi siano insorgenze di errori. Per effettuare il debug devi scatenare l'evento all'interno del programma in debug ponendo un punto di interruzione nella parte di codice che desideri migliorare o correggere. Naturalmente con questa nuova versione andando con il mouse sulla variabile puoi sapere il valore assunto in quel preciso momento
 
come avrai visto Legende i form si compongono di un'interfaccia grafica e di una finestra del codice.
gli oggetti che si possono mettere sui form hanno proprieta metodi ed eventi.
Per esempio all'evento clik del pulsante Edoardo lancia la routine che fa quella operazione.
Per esempio se vuole cambiare il testo del pulsante usa la proprieta pbSalva.Text dove pbSalva è il nome del pulsante e text è la proprietà
 
per Edoardo avrai visto che il controll orange fa gia tuttto da solo tranne quando si premi il pulsante con la X , in quel caso si scatena un evento che devi gestire.
di pulsanti con la x ce ne sono 2 il primo serve per selezionare da un apposita finestra che dovrai creare l'estrazione inizio e l'altro l'estrazione fine.
Ad esempi ose tu volessi selezionarer un estrazione in base alla data e no nsolo al suo id cosi non potresti , invece cliccando il pulsante con la x si dovra aprire una finestra molto semplice 2 scrollbar due label , nelle label mostri la data dell'estrazione puntata dalla scroll bar
se l'utente preme ok in questa finestra riporti il valore delle 2 scrollbar nelle proprietà inizioo e fine del controllo range
 
le segnalazion ia cui si riferisce Legend sono queste , no ndsanno problemi ma possono essere risolte

1636131357932.png


guardiamo la prima segnalazione ci dice che la funzione ha dei punti dove non torna nulla ed infatti è vero
Codice:
Private Function AlimentaArrayEstrazioni(File As String) As Boolean
        Dim bRet As Boolean = True
        Dim EstrazioniTotali As Integer
        Dim EstrazioniMassime As Integer = 20000
        Dim nIndiceMensile As Integer
        Dim nLastMese As Integer
        Dim sLine As String
        ReDim Estrazioni(EstrazioniMassime)

        Try
            Dim str As New StreamReader(File)
            sLine = str.ReadLine
            Do Until sLine Is Nothing
                EstrazioniTotali += 1
                CalcolaIndiceMensile(sLine, nLastMese, nIndiceMensile)
                If RecordArchivioToStructArchivio(sLine, nIndiceMensile, Estrazioni(EstrazioniTotali)) = False Then
                    bRet = False
                    Exit Do
                End If
                If EstrazioniTotali >= EstrazioniMassime Then
                    EstrazioniMassime += 1000
                    ReDim Preserve Estrazioni(EstrazioniMassime)
                End If
                sLine = str.ReadLine
            Loop
            str.Close()
            str.Dispose()
            ReDim Preserve Estrazioni(EstrazioniTotali)
            Return bRet
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Errore", MessageBoxButtons.OK)
        End Try
    End Function

basta chiudere la funzione con return = false alla fine di tutto prima di end function

e cosi per le altre segnalazioni.

l'ultima segnalazione ci segnala che stiamo usando una variabile non istanziata , s irisolve con

Dim str As StrEstrazione = New StrEstrazione

prima c'era solo

Dim str As StrEstrazione


facendo queste modifiche l'elenco delle segnalazioni si svuota
 
per edoardo , la funzione implementata da questa form io la lascierei cosi senza appesantirla di funzionalità diverse per non complicare le cose.
Direi invece di fare un form apposta dove potremo gestire le varie analisi sulle estrazioni , che ne so somme estratti , differnze , evidenzia gemellli , cifre , cadenze .. tutte varie cose che è meglio mettere in un form a parte senza appesantire la funzione di edit/new delle estrazioni.
Pero a aspetta a procedere , quando avrai consolidato le cose dette fin ora procediamo su un 'altra cosa , di tu quando sei pronto
 
Grazie
Mi metto a studiare :)
Spero di prendere un po di dimestichezza come avevo fatto con gli script,ma qui siamonad altri livelli.
Bravo Edoardo 👍
 
a chi affidiamo il compito di ricercare uun set adatto di icone per i vari menu ? Ora ce ne sono pochi ma spero crescano ..

1636133596405.png
 
Grazie
Mi metto a studiare :)
Spero di prendere un po di dimestichezza come avevo fatto con gli script,ma qui siamonad altri livelli.
Bravo Edoardo 👍

non ti preoccupare legend , non hai voluto imparare il vb6 mo ti becchi il vbnet :-) a parte gl ischerzi la mentalità gia ce l'ahi perche l'hai aquisita con gli script.
per esempio io avrei gia un compitino da affidarti ... se vuoi te lo dico è sicuramente alal tua portata
 
allora devi andare nel modulo

1636141549091.png

e inserire una funzione che ci servirà
La funzione prende come input un valore stringa e deve tornare sia un array con i numeri contenuti nella stringa sia la quantita di numeri.
la stringa in input ovviamente avrà i numeri separati da un carattere separatore , la particolarità è che questa tua funzione dovra funzionare anche non sapendo quale sia questo carattere separatore.

ora ti ricordi che negliscript per lavorare sulle stringhe abbiamo left , mid , right , in vb net dato che le variabili sono oggetti dispongono di metodi

per esempio una vaiabile di tipo stringa dispone del metodo substring (index, lunghezza) che consente di estrarre una sottostringa passando la posizione che parte da 0 e la lunghezza del dato da estrarre

per esempio
dim a as string = "ciao"
msgbox s.substring(0,1) da come risultato la "c"

per sapere se un carattere è numerico si usa la funzione isNumeric allaquale si passa la stringa del carattere ,torna true se appunto il carattere è compreso tra 0 e 9

in vbnet a differenza di vbscript c'è la tipizzazione dei dati quindi le variabili come hai visto si dichiarano specificandone il tipo , as string , as integere eccetera

veniamo a noi ecco il prototipo della funzione , non far come lottotom che mi ci metti qualche estroso parametro in piu :)
devi leggere carattere per carattere la stringa , se è un numero la accodi in uan var temporanea appena non lo è nella var temporanea avrai un valore che sarà il numero a qule punto lo devi inserire nell'array , quello sarà l'array che torna indietro al chiamante , i lrisultato della funzione deve essere la quantita di elementi dell'array

cioeè se io passo la stringa : 1;5,15 26;30 la funzione mi devve tornare i 5 numeri 1,5,15,26,30 nell'array e 5 come risultato


Codice:
public function StringaNumToArrayNum (sNumeri as string , byref aRetN() as integer ) as integer
 
end function

fatta questa ne fai una tale e quale che si chiama allo stesso modo ma che torna un array di boolean
in dot net possono coesistere funzioni con lo stesso nome se hanno parametri differenti , poi è il compilatore che capisce quale usare


Codice:
public function StringaNumToArrayNum (sNumeri as string , byref aRetN() as boolean) as integer
 
end function
[code
 

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