Novità

Mente da programmatore

il nome ruota lascialo stare magari lo metti in una colonna a parte , in questa funzione devi ottenere dall'archivio l'estrazione tramite il suo id , dopo diche con un ciclo leggi i numeri di quella ruota e li prendi se nell'array delle posizioni uscite c'è true
 
Ok allora

Codice:
    Private Function NumeriUscitiToString(strctU As struct_uscita) As String
        Dim SB As New StringBuilder
        Dim strctFrz As StrEstrazione
        If cArchivio.GetEstrazione(strctU.IdEstr, strctFrz) Then
            For e = 1 To 5
                If strctU.aPos(e) = True Then
                    SB.Append(strctFrz.Ruote(strctU.Ruota).Estratto(e))
                    SB.Append(" ")
                Else
                    SB.Append("..")
                    SB.Append(" ")
                End If
            Next
        End If
        Return SB.ToString
    End Function
 
bene dovrebbe andare ,naturalmente provandola te ne accorgi.
Ora a questo puntoio direi di arricchire un po questa fienstra aggiungendo atre funzioni , io aggiungerei ,
grafico del confronto tra reale e teorico
scomposizione della lunghetta selezionata in gruppi inferiori
cerchioi cclometrioc per la formazione in esame.

per farlo c'è da gestire anche la disposizione dei controlli nella finesta , ci aiutranno lo splittere container e il tabstrip.

1) rimuovi momentaneamente la proprietà dock delle liste e impostala a 0
2) inserisci uno splittercontainer e modifica la proprieta per averlo in orizzontale.
lo splittercontainer è un oggetto cmposto da due pannelli che possono essere disposti affinacati o uno sotto l'altro , a runtime compare la classica freccia contrapposta che consente di ridimensionare le aree dei pannelli

lo splitter container deve avere dock = fill

poi nel pannello superiore metti la listview delle lunghette e metti la proprietà dock = fille
nel pannello inferiore metti un tabstrip con 4 tab ,pure questo con dock = fill
nella prima tab metti la lista delle uscite che gia hai
nella seconda tab intanto metti un pannello con dock =top e poi u ncontrollo Chart con dock = fill
nel pannello metti una combobox cmbTipoGrafico e la alimenti con le voci Confronto teorico/reale e Distibuzione ritardi

fatot questo vedremo come fare il grafico
 
ok , nel pannello sopra i lgrafico metti una combobox , quella di cui sopra e alimentala come ti ho detto con quelle 2 voci
 
dato che le funzioni che alimentano la parte "sotto" si basano sulla statistica della formazione e dato che nel momento in cui uno seleziona un item nella lista principale si devono aggiornare i pannelli sottostanti devi creare una sub che verra lanciata al selection_changed della lista al posto di performadduscite

quiesta sub deve fare quello che attualmente fa PerformAddUScite , ovvero deve leggere tutti i parametri dall'item selezionato e fare la statistca delle formazione , questa formazione poi verra passata alle sub che creano il grafico e a quelle che alimentano la lista delle uscite
che comunque rimangono separate , in pratica a performadduscite metti il parametro Frz , la funzione che crera i lgrafico intanto scrivila e mettici un select case i nfunzione dell'item selexzionato in tipo grafico
 
Fatto

Senza titolo.png


Private Sub frmStatLung_Load(sender As Object, e As EventArgs) Handles Me.Load
LoadComboSorte(cmbSorte)
LoadComboConf()
addcolumns()
CtlSelPosizione1.SetCheckSelezionate(DefaultCheckPos())
End Sub
Sub LoadComboConf()
cmbTipoGrafico.Items.Add("Distibuzione ritardi")
cmbTipoGrafico.Items.Add("Confronto teorico")
End Sub







ok ho letto ora procedo e rettifico
 
ok quindi vediamo se è corretto in questo modo :

Codice:
    Private Sub frmStatLung_Load(sender As Object, e As EventArgs) Handles Me.Load
        LoadComboSorte(cmbSorte)
        LoadComboConf()
        addcolumns()
        CtlSelPosizione1.SetCheckSelezionate(DefaultCheckPos())
    End Sub

    Sub LoadComboConf()
        cmbTipoGrafico.Items.Add("Distibuzione ritardi")
        cmbTipoGrafico.Items.Add("Confronto teorico/reale")
    End Sub

    Private Sub PerformAddUscite(frz As struct_formazione)
        Dim aNumeri() As Integer = Nothing
        Dim aRuote() As Boolean
        Dim aPos() As Boolean = Nothing
        Dim nSorte As Integer
        Dim Inizio As Integer
        Dim fine As Integer
        Dim itm As ListViewItem
        If Me.CtlLvOrdinabile1.SelectedItems.Count Then
            Dim itmSel As ListViewItem = CtlLvOrdinabile1.SelectedItems(0)


            GetArrayNumeriFromString(itmSel.Text, aNumeri)
            aRuote = StringaRuoteToBool(itmSel.SubItems(1).Text, ".")
            nSorte = ConvertToInt(itmSel.SubItems(2).Text)
            Inizio = ConvertToInt(itmSel.SubItems(8).Text)
            fine = ConvertToInt(itmSel.SubItems(9).Text)
            StringaNumeriToArray(itmSel.SubItems(10).Text, aPos, 5)


            If frz.Inizializza(aNumeri, aRuote, nSorte, Inizio, fine, aPos) Then
                CtlLvOrdinabile2.Items.Clear()
                cArchivio.StatFormazione(frz)
                For k = 0 To UBound(frz.aUscite)
                    itm = CtlLvOrdinabile2.Items.Add(frz.aUscite(k).IdEstr)
                    itm.SubItems.Add(cArchivio.GetDataEstrazione(frz.aUscite(k).IdEstr))
                    itm.SubItems.Add(NumeriUscitiToString(frz.aUscite(k)))
                    itm.SubItems.Add(frz.aUscite(k).Ritardo)
                    itm.SubItems.Add(frz.aUscite(k).RitardoMax)
                    itm.SubItems.Add(frz.aUscite(k).Presenze)
                    itm.SubItems.Add(frz.aUscite(k).Frequenza)
                    itm.SubItems.Add(frz.aUscite(k).IncrRitMax)
                Next
            End If
        End If
    End Sub

    Sub ReadParameter()
        Dim frz As New struct_formazione
        PerformAddUscite(frz)
    End Sub

    Function ChartCreate()
        Select Case cmbTipoGrafico.SelectedItem
            Case "Distibuzione ritardi"

            Case "Confronto teorico/reale"

        End Select
    End Function

    Private Sub CtlLvOrdinabile1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CtlLvOrdinabile1.SelectedIndexChanged
        ReadParameter()
    End Sub
 
Fatto

Vedi l'allegato 2225440


Private Sub frmStatLung_Load(sender As Object, e As EventArgs) Handles Me.Load
LoadComboSorte(cmbSorte)
LoadComboConf()
addcolumns()
CtlSelPosizione1.SetCheckSelezionate(DefaultCheckPos())
End Sub
Sub LoadComboConf()
cmbTipoGrafico.Items.Add("Distibuzione ritardi")
cmbTipoGrafico.Items.Add("Confronto teorico")
End Sub







ok ho letto ora procedo e rettifico

Ben tornato e ben riletto (per me le righe che state postando sono quasi geroglifici :eek::D ma comunque interessanti! 😄) Ciao grandissimo 👋;)
 
ciao non è corretotto , devi fare una sub che richiama le altre passandogli frz.
Quindi in questa sub principale devi fare la parte che facevi prima in PerformAddUscite , ora a PerformAddUscite deve arrivare una variabile frz gia valoriozzata , e cosi pure alla sub che disegna il grafico
 
Quindi

