GUI mit Commandline Parametern
GUI mit Commandline Parametern
Hallo an alle
Ich habe eine GUI geschrieben und würde dieser zusätzlich gerne noch Commandline Optionen hinzufügen.
Ist das machbar das eine GUI auch ein CLI-teilbesitzt und je nachdemwieman die MYGUI.exe aufruft eben die normale GUIstartet oder eben das Konsolenfenster?
Was genau muss ich im Quellcode da einrichten?
Wenn ich ein neues Projekt erstelle kann ich anfangs ja auswählen obs ne GUI oder ein Konsolenprogramm wird.
Ich habe zum testen mal ein Kosolenprogramm erstellt und angefangen etwas "rumzuspielen". Ich bin da noch etwas neuling auf dem gebiet.
LG
Hubble
Ich habe eine GUI geschrieben und würde dieser zusätzlich gerne noch Commandline Optionen hinzufügen.
Ist das machbar das eine GUI auch ein CLI-teilbesitzt und je nachdemwieman die MYGUI.exe aufruft eben die normale GUIstartet oder eben das Konsolenfenster?
Was genau muss ich im Quellcode da einrichten?
Wenn ich ein neues Projekt erstelle kann ich anfangs ja auswählen obs ne GUI oder ein Konsolenprogramm wird.
Ich habe zum testen mal ein Kosolenprogramm erstellt und angefangen etwas "rumzuspielen". Ich bin da noch etwas neuling auf dem gebiet.
LG
Hubble
-
- Beiträge: 43
- Registriert: Mo 3. Mär 2014, 16:06
- OS, Lazarus, FPC: Ubuntu Linux 14.04, Windows 7/8, Lazarus 1.2.2, Delphi XE5
- CPU-Target: amd64
- Wohnort: Rostock
- Kontaktdaten:
Re: GUI mit Commandline Parametern
Der Teil mit der GUI passiert in der .lpr-Datei. Wenn du weißt oder herausfindest, wie du die Kommandozeilenparameter auswertest,
sollte das für dich der richtige Ansatzpunkt sein
sollte das für dich der richtige Ansatzpunkt sein

((2*b) || !(to_be)) ... that's the question.
Re: GUI mit Commandline Parametern
hi Philos
der tipp mit der .lpr ist schonmal gut. jetzt weis ich wo der quellcode hinkommt.
allerdings fehlt mir da noch einiges an wissen.
meine .lpr sieht wie folgt aus:
in einem neuen/leeren Konsolenprogramm steht folgendes drin:
ich habe es geschafft einen weiteren parameter zu "generieren" in dem ich bei
das ganze mit einem "t" erweiter habe:
mit HasOption konnte ich dann draufzugreifen auf "t".
hinter das "help" hatte ich auch mal "test" geschrieben. beide varianten funktionierten.
exakt verstehe ich das verhalten von den beiden worten/werten noch nicht.
hat das irgendwas mit "kurz" und "lang" variable zu tun??
was ich jetzt nicht weis ist, wie ich den "neuen/leeren" code sinnvoll in meiner .lpr einbinde. also welche teile davon. einiges steht ja schon da.
LG
hubble
der tipp mit der .lpr ist schonmal gut. jetzt weis ich wo der quellcode hinkommt.
allerdings fehlt mir da noch einiges an wissen.
meine .lpr sieht wie folgt aus:
Code: Alles auswählen
program chapterEditor;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, Unit1, runtimetypeinfocontrols, Unit2, bluray_mpls, dreiGPP_TTXT,
Sprache_Hilfe, multiAVCHD, OGG, XML, Multi_Kapitel,
Multi_Versionen
{ you can add units after this };
{$R *.res}
begin
Application.Title:='chapterEditor';
RequireDerivedFormResource := True;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm3, Form3);
Application.CreateForm(TF_MultiKap, F_MultiKap);
Application.Run;
end.
Code: Alles auswählen
program test;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, CustApp
{ you can add units after this };
type
{ TMyApplication }
TMyApplication = class(TCustomApplication)
protected
procedure DoRun; override;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure WriteHelp; virtual;
end;
{ TMyApplication }
procedure TMyApplication.DoRun;
var
ErrorMsg: String;
begin
// quick check parameters
ErrorMsg:=CheckOptions('h','help');
if ErrorMsg<>'' then begin
ShowException(Exception.Create(ErrorMsg));
Terminate;
Exit;
end;
// parse parameters
if HasOption('h','help') then begin
WriteHelp;
Terminate;
Exit;
end;
{ add your program here }
// stop program loop
Terminate;
end;
constructor TMyApplication.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
StopOnException:=True;
end;
destructor TMyApplication.Destroy;
begin
inherited Destroy;
end;
procedure TMyApplication.WriteHelp;
begin
{ add your help code here }
writeln('Usage: ',ExeName,' -h');
end;
var
Application: TMyApplication;
begin
Application:=TMyApplication.Create(nil);
Application.Title:='My Application';
Application.Run;
Application.Free;
end.
Code: Alles auswählen
CheckOptions('h','help');
Code: Alles auswählen
CheckOptions('h:t','help');
hinter das "help" hatte ich auch mal "test" geschrieben. beide varianten funktionierten.
exakt verstehe ich das verhalten von den beiden worten/werten noch nicht.
hat das irgendwas mit "kurz" und "lang" variable zu tun??
was ich jetzt nicht weis ist, wie ich den "neuen/leeren" code sinnvoll in meiner .lpr einbinde. also welche teile davon. einiges steht ja schon da.
LG
hubble
-
- Beiträge: 43
- Registriert: Mo 3. Mär 2014, 16:06
- OS, Lazarus, FPC: Ubuntu Linux 14.04, Windows 7/8, Lazarus 1.2.2, Delphi XE5
- CPU-Target: amd64
- Wohnort: Rostock
- Kontaktdaten:
Re: GUI mit Commandline Parametern
ja hat es
Hier ist es ganz gut beschrieben: http://wiki.freepascal.org/Command_line ... _variables. Du kannst einer Option also sowohl eine kurze als auch eine lange Schreibweise zuordnen oder auch nicht, ganz wie du willst
Letztendlich musst du jetzt nur noch Codebeispiel 1 und 2 verbinden. Du fragst über HasOption ab, ob das Prog. in der Kommandozeile laufen soll und startest dann entweder das KZ-Prog wie in Beispiel 2, andernfalls erstellst du die Application mit all den Forms wie im ersten Beispiel. Vom Prinzip klar geworden? Gemacht hab ich das auch noch nicht, hab also kein Beispiel da, das ich herzaubern kann
MfG, Philos


