Der richtige Zeitpunkt am Beginn eines Programmes ...
-
- Beiträge: 238
- Registriert: So 13. Dez 2009, 09:43
- OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
- CPU-Target: x86 64Bit
- Wohnort: Niederösterreich
Der richtige Zeitpunkt am Beginn eines Programmes ...
Hallo
Problem:
Programm mit 3 Forms.
Form3 wird als Auswahldialog über Buttonclick in Form1 aufgerufen. - funktioniert.
Form3 soll auch zu beginn des Programms einmal erscheinen um die Auswahl zu treffen.
In Form1.FormCreate (Wird bei OnCreate aufgerufen) schmiert Programm mit Exceptions ab weil anscheinend Form3 noch nicht created ist.
Form1.AfterConstruction (Überschrieben (virtual)) wird anscheinend nie aufgerufen. (Wie übrigens an anderer Stelle Before>Destruction auch nicht)
Warum nicht? Muß ich da noch mehr tun als Überschreiben?
Wie löse ich das?
Danke fürs Lesen.
Christian
Problem:
Programm mit 3 Forms.
Form3 wird als Auswahldialog über Buttonclick in Form1 aufgerufen. - funktioniert.
Form3 soll auch zu beginn des Programms einmal erscheinen um die Auswahl zu treffen.
In Form1.FormCreate (Wird bei OnCreate aufgerufen) schmiert Programm mit Exceptions ab weil anscheinend Form3 noch nicht created ist.
Form1.AfterConstruction (Überschrieben (virtual)) wird anscheinend nie aufgerufen. (Wie übrigens an anderer Stelle Before>Destruction auch nicht)
Warum nicht? Muß ich da noch mehr tun als Überschreiben?
Wie löse ich das?
Danke fürs Lesen.
Christian
Früher war alles besser. Und aus Holz!
Re: Der richtige Zeitpunkt am Beginn eines Programmes ...
Ich würde das in OnShow machen.
Was mit AfterConstruction ist weiss ich auch nicht. Habe ich noch nie gebraucht.
Das würde aber auch nicht helfen, denn nachdem 1 created ist, muss 2 noch nicht created sein.
Was mit AfterConstruction ist weiss ich auch nicht. Habe ich noch nie gebraucht.
Das würde aber auch nicht helfen, denn nachdem 1 created ist, muss 2 noch nicht created sein.
-
- Beiträge: 512
- Registriert: Mo 25. Aug 2008, 18:17
- OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
- CPU-Target: x86
- Wohnort: Chemnitz
Re: Der richtige Zeitpunkt am Beginn eines Programmes ...
OnShow wäre wohl geeigneter. Alternativ sollte es auch gehen, du erstellst das Form3 im OnCreate deines Form1 statt es in der .lpr zu erstellen. Das könnte aber dazu führen, dass es dann dein MainForm wird, das kann ich gerade nicht mit Gewissheit sagen.
Re: Der richtige Zeitpunkt am Beginn eines Programmes ...
Oder gleich im lpr showenHitman hat geschrieben:OnShow wäre wohl geeigneter. Alternativ sollte es auch gehen, du erstellst das Form3 im OnCreate deines Form1 statt es in der .lpr zu erstellen. Das könnte aber dazu führen, dass es dann dein MainForm wird, das kann ich gerade nicht mit Gewissheit sagen.

-
- Beiträge: 512
- Registriert: Mo 25. Aug 2008, 18:17
- OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
- CPU-Target: x86
- Wohnort: Chemnitz
Re: Der richtige Zeitpunkt am Beginn eines Programmes ...
Da er das aber wahrscheinlich Modal will (so klang es zumindest), müsste man unnötig viel Anwendungslogik dort unterbringen. Außer man würde das ins OnClose von Form3 packen ... naja viele Wege führen nach Romtheo hat geschrieben:Oder gleich im lpr showen

