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:
Mentre la classe archivio nel seguente modo:
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