Codice:
    Private Sub PerformAddUscite(frz As struct_formazione)
        Dim itm As ListViewItem
        For k = 0 To UBound(frz.aUscite)
            itm = CtlLvOrdinabile2.Items.Add(frz.aUscite(k).IdEstr)
            itm.SubItems.Add(cArchivio.GetDataEstrazione(frz.aUscite(k).IdEstr))
            itm.SubItems.Add(NumeriUscitiToString(frz.aUscite(k)))
            itm.SubItems.Add(frz.aUscite(k).Ritardo)
            itm.SubItems.Add(frz.aUscite(k).RitardoMax)
            itm.SubItems.Add(frz.aUscite(k).Presenze)
            itm.SubItems.Add(frz.aUscite(k).Frequenza)
            itm.SubItems.Add(frz.aUscite(k).IncrRitMax)
        Next
    End Sub
    Sub ReadParameter()
        Dim frz As New struct_formazione
        Dim aNumeri() As Integer = Nothing
        Dim aRuote() As Boolean
        Dim aPos() As Boolean = Nothing
        Dim nSorte As Integer
        Dim Inizio As Integer
        Dim fine As Integer
        If Me.CtlLvOrdinabile1.SelectedItems.Count Then
            Dim itmSel As ListViewItem = CtlLvOrdinabile1.SelectedItems(0)
            GetArrayNumeriFromString(itmSel.Text, aNumeri)
            aRuote = StringaRuoteToBool(itmSel.SubItems(1).Text, ".")
            nSorte = ConvertToInt(itmSel.SubItems(2).Text)
            Inizio = ConvertToInt(itmSel.SubItems(8).Text)
            fine = ConvertToInt(itmSel.SubItems(9).Text)
            StringaNumeriToArray(itmSel.SubItems(10).Text, aPos, 5)
            If frz.Inizializza(aNumeri, aRuote, nSorte, Inizio, fine, aPos) Then
                CtlLvOrdinabile2.Items.Clear()
                cArchivio.StatFormazione(frz)
                PerformAddUscite(frz)
                ChartCreate(frz)
            End If
        End If

    End Sub
   
   Private Function ChartCreate(frz As struct_formazione)
        Select Case cmbTipoGrafico.SelectedItem
            Case "Distibuzione ritardi"

            Case "Confronto teorico/reale"

        End Select
    End Function

    Private Sub CtlLvOrdinabile1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CtlLvOrdinabile1.SelectedIndexChanged
        ReadParameter()
    End Sub
 
Ultima modifica:
perfetto credo che dovrebeb andare , ora nella funzione dle grafico nella parte del confronto reale teorico metti qusto codice

il grfico assume i dati da una tabella di dati creata a runtime , noi dobbiamo prima creare in memoria questa tabella impostando i campi che ci servono e dopo la dobbiamo alimentare per darla in pasto al grafico.
Quali sono i valori che ci servono ? per la coordinata X andremo ad usare l'indice dell'estrazione , per la coordunata y avremmo bisogno di 2 valori
perche devono esserre create2 linee,
Il primo valore è il valore reale di uscite , il secondo quello teorico.
Ora tu nella formazione hai l'array delle uscite , per ogni elemento hai l'id dell'estrazione di uscita , le presenze fino a quel momento , la quantita di estrazioni eseminata in quel momento
quindi con l'id dell'estrazione hai la X m con le presenze hai la y del valore reale , dividendo le estrazioni esaminate per il ritardo naturale avrai l a y teorica.
Quindi con un ciclo si alimentano tutti questi valori nella tabella dopo di che si prepara il grafico.
Innanzitutto dobbiamo istanziare una chartharea nelal quale iseriremo le nostrte serie che sono 2 quella reale e quelal teorica , impostiamo alcuni proprietà del grafico che in verità non ci interessano molto e poi andiamo ad istanziare due nuove serie impostandone le proprietà , e le aggiungiamo alla collezione delle serie , poi impostando le opportune proprietà andiamo ad associare i valori alle serie e infine impostiamo i ldatasouce del grafco con la nostra tabella.

prova ad inserire questo codice nella sub che disegna il grafico del confrono reale teorico



Codice:
                nRitNat = RitardoNaturale(frz.GetQuantitaNumeri, frz.Sorte, frz.GetQuantitaPosUsate, frz.GetQuantitaRuoteUsate)





                Dim table As New DataTable

                table.Columns.Add("x", GetType(Integer))
                table.Columns.Add("yPres", GetType(Integer))
                table.Columns.Add("yTeo", GetType(Integer))



                For k = 0 To UBound(frz.aUscite)
                    table.Rows.Add(frz.aUscite(k).IdEstr, frz.aUscite(k).Presenze, frz.aUscite(k).EstrEsam / nRitNat)
                Next

                Dim ChartArea1 As ChartArea = New ChartArea()
                Dim Legend1 As Legend = New Legend()
                Dim Series1 As Series = New Series()
                Dim Series2 As Series = New Series()

                Chart1.ChartAreas.Clear()
                Chart1.Legends.Clear()
                Chart1.Series.Clear()

                ChartArea1.Name = "ChartArea1"
                ChartArea1.AxisX.IsMarginVisible = False
                Chart1.ChartAreas.Add(ChartArea1)
                Legend1.Name = "Legend1"
                Chart1.Legends.Add(Legend1)
                Chart1.Name = "Chart1"

                Series1.ChartArea = "ChartArea1"
                Series1.Legend = "Legend1"
                Series1.Name = "Reali"
                Series1.ChartType = SeriesChartType.Line
                Series1.Color = Color.Red
                Series1.BorderWidth = 2

                Series2.ChartArea = "ChartArea1"
                Series2.Legend = "Legend1"
                Series2.Name = "Teoriche"
                Series2.ChartType = SeriesChartType.Line
                Series2.Color = Color.Green
                Series2.BorderWidth = 2

                Chart1.Series.Add(Series1)
                Chart1.Series.Add(Series2)





                Chart1.Text = "Confronto presenze reali/teoriche RN " & Math.Round(nRitNat, 2)
                Chart1.Series("Reali").XValueMember = "x"
                Chart1.Series("Reali").YValueMembers = "yPres"
                Chart1.Series("Teoriche").XValueMember = "x"
                Chart1.Series("Teoriche").YValueMembers = "yTeo"

                Chart1.Titles.Add(Chart1.Text)


                Chart1.DataSource = table
 