Letztendlich musst du jetzt nur noch Codebeispiel 1 und 2 verbinden. Du fragst über HasOption ab, ob das Prog. in der Kommandozeile laufen soll und startest dann entweder das KZ-Prog wie in Beispiel 2, andernfalls erstellst du die Application mit all den Forms wie im ersten Beispiel. Vom Prinzip klar geworden? Gemacht hab ich das auch noch nicht, hab also kein Beispiel da, das ich herzaubern kann

MfG, Philos
((2*b) || !(to_be)) ... that's the question.
-
- Beiträge: 6906
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: GUI mit Commandline Parametern
Am einfachsten geht es so:
Wobei ParamStr(0) den Pfad und Name der Exe zurückgibt.
ParamCount ist die Anzahl der Parameter.
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
i: integer;
begin
s := '';
for i := 0 to ParamCount do begin
s := s + 'Parameter ' + IntToStr(i) + ': ' + ParamStr(i) + #10;
end;
ShowMessage( s);
end;
ParamCount ist die Anzahl der Parameter.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: GUI mit Commandline Parametern
danke für den link Philos,
jedes bissl text was ich dazu lesen kann hilft mir weiter.
also das grundprinzip ist mir klar, wenn auch noch nicht in vollem umfang.
mit HasOption abfragen ob die GUI.exe mit paramtern gestartet wurde: was ja fast nur sein kann wenn es von einer bat-datei oder der konsole selbst aus gestartet wurde.
ein doppelklick würde die GUI.exe starten aber keine parameter mitgeben.
ist das so richtig erkannt?
wenn dann HasOption parameter findet nur die konsole starten (oder kann man die dann auch unsichtbar starten?).
wo genau müsste das denn in meine .lpr rein kommen?
ich muss doch sicher auch noch die uses: CustApp einbinden oder?
Leider bietet das Lazarus Buch nicht viel hilfe zu diesem thema.
In den Projekteinstellungen habe ich den haken für die win32 Gui (-WG) mal testhalber entfernt. ok da geht dann gleich ein konsolenfenster mit auf.
weiter gebracht hat es mich aber noch nicht.
jedes bissl text was ich dazu lesen kann hilft mir weiter.
also das grundprinzip ist mir klar, wenn auch noch nicht in vollem umfang.
mit HasOption abfragen ob die GUI.exe mit paramtern gestartet wurde: was ja fast nur sein kann wenn es von einer bat-datei oder der konsole selbst aus gestartet wurde.
ein doppelklick würde die GUI.exe starten aber keine parameter mitgeben.
ist das so richtig erkannt?
wenn dann HasOption parameter findet nur die konsole starten (oder kann man die dann auch unsichtbar starten?).
wo genau müsste das denn in meine .lpr rein kommen?
ich muss doch sicher auch noch die uses: CustApp einbinden oder?
Leider bietet das Lazarus Buch nicht viel hilfe zu diesem thema.
In den Projekteinstellungen habe ich den haken für die win32 Gui (-WG) mal testhalber entfernt. ok da geht dann gleich ein konsolenfenster mit auf.
weiter gebracht hat es mich aber noch nicht.
Zuletzt geändert von hubblec4 am So 24. Mär 2019, 13:39, insgesamt 1-mal geändert.
-
- Beiträge: 6906
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: GUI mit Commandline Parametern
Habe ich es richtig verstanden, du brauchst keine Konsolen-Ausgabe ? Unsichtbar währe einfacher.wenn dann HasOption parameter findet nur die konsole starten (oder kann man die dann auch unsichtbar starten?).
Du kannst bei Verküpfungen auf deine Exe auch Parameter mitgeben.was ja fast nur sein kann wenn es von einer bat-datei oder der konsole selbst aus gestartet wurde.
Wen du mit Paramstr und ParamCount arbeitest brauchst das nicht.ich muss doch sicher auch noch die uses: CustApp einbinden oder?
Was willst du für Parameter übergeben ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: GUI mit Commandline Parametern
im prinzip müsste nicht unbedingt eine konsole angezeigt werden. würde das aber gerne als option (parameter) versehen wollen.
das mit der verknüpfung und den dortigen paramtern hatte ich übersehen. sollte aber nicht weiter ins gewicht fallen.
also nur HasOption braucht die CustApp uses?
Es werden sicher einige parameter werden. input, output, output-format, fps, (vll noch: namen), ein "versteckt-modus"(hide)
bin mir da noch nicht im klaren.
das mit der verknüpfung und den dortigen paramtern hatte ich übersehen. sollte aber nicht weiter ins gewicht fallen.
also nur HasOption braucht die CustApp uses?
Es werden sicher einige parameter werden. input, output, output-format, fps, (vll noch: namen), ein "versteckt-modus"(hide)
bin mir da noch nicht im klaren.
Re: GUI mit Commandline Parametern
short options sind immer mit einem buchstaben (character) versehen.
wenn ich also bei HasOption(hf, help file) eingeben kann ich h oder f als parameter nutzen.
wenn ich aber einen parameter haben will der "fps" heist wie müsste ich das anstellen. also es soll nicht als lang-option verwendet werden.
wenn ich also bei HasOption(hf, help file) eingeben kann ich h oder f als parameter nutzen.
wenn ich aber einen parameter haben will der "fps" heist wie müsste ich das anstellen. also es soll nicht als lang-option verwendet werden.
Zuletzt geändert von hubblec4 am Do 3. Jul 2014, 15:57, insgesamt 1-mal geändert.
-
- Beiträge: 43
- Registriert: Mo 3. Mär 2014, 16:06
- OS, Lazarus, FPC: Ubuntu Linux 14.04, Windows 7/8, Lazarus 1.2.2, Delphi XE5
- CPU-Target: amd64
- Wohnort: Rostock
- Kontaktdaten:
Re: GUI mit Commandline Parametern
So wie ich das sehe so:hubblec4 hat geschrieben:short options sind immer mit einem buchstaben (character) versehen.
wenn ich also bei HasOption(hf, help file) eingeben kann ich h oder f also parameter nutzen.
wenn ich aber einen parameter haben will der "fps" heist wie müsste ich das anstellen. also es soll nicht als lang-option verwendet werden.
Code: Alles auswählen
if HasOption('' , 'fps') then ...
((2*b) || !(to_be)) ... that's the question.
Re: GUI mit Commandline Parametern
hi Philos
also hier würde ich sagen hat man einen parameter (oder eben keinen) "kurzen" parameter, dafür aber einen lang-paramter welcher dann mit
--fps
aufgerufen werden müsste.
aber es soll ein kurz-paramter sein der mit dem einfachen "-" eingeleitet wird.
als beispiel: ich nutze viel und oft eac3to. dort kann man ja auch verschieden lange "kurz-parameter" eingeben. zum beispiel: -10mb oder -core
oder sind das alles lang-parameter? aber warum haben sie nur ein "-" am anfang?
LG
Hubble
also hier würde ich sagen hat man einen parameter (oder eben keinen) "kurzen" parameter, dafür aber einen lang-paramter welcher dann mit
--fps
aufgerufen werden müsste.
Code: Alles auswählen
if HasOption('' , 'fps') then ...
als beispiel: ich nutze viel und oft eac3to. dort kann man ja auch verschieden lange "kurz-parameter" eingeben. zum beispiel: -10mb oder -core
oder sind das alles lang-parameter? aber warum haben sie nur ein "-" am anfang?
LG
Hubble
-
- Beiträge: 6906
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: GUI mit Commandline Parametern
Das kommt darauf wie der Programmierer die Parameter bestimmt.als beispiel: ich nutze viel und oft eac3to. dort kann man ja auch verschieden lange "kurz-parameter" eingeben. zum beispiel: -10mb oder -core
oder sind das alles lang-parameter? aber warum haben sie nur ein "-" am anfang?
Unter linux gibt es meistens kurze und lange Parameter, das sieht man hier gut.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 43
- Registriert: Mo 3. Mär 2014, 16:06
- OS, Lazarus, FPC: Ubuntu Linux 14.04, Windows 7/8, Lazarus 1.2.2, Delphi XE5
- CPU-Target: amd64
- Wohnort: Rostock
- Kontaktdaten:
Re: GUI mit Commandline Parametern
als Workaround könntest du ja auch einfach beim Lang-Parameter "-fps" eingeben.
Dann solltest du, so wie du es erzählt hast, ja am Ende "--fps" als Parameter erhalten.
Und wenn man den Strich weglässt, hast du halt '-fps'. Damit sollte doch jetzt alles funktionieren
( ohne dass ich es jemals ausprobiert hätte )
MfG, Philos
Dann solltest du, so wie du es erzählt hast, ja am Ende "--fps" als Parameter erhalten.
Und wenn man den Strich weglässt, hast du halt '-fps'. Damit sollte doch jetzt alles funktionieren

