Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Welches Ereignis um Rückkehr zu Form zu erkennen (https://www.delphipraxis.net/212778-welches-ereignis-um-rueckkehr-zu-form-zu-erkennen.html)

norwegen60 31. Mär 2023 11:53

Welches Ereignis um Rückkehr zu Form zu erkennen
 
Hallo,

ich habe in frmMain ein TTabSheet. Die Inhalte der Tabsheets werden mit
Delphi-Quellcode:
  if tsTabsheet.ActivePage = tsTabSheet1 then
  begin
    if frmForm1 = nil then
    begin
      frmForm1 := TfrmForm1.Create(Application);
      frmForm1.BorderStyle := bsNone;
      frmForm1.Parent := tsTabSheet1;
      frmForm1.Align := alClient;
      frmForm1.Show;
  end
erst erzeugt wenn das TabSheet aufgerufen wird.

Meine Frage ist nun, wie ich sicherstellen kann, dass jedes mal, wenn auf dieses frmForm1 zurückgekehrt wird, das gleiche Ereignis ausgelöst wird.

Rückkehrmöglichkeiten sind
  • Beim Create
  • aus anderem TabSheet
  • über Menu von foMain aufgerufeners anderes Fenster
  • aus ganz anderer Anwendung
  • ...

OnShow wird nur nach Create aufgerufen
OnPaint wird nur bei Rückkehr aus anderem Programm aufgerufen
OnActivate wird nur bei Rückkehr aus anderem TabSheet oder anderem, per Menu aufgerufenem Form aufgerufen. Aber nur wenn SubForm danach nicht wieder gefreet wird

Mit
Delphi-Quellcode:
procedure TfrmForm1.FormCreate(Sender: TObject);
begin
  Application.OnActivate := FormActivate;
end;
erreiche ich noch, dass Activate auch bei Rückkehr aus anderem Programm aufgerufen wird

Alle drei zusammen erfüllen also fast was ich suche (Es fehlt Rückkehr aus Form, wenn ich dieses über MenuClick Create, ShowModal und Free aufrufe)

Gibt es aber eine Möglichkeit in allen Fällen ein Event/Message abzuarbeiten sobald ich wieder auf frmForm1 zurück kehre

Danke für eure Tips
Gerd

himitsu 31. Mär 2023 12:04

AW: Welches Ereignis um Rückkehr zu Form zu erkennen
 
In diesem Fall wäre eigentlich das "richtige" Event das OnChange des TabControls,
bzw. die OnEnter/OnLeave der/aller Controls auf dieser Form.

Denn diese eingebetteten Forms bekommen niemals die Kontrolle.
Ebenso wie bei MDI-Forms, ist hier auch Form.ActiveControl beim Lesen immer NIL, denn die oberste Form hält die Kontrolle.


Wigentlich arbeitet man hier mit Frames, nicht mit Forms, und schon gibt es diesbezüglich keine "Verwirrung" mehr.




Delphi-Referenz durchsuchenTForm.OnActivate und Delphi-Referenz durchsuchenTForm.OnDeactivate
Ja, leider ist das bissl blöde unpraktikikabel gelöst.
Das Form-Event reagiert nicht, wenn die Anwendung verlassen/betreten wird, sondern nur beim Wechsel der VCL-Fenster innerhalb der Anwendung.

Also zusätzlich auch noch
Delphi-Referenz durchsuchenTApplicationEvents.OnActivate und OnDeactivate

Aber zumindestens kann man der Form und dem ApplicationEvents jeweils die selben Ereignismethoden zuweisen.



Und besser niemals direkt an die Events der Application hängen, sondern nach Möglichkeit ein TApplicationEvents benutzen.
(Ja, leider fehlen darin einige Events, vor allem die an Screen ... aber Diese hier sind vorhanden)
Somit kann jede Form ihr eigenes ApplicationEvents bekommen und es gibt keine Konflikte.

Delbor 31. Mär 2023 12:34

AW: Welches Ereignis um Rückkehr zu Form zu erkennen
 
Hi Norwegen
Zitat:

Meine Frage ist nun, wie ich sicherstellen kann, dass jedes mal, wenn auf dieses frmForm1 zurückgekehrt wird, das gleiche Ereignis ausgelöst wird.
Zitat:

OnShow wird nur nach Create aufgerufen
Und was wird bei Form1.Shw aufgerufen?

Aber machs dir einfacher - baue dein eigenes Event und rufe darin die gewünschte Prozedur auf.
Du könntest dir einen Aufzählungstypen deklarieren, dessen Elemente nach Position geordnete Namen tragen, die nach einem passenden Präfix genau so heissen wie deine Tabs (ohne Präfix) und je nach Typelement in der selben Prozedur eine andere Form createn (oder anzeigen).

Kurz, bevor du dein Event auslöst, weisst du einer Formvariablen eine gewünschte Form zu (aus einer Liste möglicher Formnamen?):
Delphi-Quellcode:
FormVar := Form1 (Form2),(Form3)...
Dann feuerst du dein Event ab und übergibst ihm den gewünschten Formnamen. in deiner CreateOrShow-Prozedur kannst du zum Createn/Anzeigen nun deine übergebene Formvarible nutzen.


Das ist jetzt einfach so ein mögliches Vorgehen, vielleicht noch nicht ganz ausgereift, weil ungetestet.
Ich selbst würde mir die Arbeit sparen, für jedes Tab die richtige Form zu bestimmen und gleich zum PageControl greifen.

Gruss
Delbor

Uwe Raabe 31. Mär 2023 13:08

AW: Welches Ereignis um Rückkehr zu Form zu erkennen
 
Eventuell kannst du das mit einem Screen.OnActiveFormChange Event abfangen.

norwegen60 31. Mär 2023 13:16

AW: Welches Ereignis um Rückkehr zu Form zu erkennen
 
Zitat:

Zitat von himitsu (Beitrag 1520522)
In diesem Fall wäre eigentlich das "richtige" Event das OnChange des TabControls

Passt mir nicht so, denn dann müsste ich ja auch die Abarbeitung im Hauptform machen oder von dort im TabForm aufrufen

Zitat:

Zitat von himitsu (Beitrag 1520522)
Eigentlich arbeitet man hier mit Frames, nicht mit Forms, und schon gibt es diesbezüglich keine "Verwirrung" mehr.

Das stimmt natürlich. Frames habe ich bisher immer dann verwendet, wenn ich ähnliche "Frames" in unterschiedlichen Forms verwendet habe.

Zitat:

Zitat von himitsu (Beitrag 1520522)
Also zusätzlich auch noch TApplicationEvents.OnActivate und OnDeactivate

Das schau ich mir an

Zitat:

Zitat von Delbor (Beitrag 1520523)
Aber machs dir einfacher - baue dein eigenes Event und rufe darin die gewünschte Prozedur auf. ..

Ich hatte auf eine Standardlösung gehofft

Zitat:

Zitat von Uwe Raabe (Beitrag 1520526)
Eventuell kannst du das mit einem Screen.OnActiveFormChange Event abfangen.

Schau ich mir auch an

Danke für eure schnelle Hilfe

himitsu 31. Mär 2023 13:24

AW: Welches Ereignis um Rückkehr zu Form zu erkennen
 
Nja, in den Frame/Form einen EventHandler rein.

Delphi-Quellcode:
public // oder private
  procedure DoActivate(Sender: TObject);
Und dann das ans OnChange des PageControls hängen,
aber da du mehrere TabSheets hast, hat man hierbei das gleiche Problem, wie beim Application.OnIrgendwas ... dort passt nur ein Event gleichzeitig dran (im Gegensatz zu mehreren TApplicationEvents.OnIrgendwas)



Also andersrum.

Alle Frames/Forms haben eine public Methode (in einem gemeinsamen Vorfahren), oder einfach in einem gemeinsamen Interface.
Und dann prüft im OnChange des TabControls ein Code auf dem ActiveTabSheet das eingebettete Frame/Form auf den Typ/Interface und ruft diese Methode auf.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:09 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