![]() |
Oncreate beenden und function aufrufen (ohne TTimer)
Gibt es eine Möglichkeit nach dem Durchlauf der OnCreate Funktion eine andere Funktion aufzurufen aber OnCreate formal zu beenden. (und das ohne Timer zu benutzen)
(Umgebung: Win, XE10, VCL App) procedure TForm1.FormCreate(Sender: TObject); begin Befehl1; Befehl2; .... "Aufruf einer neuen Funktion"; end; -> und jetzt sollte FormCreate als Funktion beendet werden function "Aufruf einer neuen Funktion"; begin Befehl1; Befehl2; .... end; so wie es oben geschrieben ist bleibt FormCreate bis zum Ende die ausführende Funktion und die andere Funktion wird nur als Unterfunktion aufgerufen, und das soll nicht so sein. Kann man evtl. einen Win Handle verwenden um nach dem FormCreate beendet ist eine neue Funktion aufzurufen? Bin für jeden Vorschlag Hilfe offen. (Wie man das mit einem Timer umsetzt ist bekannt, nur so würde ich das nur ungern lösen) |
AW: Oncreate beenden und function aufrufen (ohne TTimer)
Es gibt eine virtuelle
Delphi-Quellcode:
, die du überschreiben kannst. Die wird unmittelbar nach dem
procedure AfterConstruction
Delphi-Quellcode:
aufgerufen. Für Fenster im Speziellen könnte
Create
Delphi-Quellcode:
oder eins der anderen Post-Create Events auch eine Möglichkeit sein.
OnShow
|
AW: Oncreate beenden und function aufrufen (ohne TTimer)
Danke für den Tip mit OnShow, muss ich testen (wäre extrem einfach)
|
AW: Oncreate beenden und function aufrufen (ohne TTimer)
In "halbwegs" neueren Delphis ist seit paar Jahren/FastJahrzehnten das TForm.OnCreate im AfterConstruction
und früher war es im Create. Oder selber eine Ereignismethode erstellen, also für WM_USER+x und dann am Ende des Create, OnCreate oder OnShow per PostMessage anstoßen. (nur ein einfacher Call, anstatt einem goßen Timer) ![]() |
AW: Oncreate beenden und function aufrufen (ohne TTimer)
Zitat:
|
AW: Oncreate beenden und function aufrufen (ohne TTimer)
Sorry Onshow klappt nicht.
Hab das kurz mit ShowMessage getestet und das wird aufgerufen noch bevor man das Form sieht. Ich suche quasi etwas was eine "Main" Funktion aufruft in der dann das Programm die ganze Zeit läuft. Werde es mit dem "WM_USER+x" testen (Danke) |
AW: Oncreate beenden und function aufrufen (ohne TTimer)
Ja, das geht dann wohl tatsächlich eher in Richtung Threads/Tasks. Ist leider kein ganz einfaches Thema.
|
AW: Oncreate beenden und function aufrufen (ohne TTimer)
Zitat:
![]() Aber ![]() |
AW: Oncreate beenden und function aufrufen (ohne TTimer)
Doppelt.
|
AW: Oncreate beenden und function aufrufen (ohne TTimer)
Hier der Grund für das Wofür
Zitat:
oder das Konzept auf Message/Event-bassiert ändern und den ![]() |
AW: Oncreate beenden und function aufrufen (ohne TTimer)
Zitat:
Delphi-Quellcode:
const
WM_FORM_VISIBLE = WM_USER + 1; private FormInitialised: Boolean; procedure WMFormVisible(var msg: TMessage); message WM_FORM_VISIBLE; end; implementation procedure TForm1.WMFormVisible(var msg: TMessage); begin >>> hier deine showmessage zum testen <<< // Wird erst verarbeitet, wenn das Formular sichtbar ist. Aber meiner Meinung nach sollte man sich nicht von irgendwelchen Sichtbarkeiten abhängig machen. end; procedure TForm1.FormPaint(Sender: TObject); begin if not FormInitialised then begin FormInitialised := True; PostMessage(Form1.Handle, WM_FORM_VISIBLE, 0, 0); end; end; |
AW: Oncreate beenden und function aufrufen (ohne TTimer)
Vielen Dank für Euere Antworten:
Habe das mit dem Win Message gelöst und funktioniert genau wie ichs mir vorgestellt habe: anbei in Kurzvorm wie das gelöst habe. const WM_APP_launch_main = WM_USER + 8; // WIN - set message handler for launch of form type procedure OnMyMessage(var Msg: TMessage); message WM_APP_launch_main; // DECLARE message function procedure FormCreate ... PostMessage(self.Handle,WM_APP_launch_main,0,0); // SEND message that create is done end; procedure Tform8.OnMyMessage(var Msg: TMessage); begin ..... end; |
AW: Oncreate beenden und function aufrufen (ohne TTimer)
Ich bin mir nicht sicher aber ich glaube das ist nur Glück, dass deine Showmessage angezeigt wird wenn das Formular sichtbar ist.
Meine Version oben wäre die sicherere Variante. |
AW: Oncreate beenden und function aufrufen (ohne TTimer)
Ja Dein Vorschlag klappt auch.
Mir ging es primär nicht um die Sichtbarkeit sondern das ich eine abgeschlossene Initialisierung aller Parameter des Forms haben will und dann der eigentliche Main Loop abgearbeitet wird. Man muss sich das wie ein "Old-School" Programm vorstellen. Alles soll der Reihe nach abgearbeitet werden und an den Stellen an denen Loops gebraucht werden, werden die aufgerufen. Gegen einen generellen Timer spricht das in der Hauptroutine drei Netzwerk typen gleichzeitig miteinander kommunizieren müssen, weshalb in den loops keine fixen timer verwendet werden, sondern nur geprüft wird ob eine gewisse Zeitspanne bereits verstrichen ist. und Dank Eurer Hilfe bin diesen "hässlichen" ttimer zum aufrufen des main losgeworden. |
AW: Oncreate beenden und function aufrufen (ohne TTimer)
Zitat:
Was du meinst ist der Main-Thread. Wirklich vergleichbar mit einer Main-Methode von C oder Java ist das nicht. |
AW: Oncreate beenden und function aufrufen (ohne TTimer)
Zitat:
Aber auch in C/Java lässt man dort bestimmt nicht stundenlang einen Spaghetti-Code durchleiern. |
AW: Oncreate beenden und function aufrufen (ohne TTimer)
Nicht umgewöhnen, aber ich arbeite einen 30 Jahre alten Pascal Code um, und die Infrastruktur (Roboter, Sensoren) ist genauso alt, bleibt aber erhalten, weswegen ich nicht so weit weg vom Uursprünglichen Ablauf will. (ausserhalb von Industrie 4.0 gibts auch noch Prüfstände die teilweise mit MS-Dos laufen, auf PCs mit 10 MB Festplatte). Im Prinzip könnte man das alles noch in TP schreiben (RS485, TCP, IEEE gabs alles damals schon).
Aber Danke für den support |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:39 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-2025 by Thomas Breitkreuz