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