AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OnChange Event bei TListViews

Ein Thema von stephan007 · begonnen am 5. Jun 2007 · letzter Beitrag vom 5. Jun 2007
Antwort Antwort
stephan007

Registriert seit: 2. Mär 2007
48 Beiträge
 
#1

OnChange Event bei TListViews

  Alt 5. Jun 2007, 19:52
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: OnChange Event bei TListViews

  Alt 5. Jun 2007, 20:35
Hallo Stephan,

du kannst so vorgehen:

Delphi-Quellcode:
procedure TDemoForm.InitButtonClick(Sender: TObject);
var
  i: Integer;
begin
  with ListView do
  begin
    OnChange := nil;
    for i := 0 to Pred(Items.Count) do
      Items[i].Checked := Odd(i);
    OnChange := ListViewChange;
  end;
end;

procedure TDemoForm.ListViewChange(Sender: TObject; Item: TListItem;
  Change: TItemChange);
begin
  ShowMessage(Format('item %s: %s', [Item.Caption, BoolToStr(Item.Checked, True)]));
end;
Grüße vom marabu
  Mit Zitat antworten Zitat
stephan007

Registriert seit: 2. Mär 2007
48 Beiträge
 
#3

Re: OnChange Event bei TListViews

  Alt 5. Jun 2007, 21:20
ähm und wie mach ich das ohne button??
oder arbeitest du hier mit einem versteckten sprich unsichtbaren button?

denn ich kann in meinem fall keinen zusätzlichen butten einblenden. d.h. ich kann die darstellungsform nicht ändern, sondern ich muss da irgendwie "nur" die funktionalität reinbringen.

hättest du vielleicht bitte auch eine lösung, in der ich keinen zusätzlichen button brauche?
  Mit Zitat antworten Zitat
stephan007

Registriert seit: 2. Mär 2007
48 Beiträge
 
#4

Re: OnChange Event bei TListViews

  Alt 5. Jun 2007, 22:16
und ich glaube wir haben auch ein missverständnis: mir gehts nicht darum jeden zweiten eintrag zu wählen, sondern jeden angehakten z.b. kann auch folgendes sein:

x meineintrag 1
x meineintrag 2
x meineintrag 3
meineintrag 4
meineintrag 5
x meineintrag 6

und wenn ich nun auf meineintrag 1 stehe und mit pfeil runter durchnavigiere, dann will ich, dass meineintrag 4 und meineintrag 5 übersprungen werden, weil nicht angehakt.
also es können beliebige kombinationen entstehen.
von n einträgen können 0 bis n angehakt sein, mit allen kombinationen. nur die nicht angehakten sollen weder anklickbar noch mit der tastatur auswählbar sein.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: OnChange Event bei TListViews

  Alt 5. Jun 2007, 22:28
Meine Code-Zeilen sollen dir zeigen, wie du zwischen programmseitigem und interaktivem Setzen der Checked-Eigenschaft differenzieren kannst. Durch das Entfernen des Event-Handlers während der Initialisierung der ListItems wird vermieden, dass das OnChange-Event gefeuert wird. Über dein anderes Problem kann ich leider erst morgen nachdenken, da ich jetzt unbedingt ins Bettchen muss.

Gute Nacht
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz