Newsgroup: it.comp.lang.visual-basic
Titolo: Listview e sort

ho un problemino con il sort di una listview
allora appurato che il sor automatico funziona solo con il testo ho
provveduto ad aggiungere la mia procedura personalizzata di sorting con il
messaggio LVM_SORTITEMS
domanda1 : come mai non funziona il msg LVM_SORTITEMSEX il sendmessage mi
restituisce 0, qualcuno ha provato???
domanda2 : faccio con  LVM_SORTITEMS e quindi ottengo l'index dell'item con
un ulteriore sendmessage con msg LVM_FINDITEM tutto sembra funzionare bene
solo che adesso l'hittest non va e sembra che non capisca che gli item sono
stati spostati!!! qualcuno sa di cosa sto parlando? ha provato?? a volte il
sorting non funziona non ho capito secondo quale criterio?? esiste un modo
di ottenere la proprieta "TAG" di un item da API o è solo per VB?
grazie per le risposte
L2K

di ottenere la proprieta "TAG" di un item da API o č solo per VB?
AFAIK e' la seconda che hai detto.
-- 
ciao, hal

 AFAIK e' la seconda che hai detto.
Avevo presupposto, mi sembra che MSDn suggerisca di utilizzare lParam per
impostare un valore personalizzato??? ma se io l'utilizzo e ci sono dei
doppioni come cavolo fà ad effettuare LVM_FINDITEM???
Ringrazio per la collaborazione
L2K

a volte... la sfiga!!!
allora il sort funziona bene se gli faccio prendere il calore con
LVM_GETITEM!!!
la listview di VB utilizza una propria collection che purtroppo non viene
ordinata quindi per lui gli elementi sono ancora nella posizione iniziale
Es:
se io aggiungo ad una listbox
"1"
"3"
"7"
"2"
"6"
"4"
"5"
e faccio il sorting con il callback
sulla listbox vedo scritto
"1"
"2"
"3"
"4"
"5"
"6"
"7"
ma ?listview1.listitems(2).text il risultato è "3" e controllando tutta la
lista con lo stesso metodo per lui la lista non è mai stata toccata!!!
Passiamo al mio problema... io sbagliavo perchè ottenedo l'index dell'item
per fare il compare nella funzione di callback ottenevo litem con
LV1.Listitems(index) e quindi lui restituiva sempre l'l'item iniziale
(quindi per logica la prima volta che eseguivo il sort tutto andava bene...
ma se io aggiungevo degli item e rieseguivo il sort andava tutto storto!!!)
Allo stesso modo funziona la funzione HitTest. che calcola la posizione del
mouse nel controllo e stabilisce l'index dell'item che dovrebbe essere in
quella posizione. e poi accedendo alla sua stramaledettissima collection
interna restituisce l'item sbagliato Ahrghhh!!!! (o meglio quello
originariamente presente in quella posizione)
adesso sto implementando il Selectionsort e mi ordino i miei prodotti... poi
piu' avanti voglio scrivere un mio wrapper per la listbox comctl32
ciao e grazie
L2K

a tutti gli interessati
nuovo progetto, componenti->Microsoft Common Controls 6.0,
aggiungo al form command1
aggiungo al form check1, Caption = "Ordine Inverso"
aggiungo al form listview1
eseguo e premo command1
x HAL : questa credo sia l'unica soluzione (a parte cambiare algoritmo di
sorting) per ovviare al problema descritto.
Segue Codice
Ciao
L2k
--Begin CODE--
Private Sub Command1_Click()
    Selectionsort (Check1.Value = 1)
End Sub
Private Sub Form_Load()
    ListView1.ListItems.Add , , "4"
    ListView1.ListItems.Add , , "1"
    ListView1.ListItems.Add , , "3"
    ListView1.ListItems.Add , , "2"
    ListView1.ListItems.Add , , "10"
    ListView1.ListItems.Add , , "31"
    ListView1.ListItems.Add , , "14"
    ListView1.ListItems.Add , , "3"
    ListView1.ListItems.Add , , "1"
End Sub
Sub Selectionsort(Optional bDescending As Boolean = False)
    'bDescending deve essere impostato a true per
    'l'ordinamento contrario
    Dim i As Long
    Dim j As Long
    Dim best_j As Long
    Dim Itm As ListItem
    Dim max As Long
    max = ListView1.ListItems.Count
    For i = 1 To max - 1
        Set Itm = ListView1.ListItems(i)
        best_j = i
        For j = i + 1 To max
            'la riga che segue effettua il confronto
            'io utilizzo il valore della prima colonna
            'ma nulla vieta di utilizzare un subitems
            'o effettuare tutti i controlli (datediff...)
            If Val(ListView1.ListItems(j).Text) < Val(Itm.Text) Xor
bDescending Then
                Set Itm = ListView1.ListItems(j)
                best_j = j
            End If
        Next j
        ReplaceItem best_j, ListView1.ListItems(i)
        ReplaceItem i, Itm
    Next i
End Sub
Private Function ReplaceItem(index As Long, Itm As ListItem)
    'siccome la collection non permette il replace
    'rimuovo l'Item in posizione index
    ListView1.ListItems.Remove index
    'e lo sostituisco con quello nuovo
    ListView1.ListItems.Add index, , Itm.Text
    'qui ci sono da aggiungere tutte le proprieta come i subitems
    'ed eventuali bold...
End Function
--End CODE--

Segue Codice
Grazie per i test :-)
-- 
ciao, hal