Novità

Mente da programmatore

Edoardo_95

Advanced Member
Uno dei miei più grandi sogni è quello di saper programmare software. Ho girato centinaia di siti e valutato migliaia di corsi (alcuni seguiti scrupolosamente). Ma rimane sempre un problema. La mente del programmatore. Tutti quanti spiegano il linguaggio, le funzionalità ecc. Ma mai nessuno spiega come mettere in pratica il linguaggio nella formazione di un software. Manca sempre quel indirizzamento alla formazione pratica. Quindi nel momento in cui mi metto davanti al computer ... Il vuoto ... Non so da dove iniziare. Qualcuno conosce un sito, del materiale o qualsiasi cosa che possa condurmi alla progettazione di un software e sua conseguente formazione? Che sia VB.net o C#
 

i legend

Advanced Member >PLATINUM PLUS<
La mia speranza resta che un giorno luigi cominci a spiegare un po di c#, magari quello di visual studio che è free. Però in quanti lo seguiremo?
È bello spiegare per una grande platea. Intanto ha sdoganato un po il vbscript:)
Sono un po curioso anche io :)
 

LuigiB

Premium Member
ciao di siti come avrai visto a partire da html.it ce ne stanno in quantità, Di tutorial ne trovi a bizzeffe e di libri pure. Ma appunto come hai giustamente capito quello che conta è la mentalità , facendo un esempio con gli esseri umani puoi parlare in qualsiasi lingua ma se se non sei in grado di fare ragionamenti quando parli sempre stronzate dici .. nella programmazione è la stessa coasa , esistono decine di linguaggi differenti con alcuni che vanno per la maggiore , come appunto il dot net in c# un po meno Vb.net anche se io lo preferisco e lo uso anche perche possono fare le stess cose e solo per utilizzi estemi il c# è migliore , personalmente la chiarezza delle istruzioni vb la preferisco alla sintassi compressa e criptica che si adopera nel C , si sostiene che cosi sia piu veloce scrivere il codice ed infondo se ci si abitua è vero , ma il problema per me non è quello la base sta sempre in un buon progetto., sta prendendo piede python. La programmazione ad oggetti negli ultimi anni ha prevaricato quella procedurale , la base della programmazione ad oggetit e la riutilizzabilità del codice e la migliore manutenibilità del software.
La capacità di programamre si acquista con l'esperienza e seguendo ovviamente gli insegnamenti teorici.
Un buon programma gestionale non dipende solo dal codice che vai a scrivere ma molto da come è organizzato database che si trova sotto quindi li si spazia dalal programmazione alla gestione dei db. Ti devi confrontare mano mano con la realizzazione di semplici programini didattici per poi congegnare ciò che hai imparato in programmi piu complessi.
Anche su youtube ci sono dei buoni video . non ti consiglio di buttare soldi in corsi offerti dalle aziende capace che 3 giorni di corso costino 2000 euro ..il primo corso di programmazione che feci io 25 anni fa fu in vb6 finanziato dalla regione ed è durato diversi mesi 4 ore al giorno mi pare.. del tutto diverso dai corsi che propongono le aziende commerciali , sembrava di andare a scuola ...
 

LuigiB

Premium Member
La mia speranza resta che un giorno luigi cominci a spiegare un po di c#, magari quello di visual studio che è free. Però in quanti lo seguiremo?
È bello spiegare per una grande platea. Intanto ha sdoganato un po il vbscript:)
Sono un po curioso anche io :)
sul c# non posso dire nulla perche non lo uso , sulle altre cose mi dispiace ma di tentativi ne ho fatti parecchi e con argomenti mlto piu semplici ...
 

i legend

Advanced Member >PLATINUM PLUS<
Hai insegnato il vbscript all italia intera.hai fatto più tu che docenti nelle scuole. Sei un grande. Hai sdoganato un linguaggio.
Prima era impossibile fare una statistica di un metodo. Ti fidavi semplicemente. Ora non solo lo si può verificare ma te li puoi costruire.
Grazie è sempre poco.
Ah ,
Non preoccuparti non mi servono favori🤣🤣🤣🤣🤣🤣.
Ciao :)
 

Edoardo_95

Advanced Member
Guarda sarò sincero. Mi hai dato uno dei consigli migliori che abbia mai ricevuto fino ad oggi. Non ho mai pensato di "costruire" piccoli programmi didattici né tanto meno di congegnare poi le acquisizioni didattiche in qualcosa di più complesso. Ho capito che il mio errore è stato quello di pretendere di partire da 0 a 10000 ...ma mai per piccoli step. Non so come ringraziarti credimi 😃 sembrerò esagerato ma mi hai aperto un mondo ahahahah
 

Edoardo_95

Advanced Member
Hai insegnato il vbscript all italia intera.hai fatto più tu che docenti nelle scuole. Sei un grande. Hai sdoganato un linguaggio.
Prima era impossibile fare una statistica di un metodo. Ti fidavi semplicemente. Ora non solo lo si può verificare ma te li puoi costruire.
Grazie è sempre poco.
Ah ,
Non preoccuparti non mi servono favori🤣🤣🤣🤣🤣🤣.
Ciao :)
Beh in effetti non hai tutti i torti 🤣🤣🤣
 