-
- Beiträge: 462
- Registriert: Mi 30. Jul 2008, 13:11
- OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
- CPU-Target: 32Bit
- Kontaktdaten:
Re: Der richtige Zeitpunkt am Beginn eines Programmes ...
Eigentlich klare Sache für OnShow von Form1. In dem Moment sind alle Forms erstellt und Form1 ist noch nicht auf dem Bildschirm zu sehen. So kann Form3 Modal ausgeführt werden und je nach Auswahl die Anzeige von Form1 noch unterbunden werden.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!
-
- Beiträge: 238
- Registriert: So 13. Dez 2009, 09:43
- OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
- CPU-Target: x86 64Bit
- Wohnort: Niederösterreich
Re: Der richtige Zeitpunkt am Beginn eines Programmes ...
Ja Form3 ist Modal.
OnShow funktioniert prächtig, ich hatte nur die Befürchtung daß OnShow während der Programmausführung auch ab und an aufgerufen wird.
(Vorher hatte ich es mit OnActivate versucht
)
Danke
OnShow funktioniert prächtig, ich hatte nur die Befürchtung daß OnShow während der Programmausführung auch ab und an aufgerufen wird.
(Vorher hatte ich es mit OnActivate versucht

Danke
Früher war alles besser. Und aus Holz!
- af0815
- Lazarusforum e. V.
- Beiträge: 6764
- 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: Der richtige Zeitpunkt am Beginn eines Programmes ...
Ich mache es meistens in OnActivate und setze mir eine Variable mit Namen 'bInit' in der OnCreate auf false, beim ersten aufrufen in OnActivate frage ich die Variable auf false ab, machen meine einmaligen Vorgänge und setzte die Variable dann auf 'true'. Damit mache ich alle meine Inits beim ersten wirklichen Anzeigen des Forms nur einmal. Hat meiner Erfahrung den Vorteil, das wirklich alle Teile des Programms (Forms etc.) bereits vorhanden sind und nicht ev. in einem undefinierten Zustand sein können.AlterMann hat geschrieben:Ja Form3 ist Modal.
OnShow funktioniert prächtig, ich hatte nur die Befürchtung daß OnShow während der Programmausführung auch ab und an aufgerufen wird.
(Vorher hatte ich es mit OnActivate versucht)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 462
- Registriert: Mi 30. Jul 2008, 13:11
- OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
- CPU-Target: 32Bit
- Kontaktdaten:
Re: Der richtige Zeitpunkt am Beginn eines Programmes ...
OnShow wird immer dann aufgerufen, wenn das Form nicht zu sehen war und nun wieder angezeigt werden soll.
OnActivate wird immer dann aufgerufen, wenn das Form nicht das aktive Fenster war und nun aktiviert werden soll.
Möchtest du deine Routine vor nochmaligem Aufruf schützen, dann erstelle doch eine private Membervariable in deiner Form. Bei Erstellung der Objekte ist jede Membervariable 0, nil, false etc., wenn du sie vor Ausführung auf false testest und anschließend auf true setzt, dann bist du auf der sicheren Seite.
OnActivate wird immer dann aufgerufen, wenn das Form nicht das aktive Fenster war und nun aktiviert werden soll.
Möchtest du deine Routine vor nochmaligem Aufruf schützen, dann erstelle doch eine private Membervariable in deiner Form. Bei Erstellung der Objekte ist jede Membervariable 0, nil, false etc., wenn du sie vor Ausführung auf false testest und anschließend auf true setzt, dann bist du auf der sicheren Seite.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!
-
- Beiträge: 238
- Registriert: So 13. Dez 2009, 09:43
- OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
- CPU-Target: x86 64Bit
- Wohnort: Niederösterreich
Re: Der richtige Zeitpunkt am Beginn eines Programmes ...
Mit so einem Flag hätte ich es wohl gemacht, wenn ihr mir OnShow nicht empfohlen hättet.
Ich werde wohl auf OnActivate mit einem Flag wechseln, denn mit OnShow schmiert das Programm wiederum ab, wenn ich innerhalb von Form3 ein ShowMessage aufrufe.
Oder ich mache stattdessen ein Label sichtbar ... jaja viele Wege führen nach Rom ...
Ich werde wohl auf OnActivate mit einem Flag wechseln, denn mit OnShow schmiert das Programm wiederum ab, wenn ich innerhalb von Form3 ein ShowMessage aufrufe.
Oder ich mache stattdessen ein Label sichtbar ... jaja viele Wege führen nach Rom ...

Früher war alles besser. Und aus Holz!
-
- Beiträge: 462
- Registriert: Mi 30. Jul 2008, 13:11
- OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
- CPU-Target: 32Bit
- Kontaktdaten:
Re: Der richtige Zeitpunkt am Beginn eines Programmes ...
Ob da ein Wechsel von OnShow zu OnActivate wirklich hilft? Mit welcher Meldung schmiert dein Programm ab? Mit den bis jetzt vorhandenen Informationen klingt das nach einem Bug, aber vielleicht liegt der Grund des Abschmierens ja auch in deinem Quelltext...AlterMann hat geschrieben:mit OnShow schmiert das Programm wiederum ab, wenn ich innerhalb von Form3 ein ShowMessage aufrufe.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!
-
- Beiträge: 238
- Registriert: So 13. Dez 2009, 09:43
- OS, Lazarus, FPC: Lazarus 3.0 (rev lazarus_3_0) FPC 3.2.2 i386-win32-win32/win64
- CPU-Target: x86 64Bit
- Wohnort: Niederösterreich
Re: Der richtige Zeitpunkt am Beginn eines Programmes ...
Das ist ganz leicht möglich, aber ich hab's jetzt mit einem Label gemacht, das zunächst invisible ist, das gefällt mir sogar besser ...RSE hat geschrieben:Mit welcher Meldung schmiert dein Programm ab?
Project cssys.exe raised exception class external SIGSEGV
aber vielleicht liegt der Grund des Abschmierens ja auch in deinem Quelltext...
Ich dachte es liegt vielleicht daran, daß Form1 zu diesem Zeipunkt noch nicht sichtbar ist, aber ich hab mir nicht allzuviel Kopfzerbrechen darüber gemacht.
Früher war alles besser. Und aus Holz!
-
- Beiträge: 462
- Registriert: Mi 30. Jul 2008, 13:11
- OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
- CPU-Target: 32Bit
- Kontaktdaten:
Re: Der richtige Zeitpunkt am Beginn eines Programmes ...
Hm, das ist eine Zugriffsverletzung. Herauszubekommen wäre nun, welcher Befehl diese Zugriffsverletzung auslöst. Dann weißt du bestimmt schon, wo der Fehler ist
Ich nehme an, dass du etwas ausgeben willst, was noch nicht initialisiert worden ist. Es muss erwas mit einem noch nicht erstellten Objekt zu tun haben, nicht ob die Form sichtbar ist oder nicht.

Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!
- corpsman
- Lazarusforum e. V.
- Beiträge: 1617
- Registriert: Sa 28. Feb 2009, 08:54
- OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
- CPU-Target: 64Bit
- Wohnort: Stuttgart
- Kontaktdaten:
Re: Der richtige Zeitpunkt am Beginn eines Programmes ...
Also wenn ich so was machen will, dann, entferne ich das Application.CreateForm aus der Project Datei.
und schreibe es in das OnCreate der Form1, dann kann man im OnCreate der Form auch wunderbar die andere Form aufrufen
und schreibe es in das OnCreate der Form1, dann kann man im OnCreate der Form auch wunderbar die andere Form aufrufen

--
Just try it
Just try it
-
- Beiträge: 462
- Registriert: Mi 30. Jul 2008, 13:11
- OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
- CPU-Target: 32Bit
- Kontaktdaten:
Re: Der richtige Zeitpunkt am Beginn eines Programmes ...
Man muss einfach wissen, was man tut. Die erste erstellte Form wird die Mainform. Ein OnCreate wird nur aufgerufen, wenn irgendwo anders das CreateForm für diese Form aufgerufen wird. Dein Vorgehen klappt also auch nur in bestimmter Konstellation...
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!