Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   GUI-Anwendung mit Konsolenausgabe (https://www.delphipraxis.net/159806-gui-anwendung-mit-konsolenausgabe.html)

Codehunter 13. Apr 2011 14:51

GUI-Anwendung mit Konsolenausgabe
 
Hallo zusammen!

Viele Windows-Programme kann man per Befehlszeilenparameter steuern, das ist ja nichts ungewöhnliches. Bei manchen kann man auch den Parameter "/?" oder "/help" angeben und bekommt dann ein Programm-About. Mir ist bei einigen Microsoft-GUI-Anwendungen aufgefallen dass diese das About nicht als GUI-Window öffnen sondern auf der Befehlszeile ausgeben (sprich wenn man das Ding in der DOS-Box aufruft). Nur scheint es bei Delphi gar nicht so einfach zu sein, einen Hybriden aus GUI-Anwendung mit Befehlszeilenausgabe zu realisieren. Gibts da einen Trick? Ein WriteLn in der .DPR vor dem Application.Initialize bringt jedenfalls eine E/A-Exception.

Grüße
Cody

uligerhardt 13. Apr 2011 15:03

AW: GUI-Anwendung mit Konsolenausgabe
 
Lies dir mal How do I write a program that can be run either as a console or a GUI application? durch.
Zitat:

You can't, but you can try to fake it.

Bbommel 13. Apr 2011 16:28

AW: GUI-Anwendung mit Konsolenausgabe
 
Falls du etwas halbwegs einfaches findest, wäre ich auch am Ergebnis interessiert. Aber letztlich sagt der Link von Uli ja alles: eigentlich geht es nicht so richtig. Als mich damit mal vor 2-3 Jahren aus dem gleichen Grund wie du beschäftigt habe, kam ich letztlich zum Ergebnis, dass mir das alles viel zu abgefahren war, um nur einen Hilfstext für "/?" auszugeben. Letztlich habe ich mich dann dazu entschieden, den Hilfstext doch in einem MessageDlg anzuzeigen - gefiel mir zwar nicht so dolle, habe ich aber auch schon bei vielen - auch Microsoft- - Programmen gesehen.

Ist jetzt zwar keine wirkliche Hilfe, aber vielleicht doch mal ein kleiner Erfahrungsbericht als Feedback zu dem Thema.

Bis denn
Bommel

ConnorMcLeod 13. Apr 2011 16:30

AW: GUI-Anwendung mit Konsolenausgabe
 
Ich unterstreiche/stütze Bommels Beitrag.

himitsu 13. Apr 2011 17:53

AW: GUI-Anwendung mit Konsolenausgabe
 
Also,

- auch eine GUI-Anwendung kann man mit Parametern starten.
- erstellt man eine Konsolenanwendung, dann kann man darin auch ganz einfach Fenster dynamisch erstellen.
- oder man erstellt eine GUI-Anwendung und sagt dem Compiler/Windows es wäre eine Konsolenanwendung (dafür einfach den Kompilerschalter, welchen ihr in einer Konsolen-DPR findet in die GUI-DPR reinmachen)

- oder man erstellt ene GUI-Anwendung und erstellt zur Laufzeit eine Console (MSDN-Library durchsuchenAllocConsole) oder man verknüpft nachträglich die Standardeingaben mit mit einer vorhandenen Konsole (vorzugsweise der, worüber die Anwendung gestartet wurde).

PS: mein Hier im Forum suchenFileSplitter ist soeine hybride Anwendung. :angle2: (Konsole, wenn über Konsole/Batch gestartet - NonVCL-GUI - oder Gemischt)
und irgendwo existiert auch ein Thread, wo es um das gleicher Thema geht

PPS: In meiner Anwendung findet ihr auch, wie man rausbekommt, ob die Ein-/Ausgaben der Anwendung mit einer Konsole verknüpft sind ... dementsprechend könnte man dann entweder in der Konsole oder über einen Dialog die Ausgaben machen.

BUG 13. Apr 2011 18:15

AW: GUI-Anwendung mit Konsolenausgabe
 
Hier im Forum suchenAllocConsole liefert auch in der DP einige nette Suchergebnisse, dieser Beitrag von Himitsu sollte imho ganz hilfreich sein.

MacGuyver 13. Apr 2011 19:56

AW: GUI-Anwendung mit Konsolenausgabe
 
Moin :hi:

... oder eine GUI-Anwendung mit Konsole als Kindfenster? Da bin ich zur Zeit bei. Ich habe mein Turbo Pascal-Programm als Konsolenanwendung konvertiert und nun möchte ich das in die Fenstervariante einbinden. Das ist schon etwas aufwändig.

Stefan

Codehunter 14. Apr 2011 11:11

AW: GUI-Anwendung mit Konsolenausgabe
 
So, ich habs derweil mal hinbekommen. Das Kernproblem war bei mir mehrschichtig. Zum einen arbeite ich noch mit Delphi 5 und 7, da gabs noch nicht alle Imports aus der Kernel32.dll. Zum zweiten muss man sich erstmal das Handle der aufrufenden Konsoleninstanz holen. Andernfalls öffnet sich ein neues Konsolenfenster, gibt den Text aus und schließt sich wieder. Auf aktuellen Rechnern geht das so flott dass man das kaum bis gar nicht mehr mitbekommt. Leider gibt es die API AttachConsole erst ab XP aufwärts, aber das sollte ja im Moment ohnehin das Minimum sein.
Delphi-Quellcode:

  // Konstante definieren
  ATTACH_PARENT_PROCESS = DWord(-1);

  // API einbinden
  function AttachConsole(dwProcessId: DWord): Boolean; stdcall; external 'kernel32.dll' name 'AttachConsole';

  // Hier beginnt das About (innerhalb der .DPR vor dem Application.Initialize)
  if Pos('/?', CmdLine) > 0 then begin
    if AttachConsole(ATTACH_PARENT_PROCESS) then begin
      try
        WriteLn(#13#10 + 'About');
      finally
        FreeConsole;
      end;
      Exit;
    end else begin
      ShowMessage('About');
      Exit;
    end;
  end;

Bbommel 14. Apr 2011 11:49

AW: GUI-Anwendung mit Konsolenausgabe
 
Krass, soll das wirklich alles gewesen sein? :shock: Irgendwie hatte ich das (wie oben geschrieben) viel komplizierter in Erinnerung bei den Lösungen, die ich damals gefunden habe.

Ein Problem habe ich allerdings noch bei einem Test festgestellt: Wenn das Programm mit dem "/?" gestartet wird, gibt es den Text brav auf der Konsole aus, nach dem Ende des Programms wird dann aber kein Prompt angezeigt. D.h.: der Cursor blinkt, die Konsole nimmt auch Befehle entgegen, aber für den Benutzer sieht das nicht so aus, da er das Prompt nicht sieht. Irgendwelche Ideen, wie man das noch lösen kann?

Meine Komplettlösung sieht dann übrigens so aus:

Delphi-Quellcode:
program GUIcons;

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

const
 // Konstante definieren
  ATTACH_PARENT_PROCESS = DWord(-1);

// API einbinden
function AttachConsole(dwProcessId: DWord): Boolean; stdcall; external 'kernel32.dll' name 'AttachConsole';
{$R *.res}

begin
  // Hier beginnt das About (innerhalb der .DPR vor dem Application.Initialize)
  if paramstr(1)='/?' then begin
    if AttachConsole(ATTACH_PARENT_PROCESS) then begin
      try
        WriteLn(#13#10 + 'About');
        writeln;
      finally
        FreeConsole;
      end;
    end else begin
      ShowMessage('About');
    end;
  end else begin
    Application.Initialize;
    Application.MainFormOnTaskbar := True;
    Application.CreateForm(TForm1, Form1);
    Application.Run;
  end;
end.
Bis denn
Bommel

Codehunter 14. Apr 2011 13:43

AW: GUI-Anwendung mit Konsolenausgabe
 
Zitat:

Zitat von Bbommel (Beitrag 1095067)
Krass, soll das wirklich alles gewesen sein? :shock: Irgendwie hatte ich das (wie oben geschrieben) viel komplizierter in Erinnerung bei den Lösungen, die ich damals gefunden habe.

Ja das stammt wohl aus der Zeit vor WinXP. Microsoft hatte damals einiges an Konsolen-API nachgeschoben was es einfacher gemacht hat. Hab ich aber auch erst jetzt beim Nachlesen erfahren. Eigentlich widersprüchlich, da mal ja damals alles getan hat die DOS-Fenster endgültig abzuschaffen.
Zitat:

Zitat von Bbommel (Beitrag 1095067)
Ein Problem habe ich allerdings noch bei einem Test festgestellt: Wenn das Programm mit dem "/?" gestartet wird, gibt es den Text brav auf der Konsole aus, nach dem Ende des Programms wird dann aber kein Prompt angezeigt.

Einfach ein
Delphi-Quellcode:
KEYBD_EVENT(VK_RETURN,0,0,0);
nach dem FreeConsole einfügen, dann klappt das :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:31 Uhr.
Seite 1 von 2  1 2      

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