cmd Befehle in GUI Anwendung

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
lycaner
Beiträge: 56
Registriert: Mi 20. Jul 2011, 13:29
OS, Lazarus, FPC: Winux (L 1.4.4 FPC 2.6.)
CPU-Target: 64 Bit AMD
Wohnort: Bern, Schweiz

cmd Befehle in GUI Anwendung

Beitrag von lycaner »

Hallo Spezialisten,

ich habe den Follgenden Eintrag gefunden, welcher mir die Funktion cmd Commands und Lazarus etwas näher gebracht hatte.
Doch ich vertsehe es noch nicht ganz, das etwas sehr speziell ist.

http://www.lazarusforum.de/viewtopic.ph ... Parametern

Eigentlich bin ich durch diesen Link auf die Idee damit gekommen:
http://www.gnu.org/software/help2man/

Doch ich fand nichts für Lazarus.

Eigentlich wollte ich in meine Anwendung eine "kleine Hilfe" einbauen mit Parametern, so z.b. eine BackUp Funktion der Datenbank.
Oder eine einfache Anzeige der Version oder was ich sonnst noch so finde beim Arbeite.

Nur habe ich das ganze Thema noch nicht kapiert.
Ich habe folgenden Code in meine Applikation Integriert:

Code: Alles auswählen

 
 
var
i: Int32;
    s: string;
 
// start with Parameter
 
  s := '';
  for i := 1 to Application.ParamCount do
  begin
    if Application.Params[i] = '-h' then
      form2.show;
      form1.Hide;
 
    if Application.Params[i] = '-v' then
      form4.show;
       form1.Hide;
 
    if Application.Params[i] = '-b' then
      RunBackUp(self);
 
 
    if Application.Params[i] = '--backup' then
      RunBackUp(self);
 
 
    if Application.Params[i] = '--Version' then
      form4.show;
      form1.Hide;
 
    if Application.Params[i] = '--Help' then
      form2.show;
     form1.Hide;
 
    if Application.Params[i] = '--Help-DE' then
      RunGermanHelp(self);
 
 
    if Application.Params[i] = '--Help-EN' then
      RunEnglishHelp(self);
 
 
    if Application.Params[i] = '--Help-TAGALOG' then
      RunTagalogHelp(self);
end;
 
Nun kommt bei mir aber ne Error Meldung beim Parameter -h und bei den anderen startet mir die Applikation mit dem Help Fenster,
und dem Haupt Fenster. Was ich ja eigentlich nicht möchte.

Ich weis leider nicht wo ich das Einstellen kann, dass mir die Applikation "mit" Parameter gestartet wird, so dass ich es im Debugger
Testen könnte.

Für eventuelle Hilfe wäre ich sehr Dankbar...
Vielleicht könnt Ihr mir uch sonst etwas Licht ins Dunkel bringen. 8)
Chris

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

Re: cmd Befehle in GUI Anwendung

Beitrag von theo »

Das ist erst einmal weniger für "Spezialisten" sondern betrifft das kleine Einmaleins des Programmierens. :wink:

Du weißt schon, das "if...then" ohne "begin..end" immer nur die nächste Zeile meint?

lycaner
Beiträge: 56
Registriert: Mi 20. Jul 2011, 13:29
OS, Lazarus, FPC: Winux (L 1.4.4 FPC 2.6.)
CPU-Target: 64 Bit AMD
Wohnort: Bern, Schweiz

Re: cmd Befehle in GUI Anwendung

Beitrag von lycaner »

Hallo Theo,
theo hat geschrieben:Das ist erst einmal weniger für "Spezialisten" sondern betrifft das kleine Einmaleins des Programmierens. :wink:

Du weißt schon, das "if...then" ohne "begin..end" immer nur die nächste Zeile meint?
Du hast recht, ich hab nen fehler gemacht mit if then und soo, das habe ich nach Deinem Posting auch gesehen,
ich war seit 4 Uhr wach und habe am Programm gearbeitet, ich glaube ich war recht übermüdet deswegen auch.

Hier also zur Sicherheit den Aktuellen Code Schnipsel: ...

Code: Alles auswählen

 
  // start with Parameter
 
  s := '';
  for i := 1 to Application.ParamCount do
  begin
    if Application.Params[i] = '-h' then
      Begin
      try
      form2.show;
      form1.Hide;
       Except
        DebugLn('Error: Can`t Start Help Menue');
      end;
 
    if Application.Params[i] = '-v' then
      Begin
      try
      form4.show;
       form1.Hide;
 
       Except
         DebugLn('Error: Can`t Start Version Menue Short');
 
       end;
 
    if Application.Params[i] = '-b' then
      Begin
      try
      RunBackUp(self);
      Except
        DebugLn('Error: Can`t Start BackUp Short');
        End;
 
    if Application.Params[i] = '--backup' then
      Begin
      try
      RunBackUp(self);
      Except
        DebugLn('Error: Can`t Start BackUp Long');
        End;
 
    if Application.Params[i] = '--Version' then
      Begin
      try
      form4.show;
      form1.Hide;
    Except
      DebugLn('Error: Can`t Start Version Menue Long');
      End;
 
    if Application.Params[i] = '--Help' then
      Begin
      try
 
      form2.show;
     form1.Hide;
      Except
        DebugLn('Error: Can`t Start Help Menue Long');
        End;
 
    if Application.Params[i] = '--Help-DE' then
      Begin
      try
      RunGermanHelp(self);
      Except
        DebugLn('Error: Can`t Start Help File DE');
        End;
 
    if Application.Params[i] = '--Help-EN' then
      Begin
      try
      RunEnglishHelp(self);
      Except
        DebugLn('Error: Can`t Start Help File EN');
        End;
 
    if Application.Params[i] = '--Help-TAGALOG' then
      Begin
      try
      RunTagalogHelp(self);
      Except
        DebugLn('Error: Can`t Start Help File Tagalog');
        End;
  end;
end;
end;
 
Du magst sogar recht haben dass ich noch jetzt komplett übermüded wirke, dem gebe ich Dir auch recht.
Der Fehler mit der Access Violation habe ich nun weg bekommen, aber das Main Windows startet dennoch
und der Parameter "-v" oder "-version" klappt auch noch nicht.

Und leider weis ich noch nicht wo ich das falsch verstanden habe.

Gruss und schöhne Ostern

Chris

SchwabenTom
Beiträge: 49
Registriert: So 4. Jan 2015, 21:34
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: cmd Befehle in GUI Anwendung

Beitrag von SchwabenTom »

Wird da so compiliert? Bekommst du keine Syntaxfehler?

Code: Alles auswählen

 
    if Application.Params[i] = '-h' then
      Begin
      try
      form2.show;
      form1.Hide;
       Except
        DebugLn('Error: Can`t Start Help Menue');
      end;
 
try-except-end gehört zusamen. Das end beendet den try (mit except). Das erste begin wird nicht geschlossen

Versuchs so

Code: Alles auswählen

 
    if Application.Params[i] = '-h' then
      begin
        try
          form2.show;
          form1.Hide;
        except
          DebugLn('Error: Can`t Start Help Menue');
        end; // try-except
      end; // if -h
 
    if Application.Params[i] = '-v' then
      begin
        try
          form4.show;
          form1.Hide;
        except
          DebugLn('Error: Can`t Start Version Menue Short');
        end; // try-except
      end; // if -v
 
      usw.
 
 

lycaner
Beiträge: 56
Registriert: Mi 20. Jul 2011, 13:29
OS, Lazarus, FPC: Winux (L 1.4.4 FPC 2.6.)
CPU-Target: 64 Bit AMD
Wohnort: Bern, Schweiz

Re: cmd Befehle in GUI Anwendung

Beitrag von lycaner »

Hallo Schwaben Tom,

danke für Dein Post, leider hatte ich in den letzten Tagen kein Internet und Gestern Spinnte mein Computer gewaltig.
Windows 10 und hänger (freez) bei USB Devices und ich habe noch nicht geschaut woran das liegt.

Aber zu Deinem Posting, ich habe es nach dem Post als ich kein Internet mehr hatte auch gesehen, ich habe es dann
Eingefügt das 2te "end"

Ja, jetzt gehts mit dem Compiler auch habe ich das ganze in der Zwischen Zeit wieder geändert und einiges anders gebaut.
Aber ich habe immer noch meine kleine Mühe damit.

Hier der Aktuelle Stand der Dinge....

Code: Alles auswählen

 
// start with Parameter
 
  s := '';
  for i := 1 to Application.ParamCount do
  begin
    if Application.Params[i] = '-h' then
      Begin
      try
RunHelp(self);
       Close;
       Except
        DebugLn('Error: Can`t Start Help Menue');
      end;
       Close;
    end;
 
    if Application.Params[i] = '-v' then
      Begin
      try
RunVersion(self);
       Close;
       Except
         DebugLn('Error: Can`t Start Version Menue Short');
 
       end;
       Close;
      end;
 
    if Application.Params[i] = '-b' then
      Begin
      try
      RunBackUp(self);
      Close;
      Except
        DebugLn('Error: Can`t Start BackUp Short');
        End;
      Close;
    end;
 
    if Application.Params[i] = '--backup' then
      Begin
      try
      RunBackUp(self);
      Close;
      Except
        DebugLn('Error: Can`t Start BackUp Long');
        End;
      Close;
    End;
 
    if Application.Params[i] = '--version' then
      Begin
      try
RunVersion(self);
Close;
    Except
      DebugLn('Error: Can`t Start Version Menue Long');
      End;
    Close;
    End;
 
    if Application.Params[i] = '--Help' then
      Begin
      try
RunHelp(self);
Close;
      Except
        DebugLn('Error: Can`t Start Help Menue Long');
        End;
      Close;
    End;
 
    if Application.Params[i] = '--Help-DE' then
      Begin
      try
      RunGermanHelp(self);
      Close;
      Except
        DebugLn('Error: Can`t Start Help File DE');
        End;
      Close;
    End;
 
    if Application.Params[i] = '--Help-EN' then
      Begin
      try
      RunEnglishHelp(self);
      Close;
      Except
        DebugLn('Error: Can`t Start Help File EN');
        End;
      Close;
    End;
 
    if Application.Params[i] = '--Help-TAGALOG' then
      Begin
      try
      RunTagalogHelp(self);
      Close;
      Except
        DebugLn('Error: Can`t Start Help File Tagalog');
        End;
      Close;
      end;
 
end;
 
Bitte jetzt nur nicht auf den Kopf hauen wegen den Close Befehlen ich habe das nur zu test zwecken drinnen wegen dem Beenden wenn Parameter fertig ist.
Ich wollte nur etwas wissen und musste nun Heute schon wieder meinen Compi zum 4 mal neu Booten, bin also noch nicht so weit wie ich wollte.

Ich habe dann noch die OnShow Elemente für Form 4 und Form 2 angepasst.

Code: Alles auswählen

 
procedure TForm1.RunHelp(Sender: TObject);
 var
  MyForm22: TForm2;
begin
 
  MyForm22 := TForm2.Create(nil);
  try
    MyForm22.ShowModal;
  finally
    MyForm22.Free;
 
end;
  end;
 
Und die Form's 2 & 4 werden im Projekt als Vorhanden und nicht als geladene Aufgeführt.
Vielleicht ist das noch falsch dachte einfach dass das so korrekt wäre.

Gruss aus Bern

Chris

SchwabenTom
Beiträge: 49
Registriert: So 4. Jan 2015, 21:34
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: cmd Befehle in GUI Anwendung

Beitrag von SchwabenTom »

Hallo Chris,

> Aber ich habe immer noch meine kleine Mühe damit.

Heißt das, du hast noch Fehler? Bin mir gerade nicht sicher, ob dein letzter Post eine Frage enthält. Und wenn ja, welche?

Ansonsten: Code sollte so nun durchlaufen.

Grüße, SchwabenTom

lycaner
Beiträge: 56
Registriert: Mi 20. Jul 2011, 13:29
OS, Lazarus, FPC: Winux (L 1.4.4 FPC 2.6.)
CPU-Target: 64 Bit AMD
Wohnort: Bern, Schweiz

Re: cmd Befehle in GUI Anwendung

Beitrag von lycaner »

Hallo SchwabenTom,

Ja, bei mir gibt es leider bei den meisten sachen eine Access Violation und ich kann nicht finden an was es liegt.
-h passiert gar nichts --Help passiert auch nichts.
-v --Version gibt's ne Access Violation
--Help (DE, EN und Tagalog ) gibt es nur Access Violation.

-v und -Version zeigt nicht mal die Versions Informatoionen an.

Vielleicht siehst Du in meinem bisherigen Code was ich falsch begonnen habe, so lade ich diesen mal hoch.
Ich habe das meiste in Externe Run Elemente gelagert dammit es im onCreate nicht so "müll" mässig aussieht.

Ich bin noch nicht so weit mit dem Programmieren so habe ich sicherlich etliche schöhnheits fehler eingebaut.

Du findest auch zur Thematik Datenbank meinen Post im SQL Bereich da hab ich einige Posts zu meiner Datenbank.
http://www.lazarusforum.de/viewtopic.ph ... 8&start=30

Vielen Dank bei der Hilfe...

Chris
SchwabenTom hat geschrieben:Hallo Chris,

> Aber ich habe immer noch meine kleine Mühe damit.

Heißt das, du hast noch Fehler? Bin mir gerade nicht sicher, ob dein letzter Post eine Frage enthält. Und wenn ja, welche?

Ansonsten: Code sollte so nun durchlaufen.

Grüße, SchwabenTom
Dateianhänge
BackUp Source Lazarusforum 2016.03.31-08.06.27.zip
(8.44 MiB) 78-mal heruntergeladen

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: cmd Befehle in GUI Anwendung

Beitrag von marcov »

TApplication hat auch ein Getopts-ähnliches Interface:

http://wiki.freepascal.org/Command_line ... _parameter

Methoden:

