[gelöst]2 Hauptformulare-Unterscheidung über Kommandozeile

Rund um die LCL und andere Komponenten
GU_Meyer
Beiträge: 66
Registriert: Mo 21. Apr 2014, 10:22

[gelöst]2 Hauptformulare-Unterscheidung über Kommandozeile

Beitrag von GU_Meyer »

Hallo,
für mein Projekt bräuchte ich eigentlich die Möglichkeit, abhängig von einem Kommandozeilenparameter zwischen 2 Main-Formularen zu wechseln (eine einfache Oberfläche über den Parameter "run" oder die komplette.
Die für mich einfachste Lösung ist nun, die lpr-Datei anzupassen und ansonsten einfach 2 Formulare im Projekt zu haben. Daher steht in der *.lpr-Datei nun (nur die gegenübereinem leeren Projekt geänderten Zeilen):

Code: Alles auswählen

 
  RequireDerivedFormResource:=True;
  Application.Initialize;
  if (ParamCount > 0) and (ParamStr(1) = 'run' )then
  Application.CreateForm(TForm1, Form1)
  else
  Application.CreateForm(TForm2, Form2);
  Application.Run


Frage: Kann das funktionieren? Oder handele ich mir damit absehbar Probleme ein, z.B. weil beide Formulare automatisch erzeugt werden? Der erste Test verlief zumindest erfolgreich.
Gruss

GU_Meyer

PS: Das die Abfrage von ParamCount und Paramstr noch Tücken haben kann, ist mir bekannt - darum geht es mir auch nicht.
Zuletzt geändert von GU_Meyer am Do 6. Dez 2018, 14:35, insgesamt 1-mal geändert.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Zwei Hauptformulare-Unterscheidung über Kommandozeile

Beitrag von Socke »

GU_Meyer hat geschrieben:Frage: Kann das funktionieren? Oder handele ich mir damit absehbar Probleme ein, z.B. weil beide Formulare automatisch erzeugt werden? Der erste Test verlief zumindest erfolgreich.

Das erste erzeugte Formular wird automatisch das Hauptformular, somit ist das der richtige Weg.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

GU_Meyer
Beiträge: 66
Registriert: Mo 21. Apr 2014, 10:22

Re: Zwei Hauptformulare-Unterscheidung über Kommandozeile

Beitrag von GU_Meyer »

Socke hat geschrieben:
GU_Meyer hat geschrieben:Frage: Kann das funktionieren? Oder handele ich mir damit absehbar Probleme ein, z.B. weil beide Formulare automatisch erzeugt werden? Der erste Test verlief zumindest erfolgreich.

Das erste erzeugte Formular wird automatisch das Hauptformular, somit ist das der richtige Weg.


Danke, das wollte ich wissen. Dann kann ich weiter machen.

Gruss
GU_Meyer

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

Re: Zwei Hauptformulare-Unterscheidung über Kommandozeile

Beitrag von wp_xyz »

Allerdings musst du daran denken, dass die IDE selbst in die lpr-Datei schreibt und dabei oft selbst-gemachte Änderungen zerstört. Wenn du z.B. zwei weitere Formulare dem Projekt hinzufügst und im Projektinspektor das vierte Formular vor das dritte schiebst (also ohne dass dies die beiden ersten Formulare betrifft), wird das "else" in deinem Code entfernt, d.h. aus

Code: Alles auswählen

  if (ParamCount > 0) and (ParamStr(1) = 'run' )then
    Application.CreateForm(TForm1, Form1)
  else
    Application.CreateForm(TForm2, Form2);

wird

Code: Alles auswählen

  if (ParamCount > 0) and (ParamStr(1) = 'run') then
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm4, Form4);
  Application.CreateForm(TForm3, Form3);

Das bedeutet, dass nun das zweite Formular immer erzeugt wird, während es bei deinem ursprünglichem Code nur alternativ zum ersten war.

Ich glaube nicht, dass man viel dagegen machen kann (vielleicht alle Formulare, außer dem Hauptformular, zur Laufzeit dynamisch erzeugen). Auf jeden Fall solltest du gelegentlich in die lpr-Datei schauen, ob noch alles so ist, wie von dir geplant.

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