LuigiB

Premium Member
il classico programma iniziale è la rubrica telefonica con funzioni di inserimento , ricerca , modifica , cancellazione dei record di una tabella di database,
Ti prepari un bel database in access con una tabella , poi vedi come si fa per collegarsi ad un db tramite vbnet o se vuoi c# , ti ci sbattti e piano piano sapendo che devi realizzare quelle funzioni vedi come si fa.
Poi da quello passi ad un semplice programma gestionale che adoperi piu di una tabella di un db , all'epoca si usava la gestione di un negozio di video cassette , con la tabella dei clienti , dei fornitori , delle videocassette disponibili per il noleggio , insomma tutta una serie di funzioni che in qualità di programmatore devi ipotizzare oltre che a sentire le necessita del cliente. Essendo un programma didattico prova dopo la rubrica a fare questo e immagina quali siano le necessita di un negozio simile per poi implementarle in un semplice gestionale.
Dopo che avrai fatto pratica potrai iniziarre a lavorare ad un tuo programma.
 

Edoardo_95

Advanced Member
Beh qui partirà la risata. In realtà il mio intento nell'iniziare si basava su due progetti. Il primo, si basa sulla formazione di un software gestionale di una piccola attività multiservizi con una serie di funzioni utili a gestire un portafoglio clienti. La seconda invece si basava sulla creazione di un software lotto base che possedesse inizialmente solo la visualizzazione delle estrazioni e l'aggiornamento. Una sezione in grado di effettuare una statistica delle formazioni inserire. E poi man mano diverse funzioni ad hoc. Diciamo una sorta di SpazioMetria 2.0 light (Col tempo non più) ma scritta in vb.net. Sarebbe troppo divertente cimentarsi :D
 

LuigiB

Premium Member
la prima ipotesi prevede prima la creazione di un apposito database
l'altra puo fare a meno di un db , ma è chiaro che deve poter gestire le estrazioni leggendole da un file come ad esempio un file csv

penso che ti possa gia cimentare in una delel 2 ,sempre che tu sia pratico delle istruzioni del linguaggio e sappia a cosa servono senno prima ti dovrai dedicare alla teoria e ai famosi programmi didattici.

Nel primo caso dovresti preparare prima un database ,
prenendo il secondo caso piu attinente a questo forum , potresti iniziare scrvendo una classe che Archivio , la quale avrà il compito di leggere , scrivere le estrazioni nel file sottostante
Quindi dovrai implementare diverse proprietà e metodi che facciano questo lavoro.
ci vorra una proprietà che indica il file da leggere
ci vorra una struttura dsati per memorizzare la singola estrazione
ci vorra un array del tipo della struttura suddetta per memorizzare tutte le estrazioni
civorra una funzione che legga il file e alimenti l'array come una che scriva le estrazioni aggiunte /modificate nel file che rimarrà su disco a computer spento.
Altre funzioni che consentano di leggere una singola estrazione per mostrarle in una form una alla volta
Altre funzioni come per esempio quelle di statistica.














 

Edoardo_95

Advanced Member
Bene, dopo milioni di tentativi, ragionamenti, prove su carta...sono riuscito a tirare fuori qualcosa, anche se ora sono bloccato in un punto.
Come punto di partenza ho utilizzato l'archivio lotto in formato CSV (l'ho recuperato dal software RicercaLunghette) ed ho osservato la sua forma.. e da quella ho dedotto le strutture necessarie (i buon cari e vecchi UDT per chi ne sa qualcosa) necessari allo scopo ed è uscito questo:
Codice:
Module ModuleStrutture

'Struttura per il nome e nome breve che servirà per le ruote e la sorte
    Public Structure StrNomeRS
        Public Nome As String
        Public NomeAbbreviato As String
    End Structure

'Struttura che indicizzata indicherà il numero alla posizione 1 to 5 su ruote 1 to 11
    Public Structure StrNumeriEstrazione
        
        Public Estratto() As Integer

    End Structure


    Public Structure StrDataEstrazione
        Public Data As Date
        Public Numero As Long
        Public IndiceMensile As Long
        Public PrimaDelMeseBool As Long
        Public UltimaDelMeseBool As Long

    End Structure
    
    Public Structure StrEstrazione
    Public Ruote() As NumeriEstrazione
    Public Data As DataEstrazione
    Public identifier As Long             
    End Structure



End Module


Fatto ciò mi sono creato subito un modulo chiamato VariabiliGlobali dove ho inserito una stringa in cui vi è il percorso del file csv cosi:

Codice:
 Public PercorsoDatabase As String = Application.StartupPath() + "\Archivio\"

una procedura in grado di verificare la presente della cartella in cui risiederà l'archivio e qualora non fosse presente di crearla ... all'interno di un ModuloAssistente cosi:

Codice:
  Module Assistente
  Sub ControllaPercorsoDatabase()
 
        If System.IO.File.Exists(PercorsoDatabase) = False Then
            System.IO.Directory.CreateDirectory(PercorsoDatabase)           
        End If

    End Sub
End module

Ora all'avvio del programma ho pensato di effettuare due procedure fondamentali. Nell'avvio del programma inizialmente precarico il nome delle ruote e delle sorti (considerando che poi le ruote le richiamerò per alimentare le righe della tanto simpatica DataGridView che odio)
E poi alimento le strutture per poterle richiamare quando necessario.

quindi all'interno delle VariabiliGlobali ho inserito:

Codice:
Module VariabiliGlobali

    Public PercorsoDatabase As String = Application.StartupPath() + "\Archivio\"
    Public NomiRuote() As StrNomeRS
    Public NomiSorte() As StrNomeRS

End Module

e nel ModuleAssistente questa procedura:

Codice:
 Sub AlimentaRuoteSorte()

        ReDim NomiRuote(12)

        NomiRuote(1).Nome = "Bari"
        NomiRuote(1).NomeBreve = "Ba"
        NomiRuote(2).Nome = "Cagliari"
        NomiRuote(2).NomeBreve = "Ca"
        NomiRuote(3).Nome = "Firenze" 
        NomiRuote(3).NomeBreve = "Fi"
        NomiRuote(4).Nome = "Genova" 
        NomiRuote(4).NomeBreve = "Ge"
        NomiRuote(5).Nome = "Milano" 
        NomiRuote(5).NomeBreve = "Mi"
        NomiRuote(6).Nome = "Napoli"
        NomiRuote(6).NomeBreve = "Na"
        NomiRuote(7).Nome = "Palermo" 
        NomiRuote(7).NomeBreve = "Pa"
        NomiRuote(8).Nome = "Roma"
        NomiRuote(8).NomeBreve = "Rm"
        NomiRuote(9).Nome = "Torino" 
        NomiRuote(9).NomeBreve = "To"
        NomiRuote(10).Nome = "Venezia"
        NomiRuote(10).NomeBreve = "Ve"
        NomiRuote(11).Nome = "Nazionale" 
        NomiRuote(11).NomeBreve = "Nz"
        NomiRuote(12).Nome = "Tutte"
        NomiRuote(12).NomeBreve = "TT"
        
        
        
        
        ReDim NomiSorte(5)
        
        NomiSorte(1).Nome = "Estratto"
        NomiSorte(1).NomeBreve = "E"
        NomiSorte(2).Nome = "Ambo"
        NomiSorte(2).NomeBreve = "A"
        NomiSorte(3).Nome = "Terno"
        NomiSorte(3).NomeBreve = "T"
        NomiSorte(4).Nome = "Quaterna"
        NomiSorte(4).NomeBreve = "Q"
        NomiSorte(5).Nome = "Cinquina"
        NomiSorte(5).NomeBreve = "C"


    End Sub

Bene arrivati a questo punto mi sono creato prima una variabile locale di array di strutture e poi due dichiarazioni distinte all'interno della classe archivio, inclusa una booleana che mi indicherà se l'archivio è stato letto e nel caso mi fa proseguire:

Codice:
 Class ClsArchivio
Private Shared Estrazioni() As StrEstrazione
Private StrEstrVuota As StrEstrazione
Private StrEstrTemp As StrEstrazione
Private mInizializzato As Boolean
End Class

e poi mi sono decicato alla Classe Archivio

Codice:
 Class ClsArchivio

    Sub InizializzaVariabili()       

        ReDim Estrazioni(0)
        mInizializzato = false
        ReDim StrEstrVuota.Ruote(11)

    End Sub

Function FileEsistente(File As String) As Boolean
        Dim FileEx As Boolean
        If System.IO.Directory.Exists(sFile) = True Then
            If System.IO.File.Exists(sFile & "Lotto.csv") = True Then
                FileEx = True
            End If
        End If
        Return FileEx
    End Function


    Public Sub AvviaLetturaArchivio(FileArchivio As String)

        InizializzaVariabili()

        If FileEsistente(FileArchivio) Then
            If AlimentaStrEstrazioni(FileArchivio) Then

                mInizializzato = True        
            End If
        End If

    End Sub
End Class

Bene, sperando di non aver scritto enormi put***te ahahah pubblicherò il resto in un altro messaggio.
 

lotto_tom75

Advanced Premium Member
Bene, dopo milioni di tentativi, ragionamenti, prove su carta...sono riuscito a tirare fuori qualcosa, anche se ora sono bloccato in un punto.
Come punto di partenza ho utilizzato l'archivio lotto in formato CSV (l'ho recuperato dal software RicercaLunghette) ed ho osservato la sua forma.. e da quella ho dedotto le strutture necessarie (i buon cari e vecchi UDT per chi ne sa qualcosa) necessari allo scopo ed è uscito questo:
Codice:
Module ModuleStrutture

'Struttura per il nome e nome breve che servirà per le ruote e la sorte
    Public Structure StrNomeRS
        Public Nome As String
        Public NomeAbbreviato As String
    End Structure

'Struttura che indicizzata indicherà il numero alla posizione 1 to 5 su ruote 1 to 11
    Public Structure StrNumeriEstrazione
  
        Public Estratto() As Integer

    End Structure


    Public Structure StrDataEstrazione
        Public Data As Date
        Public Numero As Long
        Public IndiceMensile As Long
        Public PrimaDelMeseBool As Long
        Public UltimaDelMeseBool As Long

    End Structure
 
    Public Structure StrEstrazione
    Public Ruote() As NumeriEstrazione
    Public Data As DataEstrazione
    Public identifier As Long       
    End Structure



End Module


Fatto ciò mi sono creato subito un modulo chiamato VariabiliGlobali dove ho inserito una stringa in cui vi è il percorso del file csv cosi:

Codice:
 Public PercorsoDatabase As String = Application.StartupPath() + "\Archivio\"

una procedura in grado di verificare la presente della cartella in cui risiederà l'archivio e qualora non fosse presente di crearla ... all'interno di un ModuloAssistente cosi:

Codice:
  Module Assistente
  Sub ControllaPercorsoDatabase()
 
        If System.IO.File.Exists(PercorsoDatabase) = False Then
            System.IO.Directory.CreateDirectory(PercorsoDatabase)     
        End If

    End Sub
End module

Ora all'avvio del programma ho pensato di effettuare due procedure fondamentali. Nell'avvio del programma inizialmente precarico il nome delle ruote e delle sorti (considerando che poi le ruote le richiamerò per alimentare le righe della tanto simpatica DataGridView che odio)
E poi alimento le strutture per poterle richiamare quando necessario.

quindi all'interno delle VariabiliGlobali ho inserito:

Codice:
Module VariabiliGlobali

    Public PercorsoDatabase As String = Application.StartupPath() + "\Archivio\"
    Public NomiRuote() As StrNomeRS
    Public NomiSorte() As StrNomeRS

End Module

e nel ModuleAssistente questa procedura:

Codice:
 Sub AlimentaRuoteSorte()

        ReDim NomiRuote(12)

        NomiRuote(1).Nome = "Bari"
        NomiRuote(1).NomeBreve = "Ba"
        NomiRuote(2).Nome = "Cagliari"
        NomiRuote(2).NomeBreve = "Ca"
        NomiRuote(3).Nome = "Firenze"
        NomiRuote(3).NomeBreve = "Fi"
        NomiRuote(4).Nome = "Genova"
        NomiRuote(4).NomeBreve = "Ge"
        NomiRuote(5).Nome = "Milano"
        NomiRuote(5).NomeBreve = "Mi"
        NomiRuote(6).Nome = "Napoli"
        NomiRuote(6).NomeBreve = "Na"
        NomiRuote(7).Nome = "Palermo"
        NomiRuote(7).NomeBreve = "Pa"
        NomiRuote(8).Nome = "Roma"
        NomiRuote(8).NomeBreve = "Rm"
        NomiRuote(9).Nome = "Torino"
        NomiRuote(9).NomeBreve = "To"
        NomiRuote(10).Nome = "Venezia"
        NomiRuote(10).NomeBreve = "Ve"
        NomiRuote(11).Nome = "Nazionale"
        NomiRuote(11).NomeBreve = "Nz"
        NomiRuote(12).Nome = "Tutte"
        NomiRuote(12).NomeBreve = "TT"
  
  
  
  
        ReDim NomiSorte(5)
  
        NomiSorte(1).Nome = "Estratto"
        NomiSorte(1).NomeBreve = "E"
        NomiSorte(2).Nome = "Ambo"
        NomiSorte(2).NomeBreve = "A"
        NomiSorte(3).Nome = "Terno"
        NomiSorte(3).NomeBreve = "T"
        NomiSorte(4).Nome = "Quaterna"
        NomiSorte(4).NomeBreve = "Q"
        NomiSorte(5).Nome = "Cinquina"
        NomiSorte(5).NomeBreve = "C"


    End Sub

Bene arrivati a questo punto mi sono creato prima una variabile locale di array di strutture e poi due dichiarazioni distinte all'interno della classe archivio, inclusa una booleana che mi indicherà se l'archivio è stato letto e nel caso mi fa proseguire:

Codice:
 Class ClsArchivio
Private Shared Estrazioni() As StrEstrazione
Private StrEstrVuota As StrEstrazione
Private StrEstrTemp As StrEstrazione
Private mInizializzato As Boolean
End Class

e poi mi sono decicato alla Classe Archivio

Codice:
 Class ClsArchivio

    Sub InizializzaVariabili() 

        ReDim Estrazioni(0)
        mInizializzato = false
        ReDim StrEstrVuota.Ruote(11)

    End Sub

