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

Rund um die LCL und andere Komponenten

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

Beitragvon GU_Meyer » 6. Dez 2018, 12:11 [gelöst]2 Hauptformulare-Unterscheidung über Kommandozeile

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 6. Dez 2018, 14:35, insgesamt 1-mal geändert.
GU_Meyer
 
Beiträge: 43
Registriert: 21. Apr 2014, 09:22

Beitragvon Socke » 6. Dez 2018, 14:04 Re: Zwei Hauptformulare-Unterscheidung über Kommandozeile

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
Socke
 
Beiträge: 2557
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 8.1/Debian GNU/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon GU_Meyer » 6. Dez 2018, 14:34 Re: Zwei Hauptformulare-Unterscheidung über Kommandozeile

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
GU_Meyer
 
Beiträge: 43
Registriert: 21. Apr 2014, 09:22

Beitragvon wp_xyz » 6. Dez 2018, 15:25 Re: Zwei Hauptformulare-Unterscheidung über Kommandozeile

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.
wp_xyz
 
Beiträge: 2696
Registriert: 8. Apr 2011, 08:01

Beitragvon braunbär » 6. Dez 2018, 15:48 Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

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?
braunbär
 
Beiträge: 254
Registriert: 8. Jun 2017, 17:21

Beitragvon GU_Meyer » 6. Dez 2018, 16:48 Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

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
GU_Meyer
 
Beiträge: 43
Registriert: 21. Apr 2014, 09:22

Beitragvon wp_xyz » 6. Dez 2018, 16:58 Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

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.
wp_xyz
 
Beiträge: 2696
Registriert: 8. Apr 2011, 08:01

Beitragvon af0815 » 6. Dez 2018, 18:17 Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

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).
af0815
 
Beiträge: 3501
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon GU_Meyer » 7. Dez 2018, 07:23 Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

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: 43
Registriert: 21. Apr 2014, 09:22

Beitragvon GU_Meyer » 7. Dez 2018, 07:26 Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

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
GU_Meyer
 
Beiträge: 43
Registriert: 21. Apr 2014, 09:22

Beitragvon wp_xyz » 7. Dez 2018, 09:56 Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

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.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
wp_xyz
 
Beiträge: 2696
Registriert: 8. Apr 2011, 08:01

Beitragvon mschnell » 7. Dez 2018, 13:00 Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

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

-Michael
mschnell
 
Beiträge: 3253
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon wp_xyz » 7. Dez 2018, 14:33 Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

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?
wp_xyz
 
Beiträge: 2696
Registriert: 8. Apr 2011, 08:01

Beitragvon braunbär » 7. Dez 2018, 14:49 Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

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.
braunbär
 
Beiträge: 254
Registriert: 8. Jun 2017, 17:21

Beitragvon af0815 » 7. Dez 2018, 15:32 Re: [gelöst]2 Hauptformulare-Unterscheidung über Kommandozei

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).
af0815
 
Beiträge: 3501
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste

cron
porpoises-institution
accuracy-worried