Autor Beitrag
worm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 135


D6 Prof
BeitragVerfasst: Di 17.09.02 22:41 
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

_________________
In the beginning, the universe was created. This has made a lot of people very angry, and is generally considered to have been a bad move.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 135


D6 Prof
BeitragVerfasst: 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

_________________
In the beginning, the universe was created. This has made a lot of people very angry, and is generally considered to have been a bad move.