Hallo!
Ich versuche folgendes zu realisieren:
Ich habe eine Liste mit Einträgen und in der ersten Spalte befinden sich Checkboxen.
Mit der Maus oder der Tastatur sollen nur jene Element auswählbar sein, die angehakt sind. Die anderen sollen entweder übersprungen werden (Tastatur) oder nicht anklickbar (Maus).
Das mit der Maus habe ich schon hingebracht, da brauch ich ja nur auf den Itemindex abfragen und ob Checked auf true ist.
das mit der Tastatur hätte ich ins onchange reingepackt, weil sich durch den tastendruck ja die liste verändert. allerdings habe ich da ja das problem, dass die liste schon beim start zig onchange events aufruft. die programmlogik orientiert sich ja weitgehend am code vom onclick event, aber wie kann ich verhindern, dass der code schon schlagend wird, wenn die liste noch im ersten aufbau ist und ich noch keine taste gedrückt habe?
beispiel:
x mein eintrag 1
mein eintrag 2
x mein eintrag 3
wenn ich auf den eintrag 2 klicke, dann wird das nicht zugelassen und die selection wieder retour auf den eintrag gestellt, wo ich hergekommen bin.
drücke ich jetzt (auf eintrag 1 stehend) die "runter"-taste, dann soll der eintrag 2 (weil nicht gecheckt!) übersprungen werden und der eintrag 3 markiert (selektiert) werden.
wie gesagt, die logik hab ich ja schon, nur hab ich beim aufruf der listview durch den code einen stack-overflow generiert, da der code (durch die zig events beim ersten aufbau) schon ausgeführt wurde.
hätte wer von euch bitte eine idee, wie ich verhindern kann, dass der code beim ersten listenaufbau zu tragen kommt und nur passiert, wenn ich durch die taste rauf oder runter den index der liste ändere?
zusatzfrage: wenn ich mit der maus hinklicke, werden dann beide events ausgelöst oder nur der onclick event? wenn ersteres passiert (beide) dann müßte ich das auch noch irgendwie abfangen (fragt sich nur wie), wenn nicht, dann brauch ich nur verhindern, dass der code schon frühzeitig zur anwendung kommt.
also in pseudocode
Delphi-Quellcode:
procedure ListView.OnChange (....);
begin
prüfe, ob nächstes oder vorhergehendes element (also auf das ich gerade gekommen bin) angehakt ist. wenn ja, dann setz mich drauf, wenn nein, dann such in die gewählte richtung weiter und wenn dort (unterhalb/oberhalb) noch einer zu finden ist, dann setz mich auf den.
end;
wie gesagt, wie ich den code für diese abfrage realisieren soll, ist für mich nicht das problem. aber wenn die liste das erste mal befüllt wird, schlägt der code schon zu und das soll er nicht. soll erst dann passieren, bis ich die liste gesehen habe und eine aktion gesetzt habe.
hat jemand von euch da eine idee dazu? brauch ich da ein flag, das ich setze, solange die liste noch nicht fertig ist (also vor der einfügefunktion sperren und danach wieder freigeben)?
danke für eure hilfe.
mfg,
stephan.