Beitrag von braunbär »

Ich frage mich, ob das überhaupt ein guter Ansatz ist.
Wenn ich es richtig verstanden habe, dann machen ja die beiden Hauptformulare ziemlich das gleiche, nur mit etwas veränderter Oberfläche. Da wird wahrscheilich auch viel Code in den beiden Formular-Units gleich sein.
Hast du an die Möglichkeit gedacht, nur ein Hauptformular zu erstellen und darauf zwei Panels (zur Laufzeit dann alclient, zur Design Zeit natürlich alnone) zu legen, von denen nur eines sichtbar ist?

GU_Meyer
Beiträge: 66
Registriert: Mo 21. Apr 2014, 10:22

Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

Beitrag von GU_Meyer »

braunbär hat geschrieben:Ich frage mich, ob das überhaupt ein guter Ansatz ist.
Wenn ich es richtig verstanden habe, dann machen ja die beiden Hauptformulare ziemlich das gleiche, nur mit etwas veränderter Oberfläche. Da wird wahrscheilich auch viel Code in den beiden Formular-Units gleich sein.

Es ist eben nicht soviel Code gleich, da ich versuche, soviel wie möglich aus dem Hauptformular bzw. den Formularen raus zu halten. Die Formulare sollen so weit möglch reine Oberfläche sein.
braunbär hat geschrieben:Hast du an die Möglichkeit gedacht, nur ein Hauptformular zu erstellen und darauf zwei Panels (zur Laufzeit dann alclient, zur Design Zeit natürlich alnone) zu legen, von denen nur eines sichtbar ist?

Das muss ich mal ausprobieren - würde die von
wp_xyz hat geschrieben: Allerdings musst du daran denken, dass die IDE selbst in die lpr-Datei schreibt und dabei oft selbst-gemachte Änderungen zerstört. Wenn du z.B. zwei weitere Formulare dem Projekt hinzufügst und im Projektinspektor das vierte Formular vor das dritte schiebst
genannte Problematik umgehen. Ich teste mal.....

Gruss
GU_Meyer

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

Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

Beitrag von wp_xyz »

braunbär hat geschrieben:Hast du an die Möglichkeit gedacht, nur ein Hauptformular zu erstellen und darauf zwei Panels (zur Laufzeit dann alclient, zur Design Zeit natürlich alnone) zu legen, von denen nur eines sichtbar ist?

Alternativ könntest du mit Frames arbeiten, das hätte den Vorteil, dass der Code zwischen den beiden Varianten in getrennten Units bleibt. Dazu müsstest du das Hauptformular leer lassen und je nach Kommandozeilenparameter zur Laufzeit den einen oder den anderen Frame erzeugen und einfügen.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

Beitrag von af0815 »

Wenn man in den Projektoptionen 'Auto-Create new Forms' deaktiviert, so schreibt die IDE auch nicht mehr soviel in die .prj.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

GU_Meyer
Beiträge: 66
Registriert: Mo 21. Apr 2014, 10:22

Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

Beitrag von GU_Meyer »

wp_xyz hat geschrieben:
braunbär hat geschrieben:Hast du an die Möglichkeit gedacht, nur ein Hauptformular zu erstellen und darauf zwei Panels (zur Laufzeit dann alclient, zur Design Zeit natürlich alnone) zu legen, von denen nur eines sichtbar ist?

Alternativ könntest du mit Frames arbeiten, das hätte den Vorteil, dass der Code zwischen den beiden Varianten in getrennten Units bleibt. Dazu müsstest du das Hauptformular leer lassen und je nach Kommandozeilenparameter zur Laufzeit den einen oder den anderen Frame erzeugen und einfügen.


Da ich aus der Delphi-Welt komme bin ich bei Frames skeptisch. In Delphi galten Frames als Quelle ständigen Ärgers und als unzuverlässig. Wobei ich grundsätzlich auch schon mal an Frames gedacht hab - sind die in Lazarus stabil und funktionsfähig?
Dann wären die mir wahrscheinlich lieber als die von braunbär vorgeschlagenen Panels.

Gruss
GU_Meyer

GU_Meyer
Beiträge: 66
Registriert: Mo 21. Apr 2014, 10:22

Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

