![]() |
Timingproblem mit OnChange und OnExit
Hallo zusammen,
ich habe auf einem Formular einen TreeView. Dieser TreeView hat ein OnChange-Ereignis. Neben dem TreeView sind verschiedene Eingabefelder, die Werte in einer Klasse speichern. Bei jeden Eingabefeld habe ich das Ereignis OnExit genutzt um die Werte in die Klasse zu schreiben. Wenn ich jetzt einen Wert eingebe und dann sofort auf den TreeView klicke, wird als erstes das OnChange Ereignis des TreeView ausgelöst und dann das Ereignis OnExit der Eingabefelder. Kann ich das irgendwie umdrehen ? Nachtrag : Dieses Problem tritt nur zwischen TTreeView und TEdit oder TComboBox auf. Auf das OnChange-Ereignis bei den Eingabefelder würde ich gerne verzichten, da ich erst den Wert abspeichern möchte, wenn er vollständig ist, wenn das möglich ist. |
Re: Timingproblem mit OnChange und OnExit
Vielleicht als Notlösung...
Delphi-Quellcode:
var
bFlag: boolean = false; procedure TForm1.Edit1Exit(Sender: TObject); begin if bFlag then begin bFlag := false; Exit; end; ShowMessage('Edit1Exit'); // ... end; procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode); begin Edit1.OnExit(Sender); ShowMessage('TreeView1Change'); // ... end; |
Re: Timingproblem mit OnChange und OnExit
Danke für Deine Notlösung, nur leider habe ich 20 Felder bestehend aus ComboBoxen und Editfeldern.
|
Re: Timingproblem mit OnChange und OnExit
Hallo Rolf
Zitat:
Du schreibst dir eine Prozedur, die das macht, was normalerweise im OnChange-Ereignis ausgeführt wird. Im OnExit-Ereignis der Editfelder kannst du diese Prozedur dann aufrufen:
Delphi-Quellcode:
Wenn das OnChange-Ereignis aufgrund anderer Aktionen aufgerufen wird (z.B. beim Löschen von Einträgen), dann kannst du die entsprechende Prozedur auch dort (Löschen-Prozedur) aufrufen.
procedure DoOnChange;
begin // Code aus dem OnChance-Ereignis end; procedure TForm1.Edit1Exit(Sender: TObject); begin // Code des OnExit-Ereignisses // ... DoOnChange; end; Damit lässt sich die Reihenfolge der Prozeduren/Ereignisse indirekt beeinflussen und bist gleichzeitig relativ flexibel. Grüße, Matze |
Re: Timingproblem mit OnChange und OnExit
Delphi-Quellcode:
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin if ActiveControl <> Sender then ActiveControl := TWinControl(Sender); ... end;
Delphi-Quellcode:
ohne
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin //if ActiveControl <> Sender then //begin // Memo1.Lines.Add('check TreeView1.OnChange'); // ActiveControl := TWinControl(Sender); //end; Memo1.Lines.Add('TreeView1.OnChange'); end; procedure TForm1.TreeView1Enter(Sender: TObject); begin Memo1.Lines.Add('TreeView1.OnEnter'); end; procedure TForm1.Edit1Exit(Sender: TObject); begin Memo1.Lines.Add('Edit1.OnExit'); end;
Code:
mit
TreeView1.OnChange
Edit1.OnExit TreeView1.OnEnter
Code:
check TreeView1.OnChange
Edit1.OnExit TreeView1.OnEnter TreeView1.OnChange |
Re: Timingproblem mit OnChange und OnExit
Danke euch beiden. Mit himitsu's Beispiel bin ich schonmal eine Ecke weitergekommen. Nur leider arbeite ich in dem OnExit-Ereignis mit TreeView1.Selected.Data. Nur leider wird hier jetzt die neue TreeNode genommen statt der alten TreeNode. Kann ich das auch noch irgendwie schaffen, dass er die alte Node behält und erst beim zweiten Mal die neue Node nimmt ?
Nachtrag : Im TreeView habe ich das Ereignis OnClick und OnChange. Im OnClick wird noch eine zweite Liste gefüllt. Im OnChange werden die Eingabefelder gefüllt und ebenfall die zweite Liste, durch direktes Aufrufen des OnClick-Ereignisses. |
Re: Timingproblem mit OnChange und OnExit
Zitat:
Delphi-Quellcode:
var
aComp: TComponent; bFlag: boolean = false; procedure TForm1.Edit1Exit(Sender: TObject); begin if bFlag then begin bFlag := false; Exit; end; aComp := Edit1; // ... end; procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode); begin aComp.OnExit(Sender); // noch entsprechend casten... // ... end; |
Re: Timingproblem mit OnChange und OnExit
Danke Björn für Deinen Vorschlag. Aber ich bin kein großer Freund von globalen Variablen. Der Weg den himitsu gezeigt hat, funktioniert schon sehr gut. Es gibt nur einen kleinen Haken, wenn der Wert geändert wurde, wird er in den neu ausgewählten Datensatz geschrieben und nicht in den vorherigen Datensatz.
|
Re: Timingproblem mit OnChange und OnExit
Hab grad kein Delphi hier, aber gibt es nicht ein Ereignis vor OnChange?
(OnCanCahnge oder so ... also 'ne Abfrage ob gewechselt werden darf) Versuch mal meinen Code dahin zu verlagern. |
Re: Timingproblem mit OnChange und OnExit
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:53 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