Thema: Delphi GUI mit Konsole

Einzelnen Beitrag anzeigen

nru

Registriert seit: 30. Mai 2008
Ort: Bonn
40 Beiträge
 
Delphi 7 Enterprise
 
#1

GUI mit Konsole

  Alt 20. Apr 2010, 07:24
Hallo Kollegen,

ich hab mal eine Frage zur Konsolen-Ausgabe einer "normalen" GUI-Anwendung. Geplant ist, eine GUI-Anwendung über Parameter im "Pseudo"-Consolen-Mode zu starten und ausführen zu lassen. Ähnlich wie z.B. RegEdit.exe oder 7z.exe. Ohne Parameter startet GUI, mit Parameter Console. Da mir hier schon immer geholfen wurde, hab ich natürlich auch hierzu erstmal hier gesucht ... und bin auch in gewisser Weise fündig geworden.

In den folgenden Threads gehts schon auch um dieses Thema:
Konsole oder was?
GUI Anwendung mit Consolen-Ausgabe
Ausgabe in DOS-Box

Da gehts einerseits um AllocConsole/GetStdHandle, andererseits um einen wirklich sehr charmanten Ansatz über Application.ShowMainform := false

Die hier gefundenen Ansätze hab ich daraufhin mal wie folgt probiert:

Delphi-Quellcode:
begin

// Ohne GUI starten, wenn Parameter KUNDE angegeben wurde
   if FloCmdLineParamFound( 'KUNDE' ) then begin

      RunKundenBatch();

   end else begin

      Application.Initialize;
      Application.Title := 'PGen';
      Application.CreateForm(TPGMain, PGMain);
  try
      Application.Run;
      except
         on E: Exception do
            Application.MessageBox( PChar( e.Message ),
                                    'Systemfehler',
                                    MB_OK+MB_ICONHAND+MB_DEFBUTTON1+MB_APPLMODAL);
      end;
   end;
end.

Variante 1:
(TConsole (wincon.pas) gibts im 2 Link. Schönen Dank auch an marabu)
Delphi-Quellcode:

//
// ... andere Unit
//

procedure RunKundenBatch();
begin
   with TConsole.Create do begin
      WriteStr('PGen v1.0'+CRLF);
      WriteStr('Kunde:'+CRLF);
      WriteStr(''+CRLF);
      WriteStr('Drücken Sie eine Taste zum Fortsetzen ...');
      ReadStr;
      Destroy;
   end;
end;

// Auszug aus WinCon.pas
constructor TConsole.Create;
begin
  inherited;
  AllocConsole;
  hIn := GetStdHandle(STD_INPUT_HANDLE);
  hOut := GetStdHandle(STD_OUTPUT_HANDLE);
end;
procedure TConsole.WriteStr(s: string);
var
  iWritten: cardinal;
begin
  WriteFile(hOut, s[1], Length(s), iWritten, nil);
end;
Variante 2
Delphi-Quellcode:
procedure RunKundenBatch();
begin
// Auch eine sehr schöne Lösung, mit Bordmitteln
      Application.ShowMainform := false;
      AllocConsole;
      WriteLn('PGen v1.0');
      ReadLn;
      FreeConsole;
end;

Beide Varianten funktionieren soweit auch. Jedoch wird immer eine separate, neue Console geöffnet. Was ich gern erreichen würde, wäre, das Start und die dazugehörige Ausgaben in der aktuellen, bereits geöffneten Console - falls vorhanden - geschrieben werden.

In etwa so: DOS-Box ist offen, App wird dort mit Paramter gestartet und Ausgaben erscheinen in dieser DOS-Box und nicht in eincer neuen Console.

Aber wie komm ich an die Konsole, aus der heraus die App gestartet wurde?
Habt ihr dafür vielleicht ein paar Anregungen für mich?

Dank & Gruss
nru
  Mit Zitat antworten Zitat