Function FileEsistente(File As String) As Boolean
        Dim FileEx As Boolean
        If System.IO.Directory.Exists(sFile) = True Then
            If System.IO.File.Exists(sFile & "Lotto.csv") = True Then
                FileEx = True
            End If
        End If
        Return FileEx
    End Function


    Public Sub AvviaLetturaArchivio(FileArchivio As String)

        InizializzaVariabili()

        If FileEsistente(FileArchivio) Then
            If AlimentaStrEstrazioni(FileArchivio) Then

                mInizializzato = True  
            End If
        End If

    End Sub
End Class

Bene, sperando di non aver scritto enormi put***te ahahah pubblicherò il resto in un altro messaggio.

Che eri un super specialissimo horse... 🐴 l'avevo e avevamo... intuito da tempo 😉 L'unico forse qui dentro in grado davvero di diventare l'erede del sapere totale del Gran Maestro... Shifu... alias LuigiB :D. Nonostante anche per me, come per il maestro scripter ilegend, quello che hai scritto e condiviso, non essendo io programmatore, sia quasi totalmente arabo... o_O, ti faccio i miei più sinceri e sentiti complimenti Edo. Continua così and good work 💪👍👌👋🙂
 
Ultima modifica:

LuigiB

Premium Member
bravo , considerato che hai fatto tutto da solo dimostri senz'altro che non hai sprecato tempo
Ci sono alcune cose.
Come sai a differenza dei tipi udt del vecchio vb6 nelle structure del DotNet è possibile scrivere delle procdure.
E' proprio quell oche devi fare per dimensionare gli array al loro interno

ad esempio
Codice:
Public Structure StrNumeriEstrazione
     
        Dim Estratto() As Integer
    Sub DimensionaEstratto
        redim Estratto (5)
    End Sub
    End Structure

la cosa va applicata anche alle altre strutture che contengono array , un 'altra cosa i membri non è necessario dichiararli con public vedi che io ho messo Dim


Public PrimaDelMeseBool As Long
Public UltimaDelMeseBool As Long

questi valori non conviene registrarli ma calcolarli con un'apposita funzione


Numero as long

in dotnet il long non è il long del vb6 :) il long del vb6 in dotnet si chiama integer , non cambia molto ai fini del tuo programma ma non credo che che un numero di estrazione possa aver bisogno di un numero a 8 byte .. gia il long del vb6 era troppo.


Codice:
 Public PercorsoDatabase As String = Application.StartupPath() + "\Archivio\"

i valori di configurazioni non metterli hardcoded ma crea una classse/modulo che possa leggerli da un file ini , oddio i puristi mi ammazzeranno , in verità dovresti leggerli dai setting , solo che i setting sono una gran rottura di palle sia per il percorso dove li va a creare sia per modificarli eventualmente a mano. Invece il buon vecchio file ini sta nel path dell'eseguibile.
I nomi delle ruote edelel sorti invece li puoi lasciare hardcoded


.... inclusa una booleana che mi indicherà se l'archivio è stato letto e nel caso mi fa proseguire:

piu che gestire quella variabile crea una funzione che torni sempre un boolean che testa l'array delle estrazioni , se contiene elementi ovviamente deve tornare true

l'array delle estrazioni deve rimanere incapsulato nella classe quindi dichiaralo con private come tutte le altre variabil idelle classi , si accede alle variabili eventualmente tramite le proprietà.


nelle classi del dot net c'è il costruttore quindi mediante la sub new appena istanzi la classe questa viene eseguita ed è li che si fa l'inizializzazione delle variabili

Codice:
    Public Sub New()

    End Sub

alcune funzioni di utilità che possono servirti nell'intero progetto vanno trasferiti in un modulo/classe a parte

FileEsistente ad esempio è utile ma non devi dichiararlo nella classe che lo usa senno se in un'altra circostanza ti dovesse servire dovresti riscriverlo.
e cosi tutte le altre funzioni che come logica sono simili all'esempio.


non vedo la procedura alimentaEstrazioni :)

in compenso ti faccio il regalo di un modulo per gestire i parametri di configurazione , cosi stai un pezzo aventi , ci sono solo 2 funzioni pubbliche e sono quelle che devi usare per leggere e scrivere i valori.
I valori possibili si gestiscono aggiungendo i valori al tipo enumerato , per ora c'è solo la voce Archivio.

Ciao ..

Codice:
Imports System.Collections.Specialized
Imports System.Configuration