( ohne dass ich es jemals ausprobiert hätte )
MfG, Philos
((2*b) || !(to_be)) ... that's the question.
Re: GUI mit Commandline Parametern
Philos hat geschrieben:als Workaround könntest du ja auch einfach beim Lang-Parameter "-fps" eingeben.
Dann solltest du, so wie du es erzählt hast, ja am Ende "--fps" als Parameter erhalten.
Und wenn man den Strich weglässt, hast du halt '-fps'. Damit sollte doch jetzt alles funktionieren
( ohne dass ich es jemals ausprobiert hätte )
MfG, Philos
mmh würde ich jetzt als nicht richtig ansehen. als "lang-parameter" fps erzeugt doch schon --fps
dann hätte ich ja bei "-fps" dann ---fps.
oder liege ich da jetzt voll daneben.
Re: GUI mit Commandline Parametern
Freepascal stellt mit Application.HasOption einen KurzOption ( -Char OptionWert ) und eine LangOption ( --String=OptionWert ) zur Verfügung.
Siehe Link von Philos: http://wiki.freepascal.org/Command_line ... _variables
oder http://www.freepascal.org/docs-html/fcl ... ption.html
Wenn Du etwas entgegen der Methodik von Application.HasOption machen willst, kannst Du Deine Parameter selber parsen (was anderes macht FPC mit HasOption im Prinzip auch nicht), siehe http://www.lazarusforum.de/viewtopic.php?p=70236#p70236
Siehe Link von Philos: http://wiki.freepascal.org/Command_line ... _variables
oder http://www.freepascal.org/docs-html/fcl ... ption.html
Wenn Du etwas entgegen der Methodik von Application.HasOption machen willst, kannst Du Deine Parameter selber parsen (was anderes macht FPC mit HasOption im Prinzip auch nicht), siehe http://www.lazarusforum.de/viewtopic.php?p=70236#p70236
z.B.:hubblec4 hat geschrieben:als beispiel: ich nutze viel und oft eac3to. dort kann man ja auch verschieden lange "kurz-parameter" eingeben. zum beispiel: -10mb oder -core
Code: Alles auswählen
procedure TForm1.FormCreate(Sender: TObject);
var
i: Int32;
s: String;
begin
s:='';
for i:=1 to Application.ParamCount do begin
if Application.Params[i]='-10mb' then s:=s + 'Option: -10mb übergeben' + LineEnding;
if Application.Params[i]='-core' then s:=s + 'Option: -core übergeben' + LineEnding;
end;
if Length(s) > 0 then ShowMessage(s);
end;
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;