Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - TListView mit CheckBoxes: Auf Änderung der CheckBoxes reag.
worm - Di 17.09.02 22:41
Titel: TListView mit CheckBoxes: Auf Änderung der CheckBoxes reag.
Hallo!
Ich habe eine ListView mit CheckBoxes = True.
Jedesmal, wenn der Benutzer eine der CheckBoxen anklickt (und ändert), soll das Programm die gesamte ListView durchlaufen, die Werte einer bestimmten Spalte aller abgehakten Einträge addieren und anzeigen.
Das Problem: Benutze ich OnClick, reagiert das Programm nicht, wenn ich die CheckBoxen mit der Tastatur ändere. Benutze ich OnChange und prüfe dabei auf den Wert Change = ctState, so hakt das Programm, wenn ich wärend der Ausführung in die Liste gehe, den ersten Eintrrag markiere und SHIFT + END drücke (also alles auswähle). Dabei wird nämlich sehr oft das Ereignis ausgelöst (da es auch bei Änderung der Markierung auslöst) und also sehr oft die gesamte oben beschriebene Prozedur ausgeführt (da meistens ziemlich viele Einträge im ListView sind).
Gibt es ein Ereignis, eventuell auch eines, was ich nur irgendwie über die API erreiche (wenn das geht), das NUR bei Änderung der CheckBoxes reagiert, so wie OnClickCheck bei der CheckListBox?
Oder reicht es alternativ aus, nur OnClick und OnKeyUp (bei Key=Ord(' ') ) zu überwachen?
Danke, worm
Delete - Mi 18.09.02 08:16
Ich habe vor dem selben Problem gestanden. Eine elegante Lösung würde mich auch heute noch interessieren, denn ich habe mir damals mit dem "OnMousedown"-Event beholfen.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TYAAMForm.lv1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var ht : THitTests; li : TListItem; begin { ... }
// hier geht´s los --> ht := lv1.GetHitTestInfoAt(X,Y); li := lv1.GetItemAt(X,Y); if(htOnStateIcon in ht) and (li <> nil) then begin { ... }
// einfach schauen, ob der Eintrag an der // Cursorposition gesetzt ist, oder nicht if(li.Checked) then MachWas else MachwasAnderes; end; end; |
worm - Mi 18.09.02 15:59
Danke, das ist schonmal besser als OnClick.
Aber der Benutzer kann ja auch über die Tastatur mit Leertaste Einträge abhaken. Für den Fall müsste man dann die Focused-Eigenschaft benutzen, wenn man wissen will, welcher Eintrag gerade abgehakt wurde.
Eine Frage: Gibt es noch irgendeine andere Möglichkeit, wie der Anwender die Einträge abhaken kann? Außer durch Raufklicken und Leertaste? Sonst benutz ich jetzt die Prozedur von Mathias und fange zusätzlich das OnKeyUp-Ereignis bei Key=Ord(' ') ab.
Sagt bitte Bescheid, wenn dadurch noch irgendeine andre Möglichkeit außer Acht gelassen wird oder wenn es noch eine elegante /einfache Lösung gibt!
Danke, worm
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!