[ListView] Item merken, auch nach Sortierung



  • Hi Leute.
    Ich habe da ein Problem mit meiner ListView. Wenn man ein Item doppelklickt, so habe ich programmiert, dass in diesem Item ein Icon angezeit wird. Wenn man nun ein anderes doppelklickt, so soll das Icon verschwinden und beim neuen Item, welches man gerade doppelgeklickt hat, auftauchen. Ich brauche also ein "Handle" zum Item. Ich habe es letztens einmal ganz simpel gemacht, in dem ich mit mit

    iLastPlayedItemNo = ListView_GetSelectionMark(GetDlgItem(hChild1, IDC_LISTVIEWCTRL1));
    

    die Item Nummer gemerkt habe und wenn man ein anderes Item doppelklickt, so könnte ich damit gut das Icon entfernen...

    Jetzt gibts ein Problem. Wenn ein Item das Icon hat, und man sortiert die Liste, und wenn man dann ein anderes doppelt anklickt, so stimmt logischerweise iLastPlayedItemNo nicht mehr, weil sich das Item verschoben hat mit dem Icon!!! Wie kann ich mir das Item anders "merken", so dass das Item ruhig von der SortItem - Funktion verschoben werden kann, ich aber immer noch das "Handle" drauf habe???

    Danke schonmal!
    Tschüss

    [ Dieser Beitrag wurde am 04.11.2002 um 19:40 Uhr von ChrisK editiert. ]

    [ Dieser Beitrag wurde am 04.11.2002 um 19:41 Uhr von ChrisK editiert. ]

    [ Dieser Beitrag wurde am 04.11.2002 um 19:42 Uhr von ChrisK editiert. ]



  • Du solltest die Items anhand ihrer lParams identifizieren. Dann kannst Du mit LVM_FINDITEM ganz einfach den entsprechenden Index herausfinden.



  • Wie komme ich gleich nochmal an das Param eines Items heran?



  • LVM_GETITEM, bzw. ListView_GetItem



  • Mist. Genau so, wie Du es mir jetzt erklärt hast, habe ich es heute Versucht, nur habe ich nicht daran gedacht, dass dann in lvitem das lParam drinsteht. Ich habe stattdessen lvfindinfo.lparam das lvitem übergeben, nicht das lvitem.lparam 🙄

    DANKE, ich werds jetzt nochmal "richtig" probieren...



  • Hi King, ich habe es noch einmal ausprobiert. Find Item gibt nicht -1 aus, also sollte es erfolgreich gewesen sein, allerdings spuckt er mir immer "0" aus. 😞 Hier meine Codestelle (merken des Items, Löschen des Icons, setzen des Icons)...

    // GLOBAL
    static LVITEM
    lp_lvitem;             // LVITEM zum Speichern (merken) des Items
    
    // FUNKTION
    LVITEM lvitem;         // Für das aktuell angeklickte/markierte Item
    LVFINDINFO lvfindinfo; // Für ListView_FindItem()
    
    ListView_GetItem(GetDlgItem(hChild1, IDC_LISTVIEWCTRL1), &lvitem); // Aktuell angeklicktes/markiertes Item holen
    
    lvfindinfo.flags  = LVFI_PARAM;        // Suchfunktion per lParam
    lvfindinfo.lParam = lp_lvitem.lParam;  // lParam des alten Items übergeben
    
    int iLastPlayedItemNo = ListView_FindItem(GetDlgItem(hChild1, IDC_LISTVIEWCTRL1), -1, &lvfindinfo); // int iLastPlayedItemNo empfängt die Item Position
    
    // ICON DES ITEMS LÖSCHEN
    lvitem.mask     = LVIF_IMAGE;
    lvitem.iSubItem = 0;
    lvitem.iItem    = iLastPlayedItemNo;
    lvitem.iImage   = 10;
    ListView_SetItem(GetDlgItem(hChild1, IDC_LISTVIEWCTRL1), &lvitem);
    
    // NEUES ICON AUF AKTUELL MARKIERTES ITEM SETZEN
    lvitem.iItem    = ListView_GetSelectionMark(GetDlgItem(hChild1, IDC_LISTVIEWCTRL1));
    lvitem.iSubItem = 0;
    lvitem.iImage   = 2;
    ListView_SetItem(GetDlgItem(hChild1, IDC_LISTVIEWCTRL1), &lvitem);
    
    ListView_GetItem(GetDlgItem(hChild1, IDC_LISTVIEWCTRL1), &lp_lvitem); // Speichert das aktuell markierte Item ("merken"!)
    

    [ Dieser Beitrag wurde am 04.11.2002 um 22:04 Uhr von ChrisK editiert. ]



  • Also mein Problem ist, dass iLastPlayedItemNo immer "0" zugewiesen bekommt. Wieso wird mein Item nicht gefunden, das zuletzt angeklickt wurde?



  • Dein lParam doch wird gefunden, an Index 0. Wenn Du das Icon umsetzt, mußt Du natürlich auch Deine lParams anpassen. Würde Dein lParam nicht gefunden werden können, würde auch ListView_FindItem -1 zurückgeben.

    Könnteste vielleicht auch einmal ein bisschen mehr selber in der MSDN nachsehen? Sowas wie ListView_FindItem hat man in Null Komma Nichts in der MSDN gefunden und braucht es nicht gleich im Forum zu fragen.



  • Ich schaue sicher nicht wenig in der MSDN nach King.
    Thx


Anmelden zum Antworten