Beitrag von GU_Meyer »

af0815 hat geschrieben:Wenn man in den Projektoptionen 'Auto-Create new Forms' deaktiviert, so schreibt die IDE auch nicht mehr soviel in die .prj.


Ich denke, das ist so ein Fall für "wenns nicht funktioniert, schau nach, welche Formulare wie erzeugt werden" - da ich ja weiß, dass die in die .prj bzw. .lpr geschrieben werden, kann ich einfach nachgucken. Aber trotzdem guter Tipp.

Gruss
GU_Meyer

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

Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

Beitrag von wp_xyz »

GU_Meyer hat geschrieben:Wobei ich grundsätzlich auch schon mal an Frames gedacht hab - sind die in Lazarus stabil und funktionsfähig?
Dann wären die mir wahrscheinlich lieber als die von braunbär vorgeschlagenen Panels.

Panels machen nur Sinn, wenn ihr Inhalt "einfach" ist, denn du hast immer beide Varianten auf dem Formular, das wird schnell unübersichtlich. Frames sind dagegen getrennt, wenn du den einen Frame designst, ist der andere nicht im Weg.

Ich habe ein größeres Projekt mit Frames gemacht und hatte keine Probleme damit. Du solltest nur die Frames nicht zur Designzeit ins Formular setzen, da hat Lazarus Probleme mit der Aktualisierung, wenn im Ausgangsframe etwas geändert wird. Aber hier werden die Frames ja zur Laufzeit eingesetzt, je nachdem, welcher Kommandozeilenparameter übergeben wurde. In der Anlage wird skizziert, wie ich mir das vorstelle: Mit Parameter "test" wird Frame1 eingebunden, ansonsten Frame2.
Dateianhänge
form_2frames.zip
(3.22 KiB) 70-mal heruntergeladen

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

Beitrag von mschnell »

Einfach die Visible property des einen Formulars setzen und des anderen löschen ?!?!?!

-Michael

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

Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

Beitrag von wp_xyz »

mschnell hat geschrieben:Einfach die Visible property des einen Formulars setzen und des anderen löschen ?!?!?!

Aber ist das zweite, nun sichtbar gemachte Formular wirklich das "Hauptformular" in dem Sinn, dass es als Application.MainForm genannt wird, für die Zentrierung mittels Form.Position := poMainFormCenter verwendet wird, oder beim Schließen die Anwendung beendet, oder trifft das nicht eher auf das erste Formular zu?

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

Beitrag von braunbär »

Im allgemeinen halte ich nicht viel davon, den Code auf zu viele verschiedene Units aufzugliedern (hier wären es drei statt einer Unit, das wird dann leicht unübersichtlich), deshalb der Vorschlag, Panels zu verwenden.

Zur Designzeit kann man die Form ja so groß machen, dass die beiden Panels untereinander oder nebeneinander liegen, zur Laufzeit muss dann die Formgröße angepasst und beim gewählten Panel alclient gesetzt werden.
Wenn man aber die Sachen in unterschiedlichen Units haben möchte, dann sind wohl Frames die Komponenten der Wahl, und, wie wp_xyz schon geschrieben hat, sind Frames unproblematisch, wenn sie zur Laufzeit generiert werden - Frames zur Design Zeit ins Formular setzen, ist leider extrem mühsam, das solte man eher vermeiden.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

Beitrag von af0815 »

Ansätze gibt es viele. Wenn die Logik unterschiedlich ist, so bevorzuge ich absolut Frames zur Laufzeit.Das hält auch den Code schön sauber getrennt. Ansinsten sind auch Tabsheets recht nett.die Reiter kann man ja deaktivieren. Mit Panels arbeiten ist fürmichnur sinnvoll imDesign, da herumzuuschalten,da arbeite ichlieber mit Frames.

Frames sind mittlerweile sehr stabil. Auch Frames in Frames von Frames sind kein Problem. Probleme gab es nur bei manchen Komponenten, wenn die Unbedingt ein TForm als Parent haben wollten. Da habe ich bei denStandardkomponenten keine Probleme mehr. Könnte ev. bei älteren Exoten Probleme machen. Von mir verwendet unter Windows 32, Linux X64, Linux arm.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten