[Gelöst] Rennen um das Formular (Laufzeitproblem beim Close)

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
charlytango
Beiträge: 1154
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

[Gelöst] Rennen um das Formular (Laufzeitproblem beim Close)

Beitrag von charlytango »

Hi,
  • in einem TFrame liegt die ganze Logik für eine GUI.
  • In einer weiteren Unit das Objekt das sich um die Erstellung der dynamischen Menüs kümmert
  • Im Vorfahren der späteren TForms liegt die Logik wie sich so ein Form zu verhalten hat.
Solange die TForms alle schön in einen TabBar eingebunden sind klapp alles wunderbar, denn da steuert der Tabbar das Erstellen, Zerstören der TForms sowie das Anstoßen der Menüaktualisierung.

Nun kann man TForms auch aus dem Tabbar herauslösen und als frei fliegende Forms benutzen.
Wenn ich nun so ein frei fliegendes TForm schließe finde ich keine Lösung wo bzw wie ich die Aktualisierung der Menüs automatisiert anstoßen kann.
Die Funktionen zum Schließens liegen wie üblich im Vorfahren (also im TForm) und funktionieren auch.

Wenn ich nach dem Schließen des Formulars von außen manuell die Aktualisierung der Menüs durchführe passt alles.

Wenn ich in irgendeinem Event des TForm die Aktualisierung der Menüs anstoße, existiert das TForm zu diesem Zeitpunkt ja noch und die Menüs werden falsch erzeugt (also inklusive dem Formular das gerade im Schließen begriffen ist). Also ein Laufzeitproblem.

Ein Benutzer wird den "Close" Button im Formular oder das X clicken um das Formular zu schließen.

Wie stelle ich es an die Menüs korrekt nach dem Schließen zu erneuern wenn ich nur Funktionen IM Formular zur Verfügung habe ? Oder welche Konstruktion brauche ich dazu?
Zuletzt geändert von charlytango am Mi 27. Aug 2025, 23:41, insgesamt 1-mal geändert.

wp_xyz
Beiträge: 5247
Registriert: Fr 8. Apr 2011, 09:01

Re: Rennen um das Formular (Laufzeitproblem beim Close)

Beitrag von wp_xyz »

Du kannst das Formular die Aktualisierung der Menüs verzögert ausführen lassen, indem es Application.QueueAsyncCall aufruft (https://wiki.freepascal.org/Asynchronous_Calls):

Code: Alles auswählen

// TApplication
procedure QueueAsyncCall(const AMethod: TDataEvent; Data: PtrInt);
AMethod ist eine Methode, idealerweise des Formulars, die die Menüs aktualisiert. Die Signatur von AMethod ist

Code: Alles auswählen

type
  TDataEvent = procedure (Data: PtrInt) of object;
Mit Hilfe des Parameters Data, der auch bei QueueAsyncCall angegeben wird, könntest du mit dieser Methode verschiedene Aufgaben verzögert ausführen lassen, z.b. mit Data=1 das Hauptmenü und mit Data=2 das Kontextmenü aktualisieren. Wenn das nicht zutrifft, setze Data einfach auf 0.

Eine andere Möglichkeit wäre, beim Schließen des Fensters das Menü gar nicht zu aktualisieren, sondern erst, wenn das Menü aufklappt (OnPopup).

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6924
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Rennen um das Formular (Laufzeitproblem beim Close)

Beitrag von af0815 »

Die ersten Punkte erinnert mich, das es manchmal gescheiter ist einen Observer zu verwenden
  • in einem TFrame liegt die ganze Logik für eine GUI.
  • In einer weiteren Unit das Objekt das sich um die Erstellung der dynamischen Menüs kümmert
  • Im Vorfahren der späteren TForms liegt die Logik wie sich so ein Form zu verhalten hat.
Es gibt beim FPC einen Observer der durch IFPObserved und IFPObserver abgebildet wird.

Michael van Canneyt hat viel Artikel publiziert - siehe https://www.freepascal.org/~michael/articles/ - dort ist der Artikel CDCover1 etwas was den Observer erklärt. Und auch gleich was ein Mediator ist. Weil genau diese Themen gehen IMHO auf die Probleme ein, die du gerade bekämpfst.

Weil dein Problem ist, das es keinen zentralen Punkt gibt, der dir allen in sync hält, besonderes wenn das Form plötzlich abgekoppelt ist.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Soner
Beiträge: 754
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Rennen um das Formular (Laufzeitproblem beim Close)

Beitrag von Soner »

Warum möchtest du, wenn ein neue Tab erstellt oder geschlossen wird Menüs aktualisieren? Das ist doch unnötige Speicher und CPU-Zeit Verschwendung, manche Benutzer rufen das nie auf.
Ich habe auch Tab-Interface, das Fenstermenü wird nur dann aktualisiert ,wenn man es auswählt, d.h. in OnPopup Ereignis.

charlytango
Beiträge: 1154
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Rennen um das Formular (Laufzeitproblem beim Close)

Beitrag von charlytango »

@wp_xyz
@af0815

Danke für euren Input, beide "sophisticated" Varianten verdienen schon alleine aus Interesse einen tieferen Blick.

@wp_xyz
@soner

Nachdem ich um Menus immer wieder mal einen Bogen gemacht habe sehe ich den Wald vor lauter Bäumen nicht. Tatsächlich die einfachste und eleganteste Methode ist die, das Erstellen der Menüs in ein OnClick (TMainMenu) bzw ein OnPopup (TPopupMenu) Ereignis zu packen. Es klappt gut und zeitlich ist das gar kein Problem.
Zumal das auch meine Code verschlankt, denn ich brauche auf Veränderung nicht mehr reagieren und das Close läuft fein durch.
Zumal @soner sicher recht hat, dass das kaum jemand je aufrufen wird, und wenn, damm macht eine viertel Sekunde mehr auch nichts aus.

Danke euch -- case closed

Antworten