Der richtige Zeitpunkt am Beginn eines Programmes ...

Für Fragen von Einsteigern und Programmieranfängern...
AlterMann
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 ...

Beitrag von AlterMann »

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
Früher war alles besser. Und aus Holz!

Benutzeravatar
theo
Beiträge: 10857
Registriert: Mo 11. Sep 2006, 19:01

Re: Der richtige Zeitpunkt am Beginn eines Programmes ...

Beitrag von theo »

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.

Hitman
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 ...

Beitrag von Hitman »

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.

Benutzeravatar
theo
Beiträge: 10857
Registriert: Mo 11. Sep 2006, 19:01

Re: Der richtige Zeitpunkt am Beginn eines Programmes ...

Beitrag von theo »

Hitman 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.
Oder gleich im lpr showen ;-)

Hitman
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 ...

Beitrag von Hitman »

theo hat geschrieben:Oder gleich im lpr showen ;-)
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 Rom :D

RSE
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 ...

Beitrag von RSE »

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!

AlterMann
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 ...

Beitrag von AlterMann »

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 :mrgreen: )

Danke
Früher war alles besser. Und aus Holz!

Benutzeravatar
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 ...

Beitrag von af0815 »

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 :mrgreen: )
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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

RSE
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 ...

Beitrag von RSE »

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.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

AlterMann
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 ...

Beitrag von AlterMann »

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 ... :roll:
Früher war alles besser. Und aus Holz!

RSE
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 ...

Beitrag von RSE »

AlterMann hat geschrieben:mit OnShow schmiert das Programm wiederum ab, wenn ich innerhalb von Form3 ein ShowMessage aufrufe.
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...
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

AlterMann
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 ...

Beitrag von AlterMann »

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...
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 ...

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!

RSE
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 ...

Beitrag von RSE »

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!

Benutzeravatar
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 ...

Beitrag von corpsman »

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 ;)
--
Just try it

RSE
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 ...

Beitrag von RSE »

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!

Antworten