Option Explicit
            Class clsLunghetta
             Private aNumeri ' contiene i numeri della lunghetta
             Private mInizio,mFine,aRuote,mSorte ' parametri per il range analisi
             Private mClasse ' contine la classe della lunghetta
             Private aElencoRit ' conterra l'elenco dei ritardi per la lunghetta
             Private aIdEstrElencoRit ' conterra l'elenco dei ritardi per la lunghetta
             Private aElencoIncrRitMax ' contiene l'elnco degli incrementi del ritardo max
             Private aIdEstrIncrRitMax ' conterra l'elenco degli id estrazione in
             ' cui si è registrato l'incremento del ritmax conosciuto
             Private aRitardiAllIncremento ' contiene il valore del ritardo all'idestrazione in cui
             ' si è verificato l'incremento
             Private mRitardo,mRitardoMax,mIncrRitMax,mFrequenza ' valori statistici
             Private mIncrRitardoMaxSto,mStrIncRitSto
             Public Property Get IncrRitMaxSto
             IncrRitMaxSto = mIncrRitardoMaxSto
             End Property
             Public Property Get strIncRitMaxSto
             strIncRitMaxSto = mStrIncRitSto
             End Property
             Public Property Get Ritardo
             Ritardo = mRitardo
             End Property
             Public Property Get RitardoMax
             RitardoMax = mRitardoMax
             End Property
             Public Property Get IncrRitMax
             IncrRitMax = mIncrRitMax
             End Property
             Public Property Get Frequenza
             Frequenza = mFrequenza
             End Property
             Public Property Get LunghettaString
             LunghettaString = StringaNumeri(aNumeri)
             End Property
             ' inizializza le proprietà dell'oggetto
             Sub Init(sLunghetta,sChrSep,RangeInizio,RangeFine,vetRuote,SorteInGioco)
             ' acquisisco i parametri per l'analisi
             mInizio = RangeInizio
             mFine = RangeFine
             aRuote = vetRuote
             mSorte = SorteInGioco
             ' alimento il vettore con i numeri della lunghetta
             Call AlimentaVettoreLunghetta(sLunghetta,sChrSep)
             ' calcolo l'elenco dei ritardi
             Call ElencoRitardiTurbo(aNumeri,aRuote,mSorte,mInizio,mFine,aElencoRit,aIdEstrElencoRit)
             ' alimento il vettore che contien l'elenco degli incrementi rit max
             Call AlimentaVettoreIncrRitMax
             End Sub
             ' esegue il calcolo dei valori statistici della lunghetta
             Sub EseguiStatistica
             Call StatisticaFormazioneTurbo(aNumeri,aRuote,mSorte,mRitardo,mRitardoMax,mIncrRitMax,mFrequenza,mInizio,mFine)
             End Sub
             Private Sub AlimentaVettoreLunghetta(sLunghetta,sChrSep)
             Dim k
             If IsArray(sLunghetta) Then
             ' se la lunghetta è gia un array lo copio nel vettore locale dei numeri
             ReDim aNumeri(UBound(sLunghetta))
             For k = 1 To UBound(sLunghetta)
             aNumeri(k) = sLunghetta(k)
             Next
             Else
             ' antepongo un carattere separatore per fare in modo che
             ' aNumeri si valorizzi dall'indice 1 (senno si sarebeb valorizzato dall'indice 0)
             Call SplitByChar((sChrSep & sLunghetta),sChrSep,aNumeri)
             End If
             ' valorizzo la classe della lunghetta
             mClasse = UBound(aNumeri)
             End Sub
             Private Sub AlimentaVettoreIncrRitMax
             Dim nRitMax,nIncr,nId,k
             nId = 0
             ' inizializzo il vettore a 0 elementi
             ReDim aElencoIncrRitMax(0)
             ReDim aIdEstrIncrRitMax(0)
             ReDim aRitardiAllIncremento(0)
             ' ciclo sul vettore dei ritardi
             For k = 1 To UBound(aElencoRit)
             ' se il ritardo corrente supera il ritmax attuale..
             If aElencoRit(k) > nRitMax Then
             If nRitMax > 0 Then
             ' se il ritmax attuale è >0 (ivvero ne esiste uno)
             ' calcolo di quanto si è incrementato
             nIncr = aElencoRit(k) - nRitMax
             ' incremento il contatore dei valori trovati
             nId = nId + 1
             ' ridimensiono il vettore mantenendo i valori precedenti ma
             ' aggiungendone uno
             ReDim Preserve aElencoIncrRitMax(nId)
             ' memorizzo il valore
             aElencoIncrRitMax(nId) = nIncr
             ' ridimensiono il vettore mantnendo i valori precedenti ma
             ' aggiungendone uno
             ReDim Preserve aIdEstrIncrRitMax(nId)
             ' memorizzo l'id dell'estrazione dove si è avuto l'incremento
             aIdEstrIncrRitMax(nId) = aIdEstrElencoRit(k)
             ' ridimensiono il vettore mantnendo i valori precedenti ma
             ' aggiungendone uno
             ReDim Preserve aRitardiAllIncremento(nId)
             ' memorizzo il valore del ritardo all'id dell'estrazione dove si è avuto l'incremento
             aRitardiAllIncremento(nId) = aElencoRit(k)
             End If
             nRitMax = aElencoRit(k)
             End If
             Next
             mStrIncRitSto = StringaNumeri(aElencoIncrRitMax,,True)
             End Sub
             Function IsCondizioneRispettata
             ' verifica che l'incremento dell'ultimo ritmax sia uguale al massimo incr rit max conosciuto.
             Dim nUpper
             nUpper = UBound(aElencoIncrRitMax)
             mIncrRitardoMaxSto = MassimoV(aElencoIncrRitMax,1,nUpper - 1)
             If aElencoRit(UBound(aElencoRit)) > 0 And aIdEstrIncrRitMax(nUpper) = mFine Then
             IsCondizioneRispettata =(aElencoIncrRitMax(nUpper) >= mIncrRitardoMaxSto)
             Else
             IsCondizioneRispettata = False
             End If
             End Function
             Sub DisegnaGraficoIncrRitMax
             Dim x,y,k
             Dim nValoreMaxX,nValoreMaxY,nValoreMinX
             Dim nStepX,nStepY
             Dim nUpperVetIncrRit
             nValoreMinX = MinimoV(aIdEstrIncrRitMax,1)
             nValoreMaxX = aIdEstrIncrRitMax(UBound(aIdEstrIncrRitMax))
             nValoreMaxY = MassimoV(aElencoRit,1)
             nStepX =(nValoreMaxX -(mInizio - 1)) \10
             nStepY = nValoreMaxY \10
             Call PreparaGrafico("Formaziione " & StringaNumeri(aNumeri),nValoreMinX,nValoreMaxX,0,nValoreMaxY,nStepX,nStepY)
             nUpperVetIncrRit = UBound(aElencoIncrRitMax)
             ' linea dell'incremento rit max
             ReDim aV(nUpperVetIncrRit - 1,2)
             For k = 1 To nUpperVetIncrRit
             x = aIdEstrIncrRitMax(k)
             y = aElencoIncrRitMax(k)
             aV(k - 1,1) = x
             aV(k - 1,2) = y
             Next
             Call DisegnaLineaGrafico(aV,vbRed,"IncrRitMax")
             ' linea dell' rit max
             ReDim aV(nUpperVetIncrRit - 1,2)
             For k = 1 To nUpperVetIncrRit
             x = aIdEstrIncrRitMax(k)
             y = aRitardiAllIncremento(k)
             aV(k - 1,1) = x
             aV(k - 1,2) = y
             Next
             Call DisegnaLineaGrafico(aV,vbBlue,"RitMax")
             ' scrive grafico nell'output
             Call InserisciGrafico
             End Sub
            End Class
            Sub Main
             Dim Inizio,Fine,aRuote,Sorte
             Inizio = EstrazioneIni
             Fine = EstrazioneFin
             Sorte = ScegliEsito
             Call ScegliRuote(aRuote,Nothing)
             If(Fine > Inizio) And UBound(aRuote) > 0 And Sorte > 0 Then
             Select Case ScegliTipoSviluppo
             Case 1
             Call AnalisiLunghetteFromFileTxt(Inizio,Fine,aRuote,Sorte)
             Case 2
             Call AnalisiLunghetteFromNumeriCasuali(Inizio,Fine,aRuote,Sorte)
             Case 3
             Call AnalisiLunghetteFromSceglinumeri(Inizio,Fine,aRuote,Sorte)
             End Select
             End If
            End Sub
            Function ScegliTipoSviluppo
             ReDim aVoci(3)
             aVoci(1) = "Da file txt con lunghette"
             aVoci(2) = "Da sviluppo casuale"
             aVoci(3) = "Da sviluppo tabellare"
             ScegliTipoSviluppo = ScegliOpzioneMenu(aVoci,1)
            End Function
            Function GetChrSepFromRiga(sRiga)
             Dim k,schr
             schr = ""
             For k = 1 To Len(sRiga)
             schr = Mid(sRiga,k,1)
             If IsNumeric(schr) = False Then
             Exit For
             End If
             Next
             GetChrSepFromRiga = schr
            End Function
            Sub AnalisiLunghetteFromFileTxt(Inizio,Fine,aRuote,Sorte)
             Dim sFile,aLunghette,nTotLunghette
             Dim k,sChrSep
             Dim clsL,collLunghette
             Set collLunghette = GetNewCollection
             sFile = ScegliFile(GetDirectoryAppData,".txt")
             If FileEsistente(sFile) Then
             Call LeggiRigheFileDiTesto(sFile,aLunghette)
             nTotLunghette = UBound(aLunghette)
             If nTotLunghette > 0 Then
             sChrSep = GetChrSepFromRiga(aLunghette(1))
             For k = 0 To nTotLunghette
             Set clsL = New clsLunghetta
             Call clsL.Init(aLunghette(k),sChrSep,Inizio,Fine,aRuote,Sorte)
             If clsL.IsCondizioneRispettata Then
             Call clsL.EseguiStatistica
             collLunghette.Add clsL
             End If
             If k Mod 50 = 0 Then
             Call Messaggio("Righe esaminate : " & k)
             Call AvanzamentoElab(1,nTotLunghette,k)
             If ScriptInterrotto Then Exit For
             End If
             Next
            
            'prova report solo per casi con incmaxsto = incmax
            
            'If (clsL.IncrRitMax = clsL.IncrRitMaxSto) Then
            ' Call Scrivi(" IncrRitMaxSto : " & clsL.IncrRitMaxSto)
            
             Scrivi "Range analisi : " & GetInfoEstrazione(Inizio) & "-" & GetInfoEstrazione(Fine)
             Scrivi "Lunghette esaminate : " & nTotLunghette + 1 & " Valide : " & collLunghette.count
             Scrivi "Sorte : " & NomeSorte(Sorte)
             Scrivi "Ruote : " & StringaRuote(aRuote)
             Scrivi
             Call Scrivi
             If collLunghette.count > 0 Then
             Call OrdinaItemCollection(collLunghette,"IncrRitMax",,,- 1)
             For Each clsL In collLunghette
            
            If(clsL.IncrRitMax - clsL.IncrRitMaxSto = 0) Then
            
                    
             Call Scrivi("Lunghetta : " & clsL.LunghettaString)
             Call Scrivi("Ritardo : " & clsL.Ritardo)
             Call Scrivi("RitMax : " & clsL.RitardoMax)
             Call Scrivi("Freq : " & clsL.Frequenza)
             Call Scrivi("IncrRitMx : " & clsL.IncrRitMax)
             Call Scrivi(" IncrRitMaxSto : " & clsL.IncrRitMaxSto)
             Call Scrivi(" s incrementi : " & clsL.strIncRitMaxSto)
             Call clsL.DisegnaGraficoIncrRitMax
            
            End If
            
             Next
             Else
             Scrivi "Nessuna lunghetta rispetta le condizioni"
             Scrivi "Lunghette esaminate " & nTotLunghette + 1
             End If
             End If
             End If
            
            'End If
            'fine prova selezione report solo per i casi voluti...
            
            End Sub
            
            Sub AnalisiLunghetteFromNumeriCasuali(Inizio,Fine,aRuote,Sorte)
             Dim sFile,aLunghette,nTotLunghette,nClasse
             Dim nTrov,nProdotte
             Dim clsL,collLunghette
             Set collLunghette = GetNewCollection
             nTotLunghette = Int(InputBox("Quante lunghette devono essere trovate ?",,10))
             nClasse = Int(InputBox("Quanti numeri nella lunghetta",,Sorte))
             If nTotLunghette > 0 And nClasse >= Sorte And nClasse Then
             Call OrdinaItemCollection(collLunghette,"IncrRitMax",,,- 1)
             For Each clsL In collLunghette
            
            
            If(clsL.IncrRitMax - clsL.IncrRitMaxSto = 0) Then
            
            
             Call Scrivi("Lunghetta : " & clsL.LunghettaString)
             Call Scrivi("Ritardo : " & clsL.Ritardo)
             Call Scrivi("RitMax : " & clsL.RitardoMax)
             Call Scrivi("Freq : " & clsL.Frequenza)
             Call Scrivi("IncrRitMx : " & clsL.IncrRitMax)
Call Scrivi(" IncrRitMaxSto : " & clsL.IncrRitMaxSto)
Call Scrivi(" s incrementi : " & clsL.strIncRitMaxSto)
             Call clsL.DisegnaGraficoIncrRitMax
            
            
            End If
            
             Next
             Else
             Scrivi "Nessuna lunghetta rispetta le condizioni"
             Scrivi "Lunghette esaminate " & nTotLunghette
             End If
             'End If
            End Sub
Sub AnalisiLunghetteFromSceglinumeri(Inizio,Fine,aRuote,Sorte)
Dim nTotLunghette
Dim k,sChrSep,nClasse
ReDim aLunghette(0)
Dim clsL,collLunghette
Set collLunghette = GetNewCollection
sChrSep = " "
ScegliNumeri(aLunghette)
nClasse = CInt(InputBox(" classe sviluppo ",,2))
nTotLunghette = InitSviluppoIntegrale(aLunghette,nClasse)
k = 0
Do While GetCombSviluppo(aLunghette)
k = k + 1
Set clsL = New clsLunghetta
Call clsL.Init(aLunghette,sChrSep,Inizio,Fine,aRuote,Sorte)
If clsL.IsCondizioneRispettata Then
Call clsL.EseguiStatistica
collLunghette.Add clsL
End If
If k Mod 50 = 0 Then
Call Messaggio("Righe esaminate " & k & "  valide " & collLunghette. count)
DoEventsEx
Call AvanzamentoElab(1,nTotLunghette,k)
If ScriptInterrotto Then Exit Do
End If
Loop
Scrivi "Range analisi       : " & GetInfoEstrazione(Inizio) & " - " & GetInfoEstrazione(Fine)
Scrivi "Lunghette esaminate : " & nTotLunghette & " Valide : " & collLunghette.count
Scrivi "Sorte               : " & NomeSorte(Sorte)
Scrivi "Ruote               : " & StringaRuote(aRuote)
Scrivi
Scrivi "Lunghette ordinate per incremento ritardo max",True,,vbYellow
Call Scrivi
If collLunghette.count > 0 Then
Call OrdinaItemCollection(collLunghette,"IncrRitMax",,,- 1)
For Each clsL In collLunghette
If(clsL.IncrRitMax - clsL.IncrRitMaxSto = 0) Then
Call Scrivi("Ritardo   : " & clsL.Ritardo)
Call Scrivi("RitMax    : " & clsL.RitardoMax)
Call Scrivi("Freq      : " & clsL.Frequenza)
Call Scrivi("IncrRitMx : " & clsL.IncrRitMax)
Call Scrivi(" IncrRitMaxSto : " & clsL.IncrRitMaxSto)
Call Scrivi(" s incrementi : " & clsL.strIncRitMaxSto)
Call clsL.DisegnaGraficoIncrRitMax
End If
Next
Else
Scrivi "Nessuna lunghetta rispetta le condizioni"
Scrivi "Lunghette esaminate " & nTotLunghette
End If
'End If
'End If
End Sub