AGB  ·  Datenschutz  ·  Impressum  







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

TTabcontrol - OnExit funktioniert nicht wie erwartet

Ein Thema von idefix2 · begonnen am 30. Okt 2016 · letzter Beitrag vom 1. Nov 2016
Antwort Antwort
Seite 1 von 2  1 2      
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#1

TTabcontrol - OnExit funktioniert nicht wie erwartet

  Alt 30. Okt 2016, 02:22
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: TTabcontrol - OnExit funktioniert nicht wie erwartet

  Alt 30. Okt 2016, 02:10
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.
$2B or not $2B
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#3

AW: TTabcontrol - OnExit funktioniert nicht wie erwartet

  Alt 30. Okt 2016, 11:02
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.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

AW: TTabcontrol - OnExit funktioniert nicht wie erwartet

  Alt 30. Okt 2016, 13:22
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: TTabcontrol - OnExit funktioniert nicht wie erwartet

  Alt 30. Okt 2016, 14:13
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ß.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: TTabcontrol - OnExit funktioniert nicht wie erwartet

  Alt 30. Okt 2016, 14:22
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.
$2B or not $2B
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#7

AW: TTabcontrol - OnExit funktioniert nicht wie erwartet

  Alt 30. Okt 2016, 17:16
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

@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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: TTabcontrol - OnExit funktioniert nicht wie erwartet

  Alt 30. Okt 2016, 17:24
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.
$2B or not $2B

Geändert von himitsu (30. Okt 2016 um 17:27 Uhr)
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#9

AW: TTabcontrol - OnExit funktioniert nicht wie erwartet

  Alt 30. Okt 2016, 18:07
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.
Miniaturansicht angehängter Grafiken
mainmenu.png  

Geändert von idefix2 (30. Okt 2016 um 18:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#10

AW: TTabcontrol - OnExit funktioniert nicht wie erwartet

  Alt 30. Okt 2016, 18:25
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 15:13 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