![]() |
TTabcontrol - OnExit funktioniert nicht wie erwartet
Hi,
Wenn ich auf einem Formular ein TEdit und ein TTabcontrol habe, wird das OnExit des TTabControls ausgelöst, wenn ich vom tabcontrol aufs Edit-Feld wechsle. Es wird aber nicht ausgelöst, wenn ich z.B. auf das Menü des Formulars klicke, und, was noch viel schlimmer ist, nicht einmal, wenn ich das Formular schließe. Im OnExit und im Onchange wollte ich eigentlich die aktuellen Inhalte des aktiven Sheets auf die Platte sichern, aber das genügt offenbar nicht. Wie kann ich sicherstellen, dass die im Sheet eingegebenen Daten immer gesichert werden, wenn der User irgend etwas anklickt, was nicht im Tabsheet liegt? Wenn ich mich bei jedem Element der Form, das der User anklicken kann, um die Sicherung des Tabsheet-Inhalts kümmern muss, wird das ganze etwas mühsam. |
AW: TTabcontrol - OnExit funktioniert nicht wie erwartet
OnExit wird ausgelöst, wenn der Fokus innerhalb der Form zu einem anderem Control wechselt.
Und das passiert auch dann, wenn man z.B. auf einen TSpeedButton drückt, welcher ebenfalls keinen Fokus bekommt. |
AW: TTabcontrol - OnExit funktioniert nicht wie erwartet
Offenbar nicht, das ist ja mein Problem.
Wenn ich zu einem TEdit wechsle, das auf der Form liegt, ja. Aber wenn die Form ein Menu hat und ich auf irgend einen Menueintrag klicke, dann wird OnExit definitiv nicht ausgelöst (Delphi Berlin Starter). Und wenn ich den Close-Button der Form (rechts oben) anklicke, auch nicht. Dann geht die Form zu, ohne dass OnExit vorher aktiviert würde. |
AW: TTabcontrol - OnExit funktioniert nicht wie erwartet
OnExit wird nur aufgerufen, wenn eine Komponente den Focus verliert.
Bei 'nem Click auf die Menüs oder den Schließenbutton oben rechts ..., verliert die Komponente, die gerade den Focus hat, diesen aber nicht. Deshalb wird auch OnExit nicht aufgerufen. Klickst Du z. B. irgendwo ins Hauptmenü und verlässt es dann mit ESC, so bleibt der Focus der gerade aktiven Komponente erhalten. Einfachste Methode, um das Problem (halbwegs) elegant zu lösen, ist in allen Ereignissen, in denen Du möchtest, dass das OnExit-Ereignis aufgerufen wird, wäre, es in der entsprechenden Methode aufzurufen. Beim OnClose des Formulars sähe das dann halt so aus:
Delphi-Quellcode:
procedure Tform1.FormClose(Sender: TObject; var Action: TCloseAction);
begin tsDeinTabSheetExit(Sender); // oder pcDeinPageControlExit(Sender); end; |
AW: TTabcontrol - OnExit funktioniert nicht wie erwartet
Zitat:
Menüs/PopupMenüs, SpeedButtons und Weitere erhalten keinen Fokus, also auch kein OnExit. Selbes gilt auch für die SystemMenüs und Buttons der Form. Und beim Schließen der Form wird leider auch kein OnExit ausgelöst, da das ausgelöst wird, wenn ein Anderes Control den Fokus bekommt, kurz vor dessen OnEnter. Man könnte nur manuell im OnClose/OnCloseQuery und beim Ausführen von entsprechenden MenüItems im Form.ActiveControl nachsehn, ob es ein OnExit besitzt und führt das aus, bzw. man geht besser auf DoExit, falls auch die Komponente "intern" drauf reagiert. Kommt drauf an, aber eventuell dann auch noch OnEnter/DoEnter ausführen ... automatisch geht das aber nicht zu lösen, da man hier die Besondernheiten der verschiedenen Komponente beachten muß. |
AW: TTabcontrol - OnExit funktioniert nicht wie erwartet
Delphi-Quellcode:
Und dann halt im OnCloseQuery/OnClose/OnDestroy und eben in den ClickEvents von Menüs/SpeedButtons das CheckOnExit aufrufen.
type
TExitFormHelper = class helper for TForm private type TProtectedControl = class(TWinControl); public procedure CheckOnExit(WithOnEnter: Boolean=False); end; procedure TExitFormHelper.CheckOnExit(WithOnEnter: Boolean); begin if not Assigned(Self.ActiveControl) then Exit; TProtectedControl(ActiveControl).DoExit; if WithOnEnter then TProtectedControl(ActiveControl).DoEnter; end; |
AW: TTabcontrol - OnExit funktioniert nicht wie erwartet
Das ist aber ein ordentlicher Mist.
Das heisst so viel, wie dass ich mich bei jeder Aktion, die irgendwo in der Form ausgelöst wird, speziell bei jedem Untermenüpunkt der Hauptmenüs um das Sichern des Tab-Inhalts kümmern muss. Und wenn später einmal irgendwer das Menü erweitert oder einen Speedbutton einbaut oder sonst irgend etwas derartiges macht und auf das Aktualisieren der Tabsheetdaten vergisst, dann freut sich der Anwender des geupdateten Programms :twisted: @Himitsu Den Sinn von deinem Exitformhelper sehe ich nicht so recht - weder, wozu es gut sein könnte, nach onexit gleich wieder onenter aufzurufen noch was es beim Handling gegenüber dem direkten Aufruf von Tabcontrol.doexit einfacher oder besser macht - wenn man nicht zufällig mehrere tabcontrols auf der Form hat und die alle aktualisieren will. Beim den Menüs ist es besonders lästig, weil da gibt es anscheinend keinen Event, der aktiviert wird, wenn irgend ein Menüeintrag angeklickt worden ist, da muss man die Reaktion in jeden Menüeintrag einbauen. |
AW: TTabcontrol - OnExit funktioniert nicht wie erwartet
Wenn beim OnExit etwas deaktiviert wird und beim OnEnter aktiviert, an wäre das sonst inaktiv, obwohl der Fokus immernoch in dem Control ist. (oder andersrum)
Aus diesem Grund verwenden einige Leute niemals pure Controls, sondern leiten alles immer ab (auch wenn erstmal noch nicht verändert wurde) So kann man dann später global ein Verhalten einbauen/ändern, ohne noch irgendwas ändern zu müssen. Bei den Menüs kann man das aber auch ins OnPopup einbauen, dann ist das schon erledigt, bevor irgendein Menüpunkt angeklickt wurde. |
AW: TTabcontrol - OnExit funktioniert nicht wie erwartet
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm
Das einzige Event des Hauptmenüs, das im OI angezeigt wird, ist OnChange, ein OnPopup gibt es da nicht. Das Hauptmenu ist ja auch kein Popup-menu. |
AW: TTabcontrol - OnExit funktioniert nicht wie erwartet
Hmm, gab es beim MainMenu nicht auch sowas wie OnPopup?
Irgendwas, wo man vor dem Anzeigen noch schnell am Menü rumspielen kann? (Items Erstellen, Dis./Enablen oder sie Checkboxen) Bei den Hauptmenüpunkten kann man auch OnClick benutzen ... OnClick wird beim Aufpoppen des Submenüs ausgelöst. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:57 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 by Thomas Breitkreuz