Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TTabcontrol - OnExit funktioniert nicht wie erwartet (https://www.delphipraxis.net/190715-ttabcontrol-onexit-funktioniert-nicht-wie-erwartet.html)

idefix2 30. Okt 2016 01:22

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.

himitsu 30. Okt 2016 02:10

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.

idefix2 30. Okt 2016 10:02

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.

nahpets 30. Okt 2016 12:22

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;

himitsu 30. Okt 2016 13:13

AW: TTabcontrol - OnExit funktioniert nicht wie erwartet
 
Zitat:

Zitat von idefix2 (Beitrag 1352248)
Aber wenn die Form ein Menu hat und ich auf irgend einen Menueintrag klicke, dann wird OnExit definitiv nicht ausgelöst (Delphi Berlin Starter).

Das sagte ich doch.
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ß.

himitsu 30. Okt 2016 13:22

AW: TTabcontrol - OnExit funktioniert nicht wie erwartet
 
Delphi-Quellcode:
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;
Und dann halt im OnCloseQuery/OnClose/OnDestroy und eben in den ClickEvents von Menüs/SpeedButtons das CheckOnExit aufrufen.

idefix2 30. Okt 2016 16:16

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.

himitsu 30. Okt 2016 16:24

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.

idefix2 30. Okt 2016 17:07

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.

himitsu 30. Okt 2016 17:25

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 19:56 Uhr.
Seite 1 von 2  1 2      

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