Di recente nelle pagine della documentazione
ufficiale di Gambas è stato inserito il codice postato da Milio in
questa discussione e che era diventato anche
lezione nella nostra Wiki ho deciso di provare la lezione e mi sono accorto che qualcosa non va ma prima di comunicarlo vorrei il vostro giudizio.
Il codice di Milio funziona così:
Inizia col
ciclare tutte le righe della griglia (
GridView) inserendo i dati contenuti nella colonna da ordinare (
GridView1.Columns.Sort restituisce il numero di colonna) dentro il vettore (array)
Values.
Il vettore
ValueSorted copia i dati di Values e li ordina in base al risultato boleano restituito da
GridView1.Columns.Ascending.
A questo punto il codice inizia col
ciclare riga per riga e ad ogni riga inizia il secondo ciclo quello interno che scansiona tutte le colonne una a una.
Consideriamo ora il primo ciclo sia esterno (
righe) che interno (
colonne).
Ci troviamo pertanto ad analizzare i dati della prima riga della griglia cella per cella.
La prima cella della prima riga contiene i dati relativi all'ordinamento iniziale quello memorizzato attualmente nel vettore
Values, il codice avvalendosi di
Swap il metodo che permette di scambiare i valori passando quelli di una variabile all'altra e viceversa e avvalendosi anche del vettore ordinato
ValueSorted cerca, attraverso il suo numero, la riga che deve prendere il posto della prima e ne scambia i valori facendo la stessa cosa per ogni cella.
Ma vediamo più da vicino cosa esattamente combina qui
Swap perché non è del tutto evidente in prima lettura, potremo così apprezzare come il codice scritto sia geniale nella sua semplicità.
Nella griglia ci si sposta così
GridView1[riga, colonna] la riga, ottenuta dal ciclo esterno come già detto attualmente è la prima (0) e lo è per tutto il ciclo interno, attualmente è prima anche la colonna (0) e il valore è dato da
Text.
Con
Swap scambiamo questo valore con quello trovato attraverso il metodo
Find che ci restituisce il numero di riga del vettore
Values (quello che conserva i valori originali) cercato attraverso il primo valore del vettore ordinato.
Quindi noi scambiamo uno a uno,
ciclandoli per riga e per colonna, i valori della griglia basandoci sulle colonne di ordinamento originale e ordinata.
Occorre fare particolare attenzione a
Find che così come è scritto qui
Find(ValueSorted[Nx], 0, Nx) significa “trova (in Values) il valore ordinato
n, confrontalo (
comparalo) in modalità binaria, e valuta solo i valori dalla riga attuale escludendo le righe già valutate”.
Fatta l'operazione cruciale cancella i valori ormai obsoleti di
Values e li aggiorna con quelli attuali per riprendere un nuovo ciclo riga, colonne.
Gambas la prima volta che apre la finestra chiama due volte il metodo
Sort pertanto il codice così congegnato si offre con il valore rovesciato ma questo sarebbe facilmente ovviabile il punto è che nel codice di Milio si nasconde un piccolo errore in questo passaggio:
ValueSorted.Sort(GridView1.Columns.Ascending)
Sort si attende un
intero gb.Ascent = 0 oppure
gb.Descent = 16 e invece noi gli passiamo un
booleano non da errore ma scombussola, infatti la freccetta che indica il verso di ordinamento appare rovesciata rispetto al senso.
Se noi cambiamo il codice della Wiki così:
' ValueSorted.Sort(GridView1.Columns.Ascending)'
If GridView1.Columns.Ascending Then
ValueSorted.Sort(gb.Ascent)
Else
ValueSorted.Sort(gb.Descent)
Endif
Commentando o cancellando la riga incriminata il codice funziona regolarmente.
Siete d'accordo con la mia disamina?