Newsgroup: it.comp.lang.c++
Titolo: Cancellare un item di una listview

Ho dei problemi a cancellare un item di una listview!!!
Non riesco a trovare un metodo (sto usando le mfc) per riuscire a recuperare
l'indice dell
'item selezionato.
Ho provato con getItem ma nulla...., il codice è questo:
LV_ITEM lvi;
pList->GetItem(&lvi);
pList->DeleteItem(lvi.iItem);
L'iItem della struttura  lvi non viene mai valorizzato con l'indice corretto
:(.
Dove sto sbagliando?
C'è qualche altro metodo?
Ho provato anche non utilizzando le mfc Listview_GetItem(...) ....... ma ho
sempre lo stesso problema.
Ciao
Terenzio

...

GetItem (LV_ITEM* ) vuole il puntatore ad una struttura LV_ITEM due dati
preimpostati.
mask      che indica quali dati della struttura deve riempire
iItem       che indica a quale elemento riferirsi.
Nel tuo caso non è possibile usare GetItem da sola perchè non sai qual'è
l'iItem dell'elemento selezionato
Bisogna prima cercare l'elemento selezionato:

Scusa, non so perchè ma nel messaggio precedente macanva un pezzo:


Non sono esattamente un guru di MFC e mi ricordo che tempo fa mi sono
incartato con un problema simile.
Se il problema e' cancellare un Item dopo un click del mouse ho eseguito un
Hittest (che restituisce l'indice
dell'item clicckato o -1 una volta fatta la dovuta conversione da coordinate
globali a locali)
e poi ho dato in pasto l'indice alla DeleteItem.
Se invece devi cercare un Item con caratteristiche specifiche hai due
possibilita':
1) FindItem (vedi documentazione per i parametri) che pero' fa una ricerca
su alcuni criteri che non sono l'indice (in particolare lParam e text dell'
item)
2) Ciclare con GetNextItem partendo dal primo Item della ListCtrl (anche qui
vedi documentazione per i particolari)
fino a che non trovi  quello che ti interessa. In genere si esegue
GetNextItem con -1 come indice per partire dall'inizio e poi si cicla fin
all'indice corretto .
Damiano

pList->GetItem(&lvi);
Il problema e` che devi inizializzare lvi, cosi` che la GetItem
sappia che cavolo stai cercando...!-)  Aggiungi, prima della
chiamata a GetItem(&lvi):
    memset(&lvi, 0, sizeof(lvi));    // sempre buona prassi...
    lvi.mask = LVI_STATE;           // cerchiamo per "stato"
    lvi.state  = LVIS_SELECTED;
    lvi.stateMask = LVIS_SELECTED;
Questo dovrebbe funzionare (sorry, non ho tempo
di testarlo in questo momento...).
Alex

Ciao Terenzio,
prova ad usare
int index=pList->GetNextItem(-1,LVNI_SELECTED);
per trovare l'indice dell'item selezionato e poi passalo a
pList->DeleteItem(index) per rimuoverlo dalla lista.
ciao, Franco.
Franco Torrini - Software Engineer - 
f.to...@virtuart.it
VIRTUART - C.C.D. Creative Computer Design S.p.A.
Via di Quarto Annunziata, 80/b - 00189 Rome, Italy
Tel. 
+39 06 33076638
 - Fax. 
+39 06 33076670

 
[snip]
Puoi anche utilizzare la funzione associata alla ListView
void CMyView::OnClick(NMHDR* pNMHDR, LRESULT* pResult) 
{
 NM_LISTVIEW*	pNMListView = (NM_LISTVIEW*)pNMHDR;
 _myCacheVar = pNMListView->iItem;
 *pResult = 0;
}
La funzione puo' essere aggiunta al codice del tuo programma utilizzando
il ClassWizard.
In questo modo ogni volta che selezioni all'interno della ListView viene
aggiornata la variabile cache che contiene l'indice dell'item
correntemente attivo.
massimo