Novità

Mente da programmatore

Edoardo_95

Advanced Member
Bene per quanto riguarda la classe archivio l'ho dichiarata public all'interno del Modulo dedicato alle variabili locali. Le struct le ho modificate nel modo seguente:

Codice:
Module ModStructure
    Public Structure StrNomeRS
        Dim Nome As String
        Dim NomeAbbreviato As String
    End Structure

    Public Structure StrNumeriEstrazione
        Dim Estratto() As Integer
    End Structure


    Public Structure StrDataEstrazione
        Dim Data As Date
        Dim Numero As Integer
        Dim IndiceMensile As Integer
    End Structure

    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


End Module

Mentre la classe archivio nel seguente modo:

Codice:
Imports System.IO
Public Class ClsArchivio
    Private Estrazioni() As StrEstrazione
    Sub New(sFileArchivio As String)
        ReDim Estrazioni(0)

        If FileEsistente(sFileArchivio) = True Then
            AlimentaStrEstrazioni(sFileArchivio)
        End If
    End Sub
    Private Function AlimentaStrEstrazioni(File As String) As Boolean
        Dim AlimentaEstrazioni As Boolean = False
        Dim n, i As Integer
        Dim EstrazioniTotali As Integer
        Dim EstrazioniMassime As Integer
        Dim StrEstrTemp As StrEstrazione
        Dim SingElemRiga() As String
        StrEstrTemp.DimensionaRuote()


        EstrazioniMassime = 10000

        ReDim Estrazioni(EstrazioniMassime)

        Dim sLine As String

        Try
            Dim str As New StreamReader(File)
            'leggo la riga del file csv
            sLine = str.ReadLine
            'eseguo un ciclo do fin quando esistono righe da leggere
            Do Until sLine Is Nothing
                'otteno un array di sotto stringhe formato dai singoli componenti separati da ";"
                Dim aSubStringRecord() As String = sLine.Split(";", StringSplitOptions.RemoveEmptyEntries)
                'pongo una condizione che verifica che la riga sia stata suddivisa in tutte le sue parti pari a 58 sottostringhe
                If aSubStringRecord.Count = 58 Then
                    'imposto un indice che parta dalla data dell'estrazione
                    i = 2
                    For r = 1 To 11
                        For e = 1 To 5
                            'incremento di uno l'indice in modo tale da prendere il primo estratto
                            i += 1
                            'imposto il numero che andra ad alimentare la struttura
                            n = Val(aSubStringRecord(i))
                            'verifico che sia un numero valido da inserire
                            If NumeroValido(n) = True Then
                                StrEstrTemp.Ruote(r).Estratto(e) = n
                            Else
                                'Nel caso in cui vi sia la comparsa di un numero non valido verifico che vi siano estrazioni precedenti preservando l'archivio fino
                                'all'individuazione dell'errore
                                MessageBox.Show($"Numero non valido rilevato: {n}", "Errore", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                                If EstrazioniTotali > 0 Then

                                    ReDim Preserve Estrazioni(EstrazioniTotali)
                                    Estrazioni(EstrazioniTotali) = StrEstrTemp
                                    AlimentaEstrazioni = True
                                Else
                                    ReDim Estrazioni(0)
                                    MessageBox.Show("Archivio non letto correttamente" & vbCrLf & "Estrazioni caricate " & EstrazioniTotali, "Errore", MessageBoxButtons.OK, MessageBoxIcon.Error)

                                End If
                            End If
                        Next
                    Next


                End If
                EstrazioniTotali += 1

                If EstrazioniTotali > EstrazioniMassime Then

                    EstrazioniMassime += 1000

                    ReDim Preserve Estrazioni(EstrazioniMassime)

                End If
                sLine = str.ReadLine
            Loop

            If EstrazioniTotali > 0 Then

                ReDim Preserve Estrazioni(EstrazioniTotali)

                Estrazioni(EstrazioniTotali) = StrEstrTemp

                AlimentaEstrazioni = True
            Else

                ReDim Estrazioni(0)

                MessageBox.Show("Archivio non letto correttamente" & vbCrLf & "Estrazioni caricate " & EstrazioniTotali, "Errore", MessageBoxButtons.OK, MessageBoxIcon.Error)

            End If


            str.Close()
            str.Dispose()
        Catch ex As Exception

            MessageBox.Show(ex.Message, "Errore", MessageBoxButtons.OK)

        End Try

        Return AlimentaEstrazioni
    End Function

    'Non confondersi...non si tratta di un numero valido per il lotto ma per l'archivio ...quindi va considerato lo zero visto l'assenza in passato di alcune ruote
    Private Function NumeroValido(n As Integer) As Boolean
        Dim valido As Boolean
        If n >= 0 And n <= 90 Then
            valido = True
        End If
        Return valido
    End Function

    Friend Function Inizializzato() As Boolean
        Dim ini As Boolean
        If Estrazioni.Length > 0 Then
            ini = True
        End If
        Return ini
    End Function

End Class
 
L

LuigiB

Guest
For r as integer = 1 To 11

non ho visto la dichiarazione di alcune variabili , lo hai messo option explicit ?


ha iprovato a vedere se carica correttamente l'array delle estrazioni ?
 

Edoardo_95

Advanced Member
si ho messo option explicit ma in vb.net nei cicli for non vi è bisogno. Ho testato la funzione è sembra andare ma se vuoi posso postare i sorgenti
 

Edoardo_95

Advanced Member
Eccoli qui:

 
L

LuigiB

Guest
no no assolutamente è che non avendola provata sul campo non sapevo se funzionasse , hai provato a vedere che succede quando inconta le estrazioni a 0 ?
 
L

LuigiB

Guest
allora nei progetti si possono creare cartelel e sottocartelle , usale per organizzare il codice, crea uan cartella per i moduli , per le classi , per le form
 
L

LuigiB

Guest
se uno volesse cambiare temporaneamente il file dell'archivio non potrebeb perche comunque lo vai a scrivere tu ogni volta.
Il file di configurazione va generato autromaticamente con i valori di default solo se non esiste.
 
L

LuigiB

Guest
per i numer ia 0 ho visto che fai un test che considera validi i numeri da 0 a 90 , ok , pero nel tuo ciclo che legge le estrazioni ti consiglio di caricare prima tutta la struttura temporanea e tenere un flag che parte impostato a true e divcenta false se durante la lettura dei numeri ne incontra uno non ammesso.
Alla fine del ciclo cje legge tutte le ruote testi il flag , se è true trascrivi l'estrazione nell'array , senno dai un messaggio ed esci dal ciclo Do
 
L

LuigiB

Guest
per i numer ia 0 ho visto che fai un test che considera validi i numeri da 0 a 90 , ok , pero nel tuo ciclo che legge le estrazioni ti consiglio di caricare prima tutta la struttura temporanea e tenere un flag che parte impostato a true e divcenta false se durante la lettura dei numeri ne incontra uno non ammesso.
Alla fine del ciclo cje legge tutte le ruote testi il flag , se è true trascrivi l'estrazione nell'array , senno dai un messaggio ed esci dal ciclo Do

stessa cosa dovresti fare se trovi una riga che non ha i 58 valori.

esci dal ciclo , informa l'utente e considera non valida l'apertura dell'archivio. Dato che l'archivio lo scriverai tu con il programam se ci sono errori dentro è perche qualcuno è andato a trafficare a mano quindi è giusto bloccare tutto e uscire col messaggio di archivio corrotto.
 

Edoardo_95

Advanced Member
stessa cosa dovresti fare se trovi una riga che non ha i 58 valori.

esci dal ciclo , informa l'utente e considera non valida l'apertura dell'archivio. Dato che l'archivio lo scriverai tu con il programam se ci sono errori dentro è perche qualcuno è andato a trafficare a mano quindi è giusto bloccare tutto e uscire col messaggio di archivio corrotto.
Perfetto ma qualora io uscissi dal ciclo do come archivio corrotto ...come dovrei comportarmi globalmente? Impostare la booleana di verifica archivio a false e chiudere il programma o continuare visualizzando solo le estrazioni "non corrotte"?
 
L

LuigiB

Guest
ora dovrai aggiungere dei metodi alla classe archivio che consentiranno di manipolare l'archivio.

il primo di tutti è sicuramente AddEstrazione che servirà per aggiungere una nuova estrazione alla fine , tale metodo dovra incrementare l'arraydelle estrazioni con un nuovo elemento ma anche scrivere l'estrazione sul disco.


un po' piu difficile ci vorrebbe un metodo EditEstrazione , che consenta di editare un 'estrazione in un punto qualsiasi dell'archivio.
In questa funzione dovrai modificare l'estrazione voluta e dovrai riscrivere l'archivio su disco , qui hai 2 strade , se i record dell'archivio hanno tutti la stessa lunghezza potresti fare una funzione che sovrasciva solo i byte riguardante l'estrazione modificata , piu facile riscrivi l'archivio da capo .

ci vorra una funzione che trasformi una data estrazione dalla forma di struttura alal forma di stringa con i separatori
 
L

LuigiB

Guest
Perfetto ma qualora io uscissi dal ciclo do come archivio corrotto ...come dovrei comportarmi globalmente? Impostare la booleana di verifica archivio a false e chiudere il programma o continuare visualizzando solo le estrazioni "non corrotte"?
uscendo dal programma , se l'archivio è corrotto vuol dire che qaualcuno lo ha manomesso , potresti prevedere di sostituirlo automaticamente con un archivio di default da distribuire insieme al progetto ,archivio che certo non è aggiornato ma almeno non è corrotto e consente l'avvio e il successivo aggiornamento. Oppure semplicemente archivio corrotto ed esci dal programma.
 
L

LuigiB

Guest
Legend non è che ti voglio tirare per la giacchetta ma lo sai che il pane non lievita bene se pure tu non ti scarichi visualstudo express ? :)
 

Ultima estrazione Lotto

  • Estrazione del lotto
    martedì 23 aprile 2024
    Bari
    47
    22
    34
    20
    50
    Cagliari
    33
    14
    86
    02
    62
    Firenze
    61
    22
    44
    19
    26
    Genova
    21
    12
    57
    82
    55
    Milano
    66
    05
    11
    70
    30
    Napoli
    05
    23
    25
    52
    73
    Palermo
    23
    44
    49
    71
    65
    Roma
    82
    37
    59
    34
    71
    Torino
    26
    42
    66
    15
    58
    Venezia
    57
    06
    68
    54
    84
    Nazionale
    21
    79
    49
    03
    01
    Estrazione Simbolotto
    Genova
    24
    02
    19
    03
    27

Ultimi Messaggi

Alto