Public Module ModAppConfig

    ' ****  FUNZIONI PER LEGGERE IL FILE INI
    ' *******************************************
    Private Declare Unicode Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringW" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Int32, ByVal lpFileName As String) As Int32
    'la funzione WritePrivateProfileString dichiarata come Unicode
    Private Declare Unicode Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringW" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Long
    Private sFileIni As String = Application.ExecutablePath & ".ini"





    Public Enum eValoriAppConfig
        Archivio
    End Enum

    Private Sub iniLeggiRigaIni(ByVal sMenu As String, ByVal keyword As String, ByRef sValueRitorno As String, ByVal sPathFile As String, ByVal retval As Long)
        Dim stringa As String
        sValueRitorno = ""
        sMenu = UCase(sMenu)
        keyword = UCase(keyword)
        stringa = Space$(1000)
        retval = GetPrivateProfileString(sMenu, keyword, "", stringa, 1000, sPathFile)
        If retval <> 0 Then sValueRitorno = Mid$(stringa, 1, retval)


    End Sub
    Private Sub iniScriviRigaIni(ByVal sMenu As String, ByVal keyword As String, ByVal sValueDefault As String, ByVal sPathFile As String, ByVal retval As Long)
        sMenu = UCase(sMenu)
        keyword = UCase(keyword)
        retval = WritePrivateProfileString(sMenu, keyword, sValueDefault, sPathFile)
    End Sub


    Private Function GetNomeValoreAppCfg(ByVal eTipo As eValoriAppConfig) As String

        Return eTipo.ToString

    End Function
    Public Function GetValoreCfg(ByVal eTipo As eValoriAppConfig) As String
        Dim sValue As String = ""

        If sFileIni = "" Then
            Return My.Settings(GetNomeValoreAppCfg(eTipo))
        Else
            Call iniLeggiRigaIni("CONFIG", GetNomeValoreAppCfg(eTipo), sValue, sFileIni, 0)
            Return sValue
        End If
    End Function



    Public Sub SalvaValoreCfg(ByVal eTipo As eValoriAppConfig, ByVal sValue As String)

        If sFileIni = "" Then
            My.Settings(GetNomeValoreAppCfg(eTipo)) = sValue

            My.Settings.Save()

        Else
            Call iniScriviRigaIni("CONFIG", GetNomeValoreAppCfg(eTipo), sValue, sFileIni, 0)


        End If

    End Sub
End Module
 
Ultima modifica:

Edoardo_95

Advanced Member
Perfetto, seguendo i tuoi consigli e grazie al tuo modulo (mi hai salvato ahaha) il risultato è il il seguente:

Codice:
Public Class SchermataIniziale


    Private Sub SchermataIniziale_Load(sender As Object, e As EventArgs) Handles Me.Load
        Dim cArchivio As New ClsArchivio
        LabTitolo.Text = OttieniNomeAppEVersione()
        InizializzaFileConfig()
        ScriviTestoInLabel("Imposto elementi utili all'ambiente")
        AlimentaRuoteSorte()
        ScriviTestoInLabel("Lettura estrazioni")
        cArchivio.Inizializza(GetPercorsoArchivio)
        If cArchivio.Inizializzato = True Then
            Exit Sub
        Else
            MessageBox.Show("Archivio non caricato correttamente", "Eroore di caricamento", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If
    End Sub
    Sub ScriviTestoInLabel(Messaggio As String)
        LabMessaggio.Text = Messaggio
    End Sub
End Class

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

    Public Structure StrNumeriEstrazione

        Dim Estratto() As Integer
        Sub DimensionaEstratto()
            ReDim Estratto(5)
        End Sub
    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)
        End Sub
        Dim Data As StrDataEstrazione
        Dim identifier As Integer
    End Structure


End Module

Codice:
Module ModVarGlobal
    Public NomiRuote() As StrNomeRS
    Public NomiSorte() As StrNomeRS
End Module

Codice:
Module ModAssistent
    Sub AlimentaRuoteSorte()

        ReDim NomiRuote(12)

        NomiRuote(1).Nome = "Bari"
        NomiRuote(1).NomeAbbreviato = "Ba"
        NomiRuote(2).Nome = "Cagliari"
        NomiRuote(2).NomeAbbreviato = "Ca"
        NomiRuote(3).Nome = "Firenze"
        NomiRuote(3).NomeAbbreviato = "Fi"
        NomiRuote(4).Nome = "Genova"
        NomiRuote(4).NomeAbbreviato = "Ge"
        NomiRuote(5).Nome = "Milano"
        NomiRuote(5).NomeAbbreviato = "Mi"
        NomiRuote(6).Nome = "Napoli"
        NomiRuote(6).NomeAbbreviato = "Na"
        NomiRuote(7).Nome = "Palermo"
        NomiRuote(7).NomeAbbreviato = "Pa"
        NomiRuote(8).Nome = "Roma"
        NomiRuote(8).NomeAbbreviato = "Rm"
        NomiRuote(9).Nome = "Torino"
        NomiRuote(9).NomeAbbreviato = "To"
        NomiRuote(10).Nome = "Venezia"
        NomiRuote(10).NomeAbbreviato = "Ve"
        NomiRuote(11).Nome = "Nazionale"
        NomiRuote(11).NomeAbbreviato = "Nz"
        NomiRuote(12).Nome = "Tutte"
        NomiRuote(12).NomeAbbreviato = "TT"

        ReDim NomiRuote(5)

        NomiRuote(1).Nome = "Estratto"
        NomiRuote(1).NomeAbbreviato = "E"
        NomiRuote(2).Nome = "Ambo"
        NomiRuote(2).NomeAbbreviato = "A"
        NomiRuote(3).Nome = "Terno"
        NomiRuote(3).NomeAbbreviato = "T"
        NomiRuote(4).Nome = "Quaterna"
        NomiRuote(4).NomeAbbreviato = "Q"
        NomiRuote(5).Nome = "Cinquina"
        NomiRuote(5).NomeAbbreviato = "C"


    End Sub
    Function GetDirArchivio() As String
        GetDirArchivio = Application.ExecutablePath & "\Archivio\"
    End Function
    Function GetPercorsoArchivio() As String
        Dim sFileCsv As String
        sFileCsv = GetValoreCfg(eValoriAppConfig.Archivio)
        If FileEsistente(sFileCsv) = False Then
            sFileCsv = GetDirArchivio() & "Lotto.csv"
        End If
        Return sFileCsv

    End Function
