Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Starten wahlweise mit und ohne GUI (https://www.delphipraxis.net/196639-starten-wahlweise-mit-und-ohne-gui.html)

jus 5. Jun 2018 23:47

Starten wahlweise mit und ohne GUI
 
Ich hätte eine konzeptionielle Frage und zwar habe ich ein Programm das einerseits in einer Batchdatei mit Parameter aufgerufen wird, wo kein Fenster aufpoppen soll, und falls kein Parameter mitgegeben wird, soll es mit GUI gestartet werden. Derzeit löse ich so:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  case paramcount of
    1: begin
         showmessage('Zuwenige Parameter. Programm wird fortgesetzt.');
       end;
    else
    begin
      Mach_Was_ohne_GUI(paramstr(2)); //Parameter wurde angegeben
      Halt;
    end;
  end;
end;
Falls ein Parameter angegeben wurde, wird es ausgeführt und danach das Programm in FormCreate brutal mit "Halt" beendet. Funktionert eigentlich auch zufriedenstellend. Doch vermutlich gibt es elegantere Lösungen. :oops: Wie könnte man es besser machen?

lg,
jus

KodeZwerg 5. Jun 2018 23:53

AW: Starten wahlweise mit und ohne GUI
 
Hallo jus, ja es gibt einen eleganteren Weg der auch Deine Applikation schneller macht! (Jedenfalls wenn ein Parameter übergeben wurde) :-)
Mach das in .dpr ohne vorher GUI zu laden.

edit
also so wie hier in diesem Beispiel:
Delphi-Quellcode:
program DFK;

uses
  Forms,
  uMain in 'uMain.pas' {frmKnips},
  uClear in 'uClear.pas' {frmClear};

{$R *.res}

begin
  if ParamCount = 0 then // wenn keine Parameter angegeben wurden, dann lade die GUI
  begin
    Application.Initialize;
    Application.MainFormOnTaskbar := True;
    Application.Title := 'Der Fenster Knipser by KodeZwerg';
    Application.CreateForm(TfrmKnips, frmKnips);
    Application.CreateForm(TfrmClear, frmClear);
    Application.Run
  end
  else
  begin
// Code ohne GUI fängt hier an....
// Du musst in Uses das einbinden wo Du ohne GUI Zugriff drauf benötigst, eventuell Windows.pas für API?
  end;
end.
War es das was Du meintest?

jaenicke 6. Jun 2018 06:32

AW: Starten wahlweise mit und ohne GUI
 
Wir speichern Application dort in eine eigene Variable, damit die IDE an der Stelle nicht immer versucht automatisch etwas zu ändern, z.B. wenn man ein neues Formular hinzufügt.
Sprich:
Delphi-Quellcode:
var
  App: TApplication;
begin
  App := Application;
  if ...
  begin
    App.Initialize;
...

jus 6. Jun 2018 09:35

AW: Starten wahlweise mit und ohne GUI
 
@KodeZwerg
Ja stimmt, einfach in die dpr schreiben. Die Lösung lag eigentlich auf der Hand, aber im nachhinein ist man immer schlauer. :oops: Vielen Dank!

@jaenicke
Vielen Dank für den coolen Trick!

lg,
jus

Uwe Raabe 6. Jun 2018 09:46

AW: Starten wahlweise mit und ohne GUI
 
Zumindest bisher ist es offenbar so, daß die IDE sämtlichen Code vor dem
Delphi-Quellcode:
Application.Initialize
in Ruhe lässt. Deswegen wäre auch dieser Ansatz eine mögliche Lösung, bei der die automatischen Eingriffe der IDE weiterhin möglich bleiben:
Delphi-Quellcode:
begin
  if ParamCount > 0 then begin
    { Kommandozeile abarbeiten }
    Halt(0);
  end;

  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  ...
end.
Es ist allerdings zu beachten, daß mit diesen Tricks immer noch kein Konsolenprogramm daraus wird. Insbesondere werden irgendwelche Aufrufe von Write/-ln und Read/-ln auf die impliziten IO-Kanäle Input und Output nicht funktionieren.

himitsu 6. Jun 2018 10:19

AW: Starten wahlweise mit und ohne GUI
 
Warum ermorden (
Delphi-Quellcode:
Halt(0);
) eigentlich immer welche ihre Anwendung, anstatt das zu machen, was sie eigentlich wollten?
Also die Anwendung Ausführung abzubrechen (
Delphi-Quellcode:
Exit;
).

Schokohase 6. Jun 2018 10:38

AW: Starten wahlweise mit und ohne GUI
 
Den Code zum Auswerten/Abarbeiten der Parameter würde ich auslagern in eine andere Unit
Delphi-Quellcode:
unit CmdLineProcessor;

interface

function ProcessCmdLine() : Boolean;

implementation

function ProcessCmdLine() : Boolean;
begin
  // Hier eigentlich etwas sinnvolles mit den Parametern anfangen
  Result := ParamCount > 0;
end;
In der DPR genügt dann eine Zeile Code:
Delphi-Quellcode:
begin
  if ProcessCmdLine() then Exit;

  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  ...
end.

KodeZwerg 6. Jun 2018 11:16

AW: Starten wahlweise mit und ohne GUI
 
Zitat:

Zitat von jus (Beitrag 1404010)
Ja stimmt, einfach in die dpr schreiben. Die Lösung lag eigentlich auf der Hand, aber im nachhinein ist man immer schlauer.

Gern geschehen, auch wenn andere meinen Ansatz als falsch empfinden mögen, ein "Halt()" finde ich kann nie ein gutes Ende für ein Programm sein. Viel Erfolg mit welcher Methode auch immer!:thumb:

Luckie 6. Jun 2018 11:23

AW: Starten wahlweise mit und ohne GUI
 
Spielt keine Rolle ob Halt oder Exit verwendrt wird. Tot ist tot. Mund Windows räumt automatisch nach Ende des Proceses auf.

KodeZwerg 6. Jun 2018 11:34

AW: Starten wahlweise mit und ohne GUI
 
Ich gehe da mehr nach Anleitung,
Zitat:

Beschreibung
Bricht ein Programm ab.

Halt löst einen Programmabbruch aus und gibt die Steuerung an das Betriebssystem zurück.

Um ein Delphi-Programm normal zu beenden, rufen Sie die Methode Terminate in dem globalen Application-Objekt auf. Wenn in der Anwendung keine Unit verwendet wird, die ein Application-Objekt bereitstellt, rufen Sie die Prozedur Exit aus dem Hauptprogrammblock auf.

Exitcode ist ein optionaler Ausdruck, der einen Beendigungscode für das Programm festlegt.
und da steht es mit Exit bzw Terminate für TApplication.
Bei Halt() werden da nicht alle Close-Events übersprungen und es geht direkt zum Ende ohne Möglichkeit sein Programm aufzuräumen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:00 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz