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 geschriebenEdit: 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 geschriebenmultiselect 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 bistIm 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