Code: Alles auswählen

 
   function FindOptionIndex(Const S : String; Var Longopt : Boolean; StartAt : Integer = -1) : Integer;
    Function GetOptionValue(Const S : String) : String;
    Function GetOptionValue(Const C: Char; Const S : String) : String;
    Function GetOptionValues(Const C: Char; Const S : String) : TStringArray;
    Function HasOption(Const S : String) : Boolean;
    Function HasOption(Const C : Char; Const S : String) : Boolean;
    Function CheckOptions(Const ShortOptions : String; Const Longopts : TStrings; Opts,NonOpts : TStrings; AllErrors : Boolean = False) : String;
    Function CheckOptions(Const ShortOptions : String; Const Longopts : Array of string; Opts,NonOpts : TStrings; AllErrors : Boolean = False) : String;
    Function CheckOptions(Const ShortOptions : String; Const Longopts : TStrings; AllErrors : Boolean = False) : String;
    Function CheckOptions(Const ShortOptions : String; Const LongOpts : Array of string; AllErrors : Boolean = False) : String;
    Function CheckOptions(Const ShortOptions : String; Const LongOpts : String; AllErrors : Boolean = False) : String;
    Function GetNonOptions(Const ShortOptions : String; Const Longopts : Array of string) : TStringArray;
    Procedure GetNonOptions(Const ShortOptions : String; Const Longopts : Array of string; NonOptions
    Property OptionChar : Char Read FoptionChar Write FOptionChar;
    Property CaseSensitiveOptions : Boolean Read FCaseSensitiveOptions Write FCaseSensitiveOptions;
 

Requion
Beiträge: 106
Registriert: Mi 3. Feb 2016, 09:39
OS, Lazarus, FPC: Linux(Arch Linux(+ARM)/Minibian) (L 1.6.0 FPC 3.0.0)
CPU-Target: 32/64Bit,ARM(RPi)
Wohnort: nahe Grimma

Re: cmd Befehle in GUI Anwendung

Beitrag von Requion »

Hallo lycaner,

ich hab hier grad kein Laz weshalb ich es nicht richtig probieren und dir im moment nicht helfen kann.

Aber mal etwas Allgemeines zu den Access Violations (das hab ich ja auch recht häufig...).
Das tritt ja immer auf wenn du auf etwas zugreifen willst was nicht(-mehr) da ist. Also mal überlegen was da nicht richtig erzeugt oder zu früh wieder zerstört worden sein könnte.
Oder du machst dir bei deiner Option (z.B. "-v") mal ein Haltepunkt, startest mit dieser Option und gehst Schritt für Schritt durch bis es knallt. Damit kannst du schonmal die Ursache eingrenzen.
Mfg Requion

Das beste an Standards ist, dass es so viele davon gibt.

SchwabenTom
Beiträge: 49
Registriert: So 4. Jan 2015, 21:34
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: cmd Befehle in GUI Anwendung

Beitrag von SchwabenTom »

Hallo,

mir fehlen Komponenten, um es bei mir starten/kompilieren lassen zu können.

Wie Requion schon geschrieben hat: Erstelle einen frühen Haltepunkt und gehe schrittweise durch. Lokalisiere so den Fehler und frage dann nochmal nach.

Du schreibst es seien alles Access Violations. Access Violations sind wie der Name schon andeutet: verbotene Zugriffe. Dh. zu greifst auf Speicher zu, der dir (noch) nicht oder nicht mehr gehört. Wenn du auf ein Objekt zugreifst, das du noch nicht instanziiert (erstellt) hast, oder nachdem du es schon freigegeben hast. Ich vermute eher, daß du allgemein Exceptions gemeint hast (?). Vermutlich hast du noch solche Dinge, daß die Verarbeitung angehalten wird und Lazarus dir ein Meldungsfenster zeigt mit "Fehler". Und nennst es nur alles "einheitlich" Access Violation.

Evtl. nochmal was zu dem try-exccept. Wenn zwischen try-except eine Exception eintritt, wird der Programmablauf unterbrochen und in den except-Teil gesprungen. Was verwirrend sein kann, wenn man es nicht weiß: es gibt einen Unterschied, ob du das Programm "in der IDE" oder "standalone" laufen läßt. Läßt du es in der IDE laufen, dh. bist du am coden und drückst F9, um zu testen: Jede Exception wird dir angezeigt. Das Programm wird angehalten und du siehst eine Meldung mit "Fehler". Und das obwohl du extra mit try-except arbeitest. Das ist aber nur der Debugger. Wenn du aber "außerhalb" direkt die exe aufrufst, bekommst du diese Meldung mit "Fehler" nicht. Da wird "richtigerweise" die Exception im except-Teil abgefangen. Das evtl. nur so zum Verständnis.
lycaner hat geschrieben: --Help (DE, EN und Tagalog ) gibt es nur Access Violation.

Code: Alles auswählen

 
procedure TForm1.RunGermanHelp(Sender: TObject);
var AProcess: TProcess;
begin
  try
    form1.Hide;
    AProcess := TProcess.Create(nil);
    AProcess.CommandLine := './help/Docview/docview.exe ./help/help/migraenetagebuch.inf';
    AProcess.Options := AProcess.Options + [poWaitOnExit];
    AProcess.Execute;
    AProcess.Free;
  except
    DebugLn('Error: Can`t Start Help German');
  end;
end;
 
Evtl. funktioniert bei
AProcess.CommandLine := './help/Docview/docview.exe ./help/help/migraenetagebuch.inf';
die Pfadangabe nicht. Weiß nicht, wie TProcess reagiert; evtl. dann eine Exception wirft.
Wie oben geschrieben: Arbeite mit Haltepunkten und lokalisiere die Fehler.

Diese './' bei den Pfaden hast du oft im Code. Du prüfst auch viele Pfadangaben und FileExists etc. Aber:
- evtl. fehlt dann doch irgendwo eine Prüfung
- mglw. braucht eine Komponente absolute Pfade und kann mit relativen Pfaden nichts anfangen
- oder es ist an manchen stellen das, was ich vom Unterschied bei Exception von "im Editor ausführen" und "standalone" geschrieben habe

Das sind nur ein paar Sachen die mir auffielen, ohne testen zu können.

lycaner
Beiträge: 56
Registriert: Mi 20. Jul 2011, 13:29
OS, Lazarus, FPC: Winux (L 1.4.4 FPC 2.6.)
CPU-Target: 64 Bit AMD
Wohnort: Bern, Schweiz

Re: cmd Befehle in GUI Anwendung

Beitrag von lycaner »

Hallo Liebe Spezialisten,

so Heute geht es Gesundheitlich wieder etwas besser ich fühlte mich Gestern nicht so wohl, deshalb auch erst Heute eine Antwort.
Ich habe den Link von Marcov angeschaut, aber leider bin ich bei dieser Erklährung nicht auf anhib draus gekommen wie das dort
gehen könnte. So habe ich die etwas Einfachere Version wie oben Beschrieben gewählt auch hier im Forum Beschrieben dazu.

Danke aber viel mals für den Link @Marcov
Ich habe mit Halte Punkte versucht, aber bis jetzt zeigt sich noch ein Anderes Problem, ich habe aufgrund eines grösseren UpDates
der Datenbank einige Tabellen anlegen und die Tabelle "tblDay" neu erstellen lassen mit Erweiterung. Nur dass ich jetzt ein Problem
mehr habe. Leider... Ich kann auf einmal nicht mehr die tblDay anlegen und wenn ich die App starte bekomme ich nun neu den Error
"tblDay not Exist" Nun muss ich zuerst dieses Problem lösen können.

Die DocView sollte eigentlich mit den Unix Parameter gut auskommen sowie die eigentliche Migräne App auch. Ich habe es schon Probiert
nur eben in der Version Short Cut ehts dann nicht beim geladenen Form1 und Befelh aufrufen klappt es.
Danke @SchwabenTom, aber das mit den Komponenten kann ich Dir bei Interesse hier noch nach liefern. Ich hab SIE in die neue ZIP mit gepackt.
Sorry an die habe ich beim erstellen des BackUp nicht mehr gedacht.

Mit den besten Grüssen

Chris

:EDIT: Ich habe wohl eine falsche Version geladen aus einem alten Repo von mir, nun ist es die Aktuelle :EDIT:

http://www.lazarusforum.de/viewtopic.ph ... 8&start=30
Dateianhänge
BackUp Source Andreas (NEW) 2016.04.02-19.59.24.rar
(10.39 MiB) 71-mal heruntergeladen

SchwabenTom
Beiträge: 49
Registriert: So 4. Jan 2015, 21:34
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: cmd Befehle in GUI Anwendung

Beitrag von SchwabenTom »

Hallo Chris,

Komponenten wollte ich mir keine installieren. Ich denke, es wird auch per Codeausschnitten gehen. So hat auch die Suchfunktion mehr Futter :-)

In dem anderen Thread beziehst du dich mehr auf Datenbanken. Vermutlich wird dir dort eher mit Datenbankdingen geholfen werden. Wenn die DB wieder läuft, wärmst du den Thread hier wieder auf. Am besten dann auch gleich mit Angaben wie "in Zeile ... steigt er mir aus mit der Exception ....". Oder: In der Funktion hat er an der Stelle/Zeile ... in der Variablen ... den Wert ...; ich würde aber eher einen Wert von ... erwarten."

Bis dann, Grüße,
SchwabenTom

Antworten