Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] - sort di una colonna di listview

Per aggiungere elementi a una "colonna" di una listview uso questa
istruzione
                itmX1.SubItems(2) = Format(Round(FileLen(path & sNextFile) /
(1024), 3), "0,0")
si tratta della dimensione dei files.
Bene, dopo essere riuscito finalmente a trovare il modo di ordinare le
colonne cliccando sull'intestazione, mi capita che:
se clicco sulla colonna dei nomi dei files, l'ordinamento alfabetico viene
effettuato correttamente,
se clicco sulla colonna delle dimensioni invece, l'ordinamento non è
corretto, ad esempio:
12.288
18.342
2.692
23.817
3.243
33.534
9.979
mi sapreste spiegare dove sbaglio?
grazie

 se clicco sulla colonna delle dimensioni invece, l'ordinamento non č


 corretto, ad esempio:
Il listview ordina in modo alfabetico.
Personalmente per aggirare questo limite mi odino come voglio un array di
type e poi lo ricarico ordinato nella lw.
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

mi sapreste spiegare dove sbaglio?
Come ti hanno gia' risposto, cio' dipende dal fatto che la listview
ordina considerando il contenuto dei campi come testo.
Diversamente da quanto suggerito da cotanti OP, il rimedio che
preferisco e' quello di seguire la logica che si segue anche nella
programmazione ad oggetti, dove per gli ordinamenti ci si basa sull'
implementazione di interfacce ad hoc (tipo Comparable o IComparable).
Poiche' da VB6 non si puo' ereditare la listview, bisogna fare un po'
di lavoro in piu' con l'API, ma una volta scritto il codice, la
portabilita' dello stesso viene ampliata parecchio.
Puoi prendere spunto dall' esempio
HOWTO: Sort a ListView Control by Date 
Q170884
che trovi su MSDN.
In pratica, il trucco consiste nel passare alla listview l'indirizzo
di una tua funzione che operi il confronto fra i valori secondo i tuoi
criteri, piuttosto che lasciar fare il comportamento predefinito.
In ListView1_ColumnClick verifichi di quale colonna si tratti:
 If ColumnHeader.Text = "Dimensione file" Then  
    ListView1.Sorted = False       ' qui dobbiamo subclassare
    SendMessage ListView1.hWnd, _
                      LVM_SORTITEMS, _
                      ListView1.hWnd, _
                      AddressOf MiaFuncDiConfronto
 Else
    ' default sorting
    ListView1.Sorted = True  
 End If
 
In un modulo .bas va scritta la funzione che opera il confronto:
Public Function MiaFuncDiConfronto(ByVal lParam1 As Long, _
                                   ByVal lParam2 As Long, _
                                   ByVal hWnd As Long) As Long
Deve restituire 0 se i due valori ricevuti per il confronto sono
uguali, 1 uno se il primo e' maggiore del secondo, -1 se il primo
e' minore del secondo.
La seccatura e' rendere "leggibili" per il nostro programma vb
i valori che sono indicati dai primi due parametri (lParam1 e lParam2)
e per questo ti rimando all'articolo che ho indicato sopra.
Vantaggi di questo approccio:
1. puoi visualizzare i dati come meglio credi, senza dover tenere
conto di necessita' di ordinamento;
2. non devi scrivere una routine di sort per ogni possibile tipo di
dato;
3. eventuali miglioramenti dell'algoritmo interno di sort della
listview verranno automaticamente recepiti dal tuo programma;
4. ragioni gia' come ragioneresti con 
vb.net
 (a parte gli equilibrismi
dell' API, che in 
vb.net
 ti sono risparmiati);
Svantaggi:
1. e' complesso da scrivere la prima volta.
-- 
ciao, hal

 1. e' complesso da scrivere la prima volta.
Speriamo bene :'(