listview items "verbinden"



  • hallo,
    ich würde gerne mithilfe der checked-property mehrere items miteinander verknüpfen. d.h., wenn ein item checked == false ist (grundsätzlich sind alle items checked == true), dann bedeutet dies, dass das item mit dem item darüber "verbunden" ist:
    wird das obere Item (checked == true) selektiert, so wird auch das item darunter (checked == false) markiert. wird das untere item markiert, so wird auch das item darüber selektiert.
    Das bewerkstellige ich hiermit:

    // OnSelectItem
       // Funktion, um ein selektiertes Item zu finden
       // wenn item gefunden:   
    
       TListItem *nextitem = ListView->Items->Item[SelectedItem->Index+1];
       TListItem *backitem = ListView->Items->Item[SelectedItem->Index-1];
    
       if (SelectedItem->Checked == true && nextitem->Checked == false) {
    
         if (nextitem->Selected == false) {
         nextitem->Selected = true;}
    
       }
    
       if (SelectedItem->Checked == false && backitem->Checked == true) {
    
         if (backitem->Selected == false) {
         backitem->Selected = true;
         }
    
       }
    

    nun sind beide items markiert. so weit so gut. doch klicke ich nun auf ein anderes item, das nichts mit der verbindung zu tun hat, um die beiden items zu deselektieren, bleiben beide items selektiert bestehend.
    ich nehme an, das liegt daran, dass, bei dem Selektieren des neuen Items, die beiden verbundenen Items nacheinander deselektiert werden und sobald dies geschieht, der oben stehende code ausgeführt wird und wieder beide selektiert werden. ich irre mich wahrscheinlich und bin einfach zu blöd oder müde um auf eine lösung zu kommen. wüsste nämlich nicht, wie ich mein ziel sonst erreichen könnte. was muss ich schreiben, um BEIDE items in diesem Fall zu deselektieren? geht das überhaupt? 😞

    liebe grüße,
    momith



  • Zum einen wird dein Problem durch die Eigenschaft Multiselect = true
    begünstigt und zum anderen musst du daher mit einer
    eigenen Funktion vorgehen. Schreibe doch einfach
    eine Funktion für das OnSelect Ereignis, dass wenn
    2 aufeinanderfolgende Items selektiert sind und
    die Bedingung der Verknüpfung zutrifft, diese
    wieder deselektiert werden. Das ist doch in
    Windeseile geschrieben

    Edit: Du musst keine 2 zusätzlichen Pointer
    für deine ListItems erzeugen. Greife doch direkt
    per Index auf deine Items zu. Nach der Methode
    wie du sie machst hast du auch vergessen deine
    Pointer mit delete nach Nutzung freizugeben.
    Du machst es dir mit diesem Stil nur unnötig
    schwer. Sinn macht dies nur wenn du neue
    ListItems erzeugst und diese dann die nötigen
    Daten und Eigenschaften zuweist.



  • Zero01 schrieb:

    Zum einen wird dein Problem durch die Eigenschaft Multiselect = true
    begünstigt und zum anderen musst du daher mit einer
    eigenen Funktion vorgehen. Schreibe doch einfach
    eine Funktion für das OnSelect Ereignis, dass wenn
    2 aufeinanderfolgende Items selektiert sind und
    die Bedingung der Verknüpfung zutrifft, diese
    wieder deselektiert werden. Das ist doch in
    Windeseile geschrieben

    multiselect ist für mein programm notwendig...
    ich glaube ich verstehe leider noch nicht ganz, was du meinst oder?
    wenn beide selektiert sind und die verknüpfung vorhanden ist, dann soll bei dem onselect-event die Selektierung rückgängig gemacht werden. Wenn nur eins der beiden markiert ist, dann wird das jeweils andere auch noch selektiert.
    Hab ich dich so richtig verstanden? falls ja, dann wäre da doch noch das problem mit multiselect, denn wenn jetzt die itemgruppe markiert wurde, und ich per strg-taste ein weiteres item dazumarkieren möchte, werden die beiden anderen items ungewollt deselektiert.
    da fällt mir ein, könnte man nicht, die tasten abfragen und dass, solange strg oder tab gedrückt wird, in dieser zeit die funktion zum deselektieren der "itemgruppe" deaktiviert wird (mit bool)?
    bevor ich anfange das zu machen, klingt das plausibel? 😃

    Zero01 schrieb:

    Edit: Du musst keine 2 zusätzlichen Pointer
    für deine ListItems erzeugen. Greife doch direkt
    per Index auf deine Items zu. Nach der Methode
    wie du sie machst hast du auch vergessen deine
    Pointer mit delete nach Nutzung freizugeben.
    Du machst es dir mit diesem Stil nur unnötig
    schwer. Sinn macht dies nur wenn du neue
    ListItems erzeugst und diese dann die nötigen
    Daten und Eigenschaften zuweist.

    der code ist mal eigentlich noch länger gewesen, hab nur das wichtigste rauskopiert. aber stimmt schon, die pointer sind wirklich nicht nötig 🙂

    danke für diese wirklich hilfreiche antwort! 👍



  • Ja, ich habe das so verstanden das bei der
    dritten Selektierung die bereits verknüpften
    deselektiert werden und das zuletzt gewãhlte
    Item selektiert bleibt. Wie auch immer...schreib
    ne Funktion für dein OnSelect welche deine
    gewünschte Operation durchführt. Anders gehts
    bei ner Multiselect Liste nicht.

    Wenn du mit ner bool arbeitest
    dann kannst du diese ja gescheit in deine Klassen-
    definitionen in der header Datei z.B als
    private deklarieren um Klassenfunktionsübergreifend
    auf sie zugreifen zu können. Poste mal bitte deinen
    Quelltext wenn du fertig bist

    Im OnKeyDown und Up kannst du ja die Wertigkeit
    deiner bool ändern. So kann man das lösen,
    warum auch nicht



  • wenn ich zeit dazu finde (in den nächsten tagen wohl eher nicht ;)) dann gerne 🙂


Anmelden zum Antworten