![]() |
TListView, OnChanging-Event wird mehrmals aufgerufen
Hi,
ich habe das Problem, dass das OnChanging-Event eines TListView mehrmals (3-4 mal, leider scheinbar nicht konstant) aufgerufen wird. Ausgangssituation: Ich will im OnChanging-Event eine Abfrage (MessageDlg) implementieren, ob der Eintrag, der verlassen werden soll gespeichert (Ja), nicht gespeichert (Nein) oder wieder zu diesem Eintrag zurückgekehrt werden soll (Abbrechen). Bei 'Abbrechen' setze ich AllowChange auf False. Code:
Delphi-Quellcode:
Problem:procedure TForm1.ListView1Changing(Sender: TObject; Item: TListItem; Change: TItemChange; var AllowChange: Boolean); begin AllowChange := True; // CheckBox1.Checked wird hier nur las Flag verwendet, ob sich in dem Eintrag etwas gändert hat If (Change = ctState) and CheckBox1.Checked then begin case MessageDlg('Änderungen speichern?',mtCustom,[mbYes,mbNo,mbCancel],0) of mrYes: begin // Speichern ... CheckBox1.Checked := False; end; mrNo: begin CheckBox1.Checked := False; end; else AllowChange := False; end; end; Da das das OnChanging-Event mehrmals durchlaufen wird wird bei der Auswahl von 'Abbrechen' im Dialog der Dialog bis zu vier mal angezeigt. Sehr unschön :( . Irgendwer eine Idee? Gruß Jörg Gehlen |
Re: TListView, OnChanging-Event wird mehrmals aufgerufen
Hallo,
nehme an das durch Aufruf des Dialogs erneut onChanging ausgelöst wird. Wenn Du Die Checkbox in dem Else-Zweig der case-Anweisung auf False setzt, dürfte der Dialog eigentlich nicht erneut aufgerufen werden. Wie werden denn die Änderungen an der ListView durchgeführt? Wenn nur die Caption geändert wird, dann ist das Ereignis OnEdited ein besserer Ansatzpunkt. |
Re: TListView, OnChanging-Event wird mehrmals aufgerufen
Hallo,
Zitat:
Zitat:
Zusammengefasst will ich folgendes Verhalten erreichen: - Über das ListView wird ein Eintrag ausgewählt, die zugehörigen Daten werden geladen und ausserhalb des Listview dargestellt und auch dort editiert. - Sind die Daten geändert worden und wird ein anderer Eintrag in dem ListView angeklickt, soll der Dialog ('Änderungen speichern?') erscheinen: -> 'Ja'-Button: Daten werden gespeichert, neuer Eintrag wird selektiert, zugehörige Daten werden geladen -> 'Nein'-Button: Daten werden nicht gespeichert, neuer Eintrag wird selektiert, zugehörige Daten werden geladen -> 'Abbrechen'-Button: Momentan geladene und veränderte Daten werden nichrt verändert, der bisherig selektierte Eintrag bleibt im ListView selektiert Gruß Jörg Gehlen |
Re: TListView, OnChanging-Event wird mehrmals aufgerufen
Beachte auch, das das Event nochmals aufgerufen wird, wenn das neue Item selektiert wird, mit dem neuen Item wohlgemerkt...
|
Re: TListView, OnChanging-Event wird mehrmals aufgerufen
Zitat:
Gruß Jörg Gehlen |
Re: TListView, OnChanging-Event wird mehrmals aufgerufen
Zitat:
|
Re: TListView, OnChanging-Event wird mehrmals aufgerufen
Hallo,
anderer Vorschlag: Bei z.B. Editfelder und auch andere Komponenten kann man im OnExit-Ereignis mit ActiveControl die Komponente ermitteln die den Focus bekommen wird. Klickt man nun in die ListView wird das Ereignis OnExit des Editfeldes vor dem Ereignis OnChanging der ListView ausgelöst. Also die Speichern [Ja - Nein - Abbrechen]-Abfrage ins OnExit des Edits integrieren und ein Flag fürs OnChanging-Ereignis der ListView setzen. Im nachfolgenden Beispiel wird ListView.Tag als Flag genutzt:
Delphi-Quellcode:
procedure TForm1.Edit1Exit(Sender: TObject);
begin if ActiveControl = ListView1 then case MessageDlg('Änderungen speichern?',mtCustom,[mbYes,mbNo,mbCancel],0) of mrYes: begin Caption := 'Speichern'; ListView1.Tag := 0; end; mrNo: begin Caption := 'Nicht Speichern'; ListView1.Tag := 0; end; mrCancel: begin Caption := 'Abgebrochen'; ActiveControl := Edit1; ListView1.Tag := 1; end; end; end; procedure TForm1.ListView1Changing(Sender: TObject; Item: TListItem; Change: TItemChange; var AllowChange: Boolean); begin if ListView1.Tag = 1 then AllowChange := False else AllowChange := True; end; |
Re: TListView, OnChanging-Event wird mehrmals aufgerufen
Hallo,
danke für den Tip , manchmal sieht man den Wald vor lauter Bäumen nicht .. Zitat:
Trotzdem ist das ganze doch nur ein Workaround, das eigentliche Problem, das mehrmalige Aufrufen des OnChanging-Events besteht weiterhin. Gruß Jörg Gehlen |
Re: TListView, OnChanging-Event wird mehrmals aufgerufen
hallo,
Zitat:
Das Problem des mehrmaligen Aufrufs entsteht durch den Aufruf des Dialogs innerhalb der Ereignis-Behandlungs-Routine, da gehört der Dialog-Aufruf IMHO nicht hin. :wink: |
Re: TListView, OnChanging-Event wird mehrmals aufgerufen
Hallo,
Zitat:
- Das Event wird auch ohne Dialog-Aufruf mehrmals aufgerufen (3 oder 4 mal). Auch kann nicht erkennen warum der Dialog-Aufruf nicht in das OnChanging-Event gehört, ein OnExit- oder OnEnter-Event dafür aber okay sind. Meiner Ansicht nach ist gerade das OnChanging-Event (alleine vom Namen her) der richtige Platz zum Prüfen, ob man die Änderung wirklich vornehmen will. Ich versuch nur zu verstehen ... :gruebel: Gruß Jörg Gehlen |
Re: TListView, OnChanging-Event wird mehrmals aufgerufen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Jörg.
Der mehrfache Eintritt in das Ereignis OnChanging() ist völlig korrekt. Durch deinen Dialog wird wegen dem Fokus Shift ein zusätzliches OnChanging() ausgelöst. Ohne deinen Dialog werden jeweils drei OnChange() und OnChanging() Ereignisse ausgelöst. Abgesehen davon, dass ich grundsätzlich mit einer virtuellen ListView und einem modalen Bearbeitungs-Dialog arbeite, würde ich in deinem Fall anders vorgehen und dem Benutzer die Kontrolle über die Speicherung ganz überlassen. Siehe Demo. Neujahrsgrüße vom marabu |
Re: TListView, OnChanging-Event wird mehrmals aufgerufen
Hallo,
Zitat:
Zitat:
Gruß Jörg Gehlen |
Re: TListView, OnChanging-Event wird mehrmals aufgerufen
Zitat:
Zitat:
Zitat:
Freundliche Grüße marabu |
Re: TListView, OnChanging-Event wird mehrmals aufgerufen
Hallo,
Zitat:
Trotzdem möchte ich allen :hi: hier nochmals danken. Dies ist meine erste Frage bei Delphi-PRAXIS und ich bin sehr angetan von der schnellen und kompetenten Hilfe. Gruß Jörg Gehlen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz