AGB  ·  Datenschutz  ·  Impressum  







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

GUI-Anwendung mit Konsolenausgabe

Ein Thema von Codehunter · begonnen am 13. Apr 2011 · letzter Beitrag vom 14. Apr 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

GUI-Anwendung mit Konsolenausgabe

  Alt 13. Apr 2011, 15:51
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
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#2

AW: GUI-Anwendung mit Konsolenausgabe

  Alt 13. Apr 2011, 16:03
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.
Uli Gerhardt
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#3

AW: GUI-Anwendung mit Konsolenausgabe

  Alt 13. Apr 2011, 17:28
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
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: GUI-Anwendung mit Konsolenausgabe

  Alt 13. Apr 2011, 17:30
Ich unterstreiche/stütze Bommels Beitrag.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: GUI-Anwendung mit Konsolenausgabe

  Alt 13. Apr 2011, 18:53
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. (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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (13. Apr 2011 um 18:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#6

AW: GUI-Anwendung mit Konsolenausgabe

  Alt 13. Apr 2011, 19:15
Hier im Forum suchenAllocConsole liefert auch in der DP einige nette Suchergebnisse, dieser Beitrag von Himitsu sollte imho ganz hilfreich sein.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von MacGuyver
MacGuyver

Registriert seit: 9. Sep 2003
Ort: Wildeshausen
295 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: GUI-Anwendung mit Konsolenausgabe

  Alt 13. Apr 2011, 20:56
Moin

... 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
Englisch eine Weltsprache? Zu kompliziert und der nahe Osten würde Englisch als Pflichtweltsprache nicht akzeptieren.
IDO wäre genau das Richtige: http://forum.idolinguo.de/index.php oder www.idolinguo.de
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: GUI-Anwendung mit Konsolenausgabe

  Alt 14. Apr 2011, 12:11
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.dllname '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;
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
655 Beiträge
 
Delphi 12 Athens
 
#9

AW: GUI-Anwendung mit Konsolenausgabe

  Alt 14. Apr 2011, 12:49
Krass, soll das wirklich alles gewesen sein? 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.dllname '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
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: GUI-Anwendung mit Konsolenausgabe

  Alt 14. Apr 2011, 14:43
Krass, soll das wirklich alles gewesen sein? 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.
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 KEYBD_EVENT(VK_RETURN,0,0,0); nach dem FreeConsole einfügen, dann klappt das

Geändert von Codehunter (14. Apr 2011 um 14:54 Uhr)
  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 10:34 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