End Module


Codice:
Module ModFunzioni
    Function FileEsistente(File As String) As Boolean
        Dim FileEx As Boolean
        If System.IO.File.Exists(File) = True Then
            FileEx = True
        End If
        Return FileEx
    End Function

    Function RimuoviUltimoCar(s As String, sChr As String) As String
        Dim CarattereRimosso As String
        If Right$(s, Len(sChr)) = sChr Then
            CarattereRimosso = Left$(s, Len(s) - Len(sChr))
        Else
            CarattereRimosso = s
        End If
        Return CarattereRimosso
    End Function

    Function OttieniNomeAppEVersione()
        Dim NomeSoftware As String
        Dim VersioneMaggiore As String
        Dim VersioneMinore As String
        Dim LabelSplashScreen As String
        Dim Revisione As String
        If My.Application.Info.Title <> "" Then
            NomeSoftware = My.Application.Info.Title
        Else
            NomeSoftware = System.IO.Path.GetFileNameWithoutExtension(My.Application.Info.AssemblyName)
        End If
        VersioneMaggiore = My.Application.Info.Version.Major
        VersioneMinore = My.Application.Info.Version.Minor
        Revisione = My.Application.Info.Version.Revision
        LabelSplashScreen = String.Format(NomeSoftware & " " & VersioneMaggiore & "." & VersioneMinore & "." & Revisione)
        Return LabelSplashScreen
    End Function
End Module

Codice:
Public Class ClsArchivio
    Private Estrazioni() As StrEstrazione
    Sub New()

        ReDim Estrazioni(0)

    End Sub
    Private Function AlimentaStrEstrazioni(File As String) As Boolean
        Dim AlimentaEstrazioni As Boolean = False
        Dim NumeroFile As Integer
        Dim EstrazioniTotali As Long
        Dim EstrazioniMassime As Long
        Dim RigheLette As Long
        Dim i As Integer, n As Integer
        Dim StringSpace As String
        Dim nSubStringRecord As Long
        Dim StrEstrTemp As StrEstrazione

        StrEstrTemp.DimensionaRuote()


        EstrazioniMassime = 10000

        ReDim Estrazioni(EstrazioniMassime)

        NumeroFile = FreeFile()
        FileOpen(NumeroFile, File, OpenMode.Binary, OpenAccess.Read)
        StringSpace = Space$(LOF(NumeroFile))
        FileGet(NumeroFile, StringSpace, 1)
        FileClose(NumeroFile)


        Dim aSubStringRecord(0) As String
        aSubStringRecord = Split(vbCrLf & RimuoviUltimoCar(StringSpace, vbCrLf), vbCrLf)
        nSubStringRecord = UBound(aSubStringRecord)

        For RigheLette = 1 To nSubStringRecord

            Dim SingElemRiga(0) As String

            SingElemRiga = Split(aSubStringRecord(RigheLette), ";")

            If SingElemRiga.Length = 58 Then
                ' 0 = identificativo estrazione
                ' 1 = numero estrazione
                ' 2 = data estrazione
                ' 3 = primo numero dell'estrazione
                i = 2
                For r = 1 To 11

                    Dim SingElemRigaNBool(90) As Boolean
                    For e = 1 To 5
                        i += 1
                        n = Val(SingElemRiga(i))

                        If NumeroValido(n) = True Then
                            If SingElemRigaNBool(n) = False Then
                                SingElemRigaNBool(n) = True
                                StrEstrTemp.Ruote(r).DimensionaEstratto()
                                StrEstrTemp.Ruote(r).Estratto(e) = n
                            End If
                        Else
                            MessageBox.Show("Numero non valido riga " & RigheLette & " colonna " & (i + 1) & " numero letto " & n, "Rilevato errore", MessageBoxButtons.OK, MessageBoxIcon.Error)
                            GoTo Fine
                        End If

                    Next

                Next

                EstrazioniTotali += 1

                If EstrazioniTotali > EstrazioniMassime Then
                    EstrazioniMassime += 1000
                    ReDim Preserve Estrazioni(EstrazioniMassime)
                End If
                Estrazioni(EstrazioniTotali) = StrEstrTemp

            End If
        Next

