AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GUI mit Konsole

Ein Thema von nru · begonnen am 20. Apr 2010 · letzter Beitrag vom 21. Mai 2014
Antwort Antwort
Seite 1 von 2  1 2      
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
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: GUI mit Konsole

  Alt 20. Apr 2010, 07:54
Das einfachste wird sein du erstellst 3 Anwendungen
1.) eine Starteranwendung welche je nach Parameter die 2te oder 3te Anwendung startet
2.) Gui app
3.) console app
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: GUI mit Konsole

  Alt 20. Apr 2010, 08:25
@Sir: Die Startanwendung könnte auch gleichzeitig schon die Konsolenanwendung sein, oder?

Ich habe auch noch etwas probiert:
Variante 1:
Eine normale GUI-Anwendung und {$Apptype Console} einfügen.
Damit ist allerdings immer ein Console da.

Varinate2:
Delphi-Quellcode:
program Project1;


uses
  Forms,
  windows,
  Unit1 in 'Unit1.pas{Form1};

{$R *.res}

// ist in D7 noch nicht enthalten:
function AttachConsole(dwProcessId:DWord):Bool;stdcall;
 external 'kernel32.dll';
const ATTACH_PARENT_PROCESS=DWORD(-1);


begin
  if paramcount=0 then
  begin
    Application.Initialize;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end else
  begin
    if AttachConsole(ATTACH_PARENT_PROCESS) then
      writeln
    else
      allocConsole;
    try

      writeln('Here I am');
      readln;
    finally
      Freeconsole;
    end;
  end;
end.
Verhält sich aber auch eigenartig. (Edit: Was daran liegt, dass bei AttachConsole immer noch ein abschließend Readln im Code angehängt wird, oder was auch immer das ist)
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
nru

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

Re: GUI mit Konsole

  Alt 20. Apr 2010, 09:37
Das mit den 3 Apps war mir auch kurzzeitig mal in den Sinn gekommen ... habs aber verworfen, da ich dachte, es würde auch in einer gehen


@sirius: Deine 2.Variante gefällt mir echt gut. Und klappt auch (eigentlich) ganz gut. Bis eben auf das von Dir geschilderte Verhalten. Vielleicht gibts dafür ja auch irgendwo/irgendwie eine Lösung.

Aber immerhin gibts jetzt einen Programmstart mit Ausgabe in der bereits geöffneten DOS-Box!


Thx,
nru
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#5

Re: GUI mit Konsole

  Alt 20. Apr 2010, 09:47
Schau mal in meinen alten Hier im Forum suchenFileSplitter, dieser hab bei Programmstart eine Erkennung, ob der Programm über eine Console gestartet wurde und gibt dann auch Text dieser Console aus.

Die Console kannst du auch selber erzeugen, falls noch keine vorhanden ist und es aber über einen Parameter verlangt wird. (AllocConsole hast'e ja schon kennengelernt)

{$Apptype Console} besagt, daß das Programm eine Consolenanwendung ist und somit erstellt Windows beim Start eine Console, wenn sie noch nicht existiert.
Ergo: Belaß die Anwendung als GUI-Anwendung und reagiere auf eine existierende Console und/oder auf den gewünschten Parameter.

[add]
hier noch ein paar passende Beiträge/Themen:
Konsole oder keine Konsole? (Beitrag #9)
Konsolenfenster im GUI-Mode unterdrücken
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
nru

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

Re: GUI mit Konsole

  Alt 20. Apr 2010, 10:14
Hi,

auf den Thread "Konsolenfenster im GUI-Mode unterdrücken" und Eure dortige Diskussion über AttachConsole und das ReadLn() am Ende bin ich gerade eben auch gestoßen Das Verhalten hatte Sirius hier ja auch schon erwähnt.

Ich habs inzwischen so umgangen, indem ich am Ende der Konsolenvearbeitung WriteStr('Drücken Sie eine Taste zum Fortsetzen ...'); aufgenommen habe ... Anwender drückt Enter, Prompt kehrt zurück

Somit läuft die Sache nun
- als reine GUI App (wenn über Explorer, Startmenü, Ausführen ohne Parameter gestartet wurde)
- mit neu erstellter Console und dortigen Ausgaben (wenn über Start->Ausführen mit Parameter)
- in bestehender Console (bei Start mit entsprechendem Parameter)

Deinen FileSplitter schau ich mir gleich an.

Vielen Dank für Euren perfekten Input!

Gruss
nru


PS:
Zitat:
// ist in D7 noch nicht enthalten:
... und in meinem Favoriten, D5, natürlich auch nicht
  Mit Zitat antworten Zitat
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#7

Re: GUI mit Konsole

  Alt 29. Apr 2010, 10:46
Hmm ist ATTACH_PARENT_PROCESS in D2009 nicht mehr aktiv?


[DCC Fehler] FSSystem.pas(30): E2003 Undeklarierter Bezeichner: 'ATTACH_PARENT_PROCESS'
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#8

Re: GUI mit Konsole

  Alt 29. Apr 2010, 10:54
Es ist einfach nur nicht in den übersetzen Windows-Headern mit enthalten

const ATTACH_PARENT_PROCESS = LongWord(-1);
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Ajin

Registriert seit: 23. Feb 2006
Ort: Mons
252 Beiträge
 
Delphi 2010 Professional
 
#9

Re: GUI mit Konsole

  Alt 29. Apr 2010, 11:40
Delphi-Quellcode:
program Project1;


uses
  Forms,
  windows;

{$R *.res}

function AttachConsole(dwProcessId:DWord):Bool;stdcall;
external 'kernel32.dll';
const ATTACH_PARENT_PROCESS=DWORD(-1);
var i:integer;


  begin
    if AttachConsole(ATTACH_PARENT_PROCESS) then
      writeln
    else
      allocConsole;
    try

      for I := 0 to 40000 do
      begin
      writeln(i);
      end;


      readln;
    finally
      Freeconsole;
    end;
end.
Das funktioniert unter Win7 x64 ohne Probleme, aber unter Windows 2000 gibts ne Fehlermeldung: Der Prozedur Einsprungpunkt "ATACHCONSOLE" wurde in der DLL kernel32.dll nicht gefunden.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#10

Re: GUI mit Konsole

  Alt 29. Apr 2010, 11:43
Das MSDN sagt zu AttachConsole:
Minimum supported client : Windows XP

Minimum supported server : Windows Server 2003


MSDN-Library durchsuchenAllocConsole wäre ab Windows 2000 nutzbar, falls es dir helfen würde.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:03 Uhr.
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