ancora meglio ora che dovrai fare tu l'altro grafico :-)
Allora nel grafico delal distribuziione dei ritardi abbiamo uan sola serie , inanzi tutto useremo un istogramma quindi va cambiata la proprieta che abbiamo usato per fare le linee.
Questo istogramma dovra rappresentare quanti numeri sono usciti al ritardo 0 quanti al ritardo 1 e cosi via fino al ritardo 100 , poi al 101 si aggiungono tutte le altre uscite.
Dovrai preima crearti un array per fare i conteggi , posi scorrere l'array dlle uscite econteggiare le uscite al ritardo.
Una volta che hai questo arrya puo iusarl oper alimentare la tabellina in memoria ch e questa volta avra solo 2 campi la x e la y.
Alla x metteremo il valore del ritardo da 0 a n alla y la quantita di uscite .

sulla falsa riga del grafico di prima ora devi scrivere tu questa parte
 
Allora ho avuto un pò di difficoltà ma se ho capito bene dovrebbe essere così:

Codice:
                Dim table As New DataTable
                table.Columns.Add("x", GetType(Integer))
                table.Columns.Add("y", GetType(Integer))
                For k = 0 To UBound(frz.aUscite)
                    table.Rows.Add(frz.aUscite(k).Ritardo, frz.aUscite(k).Presenze)
                Next
                Dim ChartArea1 As ChartArea = New ChartArea()
                Dim Legend1 As Legend = New Legend()
                Dim Series As Series = New Series()
                Chart1.ChartAreas.Clear()
                Chart1.Legends.Clear()
                Chart1.Series.Clear()
                'Chart1.Titles.Clear()

                ChartArea1.Name = "ChartArea1"
                ChartArea1.AxisX.IsMarginVisible = False
                Chart1.ChartAreas.Add(ChartArea1)
                Legend1.Name = "Legend1"
                Chart1.Legends.Add(Legend1)
                Chart1.Name = "Chart1"

                Series.ChartArea = "ChartArea1"
                Series.Legend = "Legend1"
                Series.Name = "Ritardi"
                Series.ChartType = SeriesChartType.Column
                Series.Color = Color.Blue
                Series.BorderWidth = 2

                Chart1.Series.Add(Series)
                Chart1.Text = "Distibuzione ritardi"

                Chart1.Series("Ritardi").XValueMember = "x"
                Chart1.Series("Ritardi").YValueMembers = "y"
                Chart1.Titles.Add(Chart1.Text)


                Chart1.DataSource = table
 
ciao , no , è necessario prima conteggiare quanti numeri sono usciti al tale ritardo , questo lo farai con un array intermedio.
Una volta che hai alimentato questo array potrai alimentare con quei valori la datatable
In questo array tu dovrai avere all'elemento 0 quanti uscite sono al ritardo 0 , all'elemento 1 quante al ritardo 1 , fin oa 101 dove vai a sommare tutte le uscite > 100 .
alla fine avrai
a(0) = 20
a(1) = 15
..
..
a(101) =10

nel grafico la x è i ltitolo della colonna non è una coordinata quindi nella tabella il campo della x puo essere una stringa , anzi devi farlo stringa poi ci scrivi "=0" , "=1" , ...., "=100" , ">100"
alla y invece metti il valore contenuto in quell'elemento.
 

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