Fine:

        If EstrazioniTotali > 0 Then

            ReDim Preserve Estrazioni(EstrazioniTotali)
            'MessageBox.Show("Righe lette nel file " & RigheLette & vbCrLf & "Estrazioni caricate " & EstrazioniTotali, "Rilevato errore", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Estrazioni(EstrazioniTotali) = StrEstrTemp
            AlimentaEstrazioni = True
        Else
            ReDim Estrazioni(0)
            MessageBox.Show("Righe lette nel file " & RigheLette & vbCrLf & "Estrazioni caricate " & EstrazioniTotali, "Rilevato errore", MessageBoxButtons.OK, MessageBoxIcon.Error)

        End If

        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 Sub Inizializza(sFileArchivio As String)

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

End Class
 

Edoardo_95

Advanced Member
Mi mancano solo le funzioni per calcolare ciò che prima gestivo da structure

Dim PrimaDelMeseBool As Integer
Dim UltimaDelMeseBool As Integer

ma non ho la più pallida idea di dove cominciare .... anche perché il dato o lo estrapolo dal file csv con qualche if e un indice ... oppure boh ahaha
 

LuigiB

Premium Member
Ciao , allora :

SchermataIniziale cose'è un form ? Probabilemete lo è , inizia a rispettare una certa logica in modo da capire d al codice di che oggetto si tratta. Ogni oggetto dovrebbe avere un prefisso che ne indica il tipo per esempio frm , quindi frmSchermataIniziale è un nome appropriato.


Codice:
  Dim cArchivio As New ClsArchivio

la classe archvio ti servirà in tutto il progetto , va dschiarata public in un modulo. La sua inizializzazione va bene invece anche dove l'hai fatta

Codice:
Dim cArchivio As New ClsArchivio
   
      cArchivio.Inizializza(GetPercorsoArchivio)
ti avevo parlato dei costruttori delle classi , nei costruttori si possono passare dei parametri,
Il costruttore della classe è semplicemente uns sub il cui nome è New la quale viene richiamata se esiste appena si stanzia la classe.
Quindi devi scrivere questa sub nella tua classe arcchivio con il parametro del file delle estrazioni
quando la dichiarerai potrai istanziarla e inizializzarla in una sola riga , nella procedura new lanci quell oche facev in inizializza

dim c as new clsArchivio ("c:\Estrazioni.csv")




Codice:
Public Structure StrEstrazione
        Dim Ruote() As StrNumeriEstrazione
        Sub DimensionaRuote()
            ReDim Ruote(11)
        End Sub
        Dim Data As StrDataEstrazione
        Dim identifier As Integer
    End Structure
Public Structure StrNumeriEstrazione

        Dim Estratto() As Integer
        Sub DimensionaEstratto()
            ReDim Estratto(5)
        End Sub
    End Structure

dato che la struttura estrazioni fa uso sia delel ruote che dei numeri nella setessa funzione che serve per dimensionare le ruote fai un bel ciclo per lanciare la funzione che dimensiona gli estratti sulle ruote cosi ti trovi gia tutto pronto.


per leggere il file delle estrazioni non usare metodi arcaici che in questo caso non servono usa uno stream

quindi in cima allla classe archivio devi fare l'import per poter sfruttare lew classi offerte dal sistema

imports system.io

poi per leggere i lfile delle estrazioni usi un ciclo do simile al seguente , nota che dato che il file potrebeb non esistere (tu lo tesi ma non si sa mai) è stata inserita la gestione dell'errore per non far crashare il programma se il file non viene trovato

Codice:
        Dim sLine As String

        Try
            Dim str As New StreamReader(sFile)
            sLine = str.ReadLine
            Do Until sLine Is Nothing



                sLine = str.ReadLine
            Loop
            str.Close()
            str.Dispose()
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Errore", MessageBoxButtons.OK)

        End Try

riguardo il tuo questo per sapere se un 'estrazione è lòa prima o l'ultima d el mese ci vcuole semplicemente una funzione col parametro idEstrazione
in questa funzione verificherai se il mese corrente è uguale al mese precedente o successivo e saprai se è la prima o l'ultima , naturalmente per sapere se è l'ultima del mese è necessario che esista un 'estrazione dopo , insomma oltre a questo concetto devi gestire il fatto che ci sinao o meno estrazioni prima e dopo.. per esempi o se come id passo 1 che si fa ? e se passo l'id corrispondente all'ultima estrazione disponibile ?



bhe per ora m isono venute queste osservazioni.. ciao
 

Ultima estrazione Lotto

  • Estrazione del lotto
    martedì 18 gennaio 2022
    Bari
    76
    16
    68
    50
    18
    Cagliari
    10
    04
    90
    62
    11
    Firenze
    65
    57
    74
    77
    24
    Genova
    10
    82
    55
    43
    15
    Milano
    57
    78
    54
    81
    89
    Napoli
    54
    16
    19
    87
    58
    Palermo
    36
    48
    12
    24
    66
    Roma
    24
    23
    50
    02
    30
    Torino
    28
    43
    84
    76
    46
    Venezia
    37
    74
    29
    23
    34
    Nazionale
    63
    60
    39
    59
    35
    Estrazione Simbolotto
    Bari
    06
    39
    25
    09
    41
Alto