Di recente nelle pagine della documentazione ufficiale (http://gambaswiki.org/wiki/comp/gb.qt4/gridview/sorted) di Gambas è stato inserito il codice postato da Milio in questa (http://www.gambas-it.org/smf/index.php?topic=2170.msg24085#msg24085) discussione e che era diventato anche lezione (http://www.gambas-it.org/wiki/index.php?title=Ordinare_i_valori_di_pi%C3%B9_righe_in_base_ad_una_colonna) 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?
:ciao:
Attenzione sono d'accordo che se chiedo a una persona di indicarmi dove devo andare per ascendere dal pian terreno al quinto piano lui indicherà verso l'alto sempre che non mi picchi pensando che lo sto prendendo per i fondelli :) ma...
In informatica, come nella vita, ordinare da A verso Z o da 0 verso 100 significa ordinare in modo crescente e normalmente le icone si presentano con la freccia rivolta verso il basso (https://www.google.it/search?q=Crystal+icon+AZ&client=ubuntu&hs=jhk&channel=fs&tbm=isch&imgil=25-DFmdSYg5c1M%253A%253BW6ZL9s0w0cwNrM%253Bhttps%25253A%25252F%25252Fplay.google.com%25252Fstore%25252Fapps%25252Fdetails%25253Fid%2525253Dnet.dinglisch.android.ipack.crystalhd&source=iu&pf=m&fir=25-DFmdSYg5c1M%253A%252CW6ZL9s0w0cwNrM%252C_&usg=__Wo7HUPGr1NQApMcCLWEd1kEAw9s%3D&biw=1863&bih=983&ved=0ahUKEwiGpMrq9vTLAhVCDQ4KHcAjDeoQyjcITQ&ei=j1YCV8agLMKaOMDHtNAO#tbm=isch&tbs=rimg%3ACUq2h1giQ2xvIjhl0kg3_1a1UOUCs7eGwEck1w4TarVVMkpnpvUhv57hUT785YFGKddiMXKqmK5-QpNZATuyG60-UZSoSCWXSSDf9rVQ5Eb5WAQceO1SUKhIJQKzt4bARyTURoWh76so9zGMqEgnDhNqtVUySmRG1fCG_1-mmZ7SoSCem9SG_1nuFRPEaEjO5B_1cDWMKhIJvzlgUYp12IwR_1CVw_1FH-ve0qEglcqqYrn5Ck1hEy5fHff1AX3CoSCUBO7IbrT5RlEfx4aERlDEJL&q=Crystal%20icon%20AZ), questo perché la prima lettera o il primo numero si trova in cima alla griglia.
Infatti se noi lo chiediamo direttamente a Gambas lui ce lo dice.
Basta fare questa piccola prova:
Public Sub Form_Open()
GridView1.Sorted = True
With GridView1
.Columns.Count = 3
.Rows.Count = 3
.Header = GridView.Horizontal
End With
End
Public Sub GridView1_Click()
Print GridView1.Columns.Ascending;; " = che sale che tende verso l'alto come da A verso Z o da 0 verso 100."
End
e poi cliccare su una qualunque cella della griglia.
:ciao:
Lee ha contro proposto questo e io per finirla li ho detto OK is the same
ValueSorted.Sort(IIf(GridView1.Columns.Ascending, gb.Ascent, gb.Descent))
:ciao: