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
Benutzerbild von BUG
BUG

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

AW: GUI-Anwendung mit Konsolenausgabe

  Alt 13. Apr 2011, 18: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
 
#2

AW: GUI-Anwendung mit Konsolenausgabe

  Alt 13. Apr 2011, 19: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.283 Beiträge
 
Delphi 12 Athens
 
#3

AW: GUI-Anwendung mit Konsolenausgabe

  Alt 14. Apr 2011, 11: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
669 Beiträge
 
Delphi 12 Athens
 
#4

AW: GUI-Anwendung mit Konsolenausgabe

  Alt 14. Apr 2011, 11: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.283 Beiträge
 
Delphi 12 Athens
 
#5

AW: GUI-Anwendung mit Konsolenausgabe

  Alt 14. Apr 2011, 13: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 13:54 Uhr)
  Mit Zitat antworten Zitat
ASM

Registriert seit: 15. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: GUI-Anwendung mit Konsolenausgabe

  Alt 14. Apr 2011, 15:36
(1) Unter Delphi7 funktioniert die Anweisung "if AttachConsole(ATTACH_PARENT_PROCESS) then" nicht bzw. gibt immer den Wert FALSE zurück.
Die Verwendung von "if Windows.AllocConsole then" funktioniert dagegen schon.

(2) Man kann mit
Code:
Write('>');
ReadLn(Parameter);
einen künstlichen Prompt anzeigen, die Eingabe in die Variable abfangen und diese zielgerichtet auswerten.

(3) Sollte man unbedingt entweder mit einem Mutex oder per GlobalFindAtom() arbeiten, um den sonst möglichen Start mehrfacher Instanzen des Programms zu blockieren und so insbesondere das Kuddelmuddel einer evt. gleichzeitigen Präsenz von GUI- und Konsolen-Ausgabe separater Instanzen des Programms zu verhindern

(4) Deshalb Vorschlag:
Code:
program GUIcons;

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

{$R *.res}

const
  AppTitle = 'GUIcons'; // irgendetwas Spezifisches als Titel

var
  Mutex: THandle;
  ConsoleForm: TForm1;
  Parameter: shortstring;

begin
  Mutex := CreateMutex(nil, True, AppTitle);
  if (Mutex = 0) or (GetLastError = ERROR_ALREADY_EXISTS) then
  begin
    // Reaktiviere die bereits laufende 1.Programminstanz
    SendMessage(HWND_BROADCAST, RegisterWindowMessage(AppTitle), 0, 0);
    // und beende sofort die neu gestartete (2.) Programminstanz
  end
  else
  try
    Parameter:='';
    // gff. eine spezifische Parameteranalyse
    if paramcount = 0 then
    begin
      if Windows.AllocConsole then
      try
        ConsoleForm := TForm1.Create(nil);
        WriteLn;
        // irgendeine sinnvolle Information, z.B.:
        WriteLn('Usage: GUIcons <Parameter>');
        WriteLn('Fortsetzung mit <ENTER>');
        write('> ');
        readln(Parameter);
      finally
        ConsoleForm.Free;
        FreeConsole;
      end;
    end
    else parameter:=paramstr(1);
    // ggf. prüfen, ob doch noch benötigter Parameter eingegeben wurde,
    // z.B. Parameter "/open"
    if Uppercase(Parameter)='/OPEN' then
    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end
  finally
    CloseHandle(Mutex);
  end;
end.
Eine grundsätzliche Frage ist aber, wozu denn überhaupt der Klimmzug mit der Konsolenausgabe sinnvoll sein soll, wenn man die gleiche Information problemlos und diese viel besser und ansprechender noch vor der Initialisierung der Mainform mittels Showmessage() anzeigen kann, ohne ggf. zwangsläufig dann die Mainform öffnen zu müssen.
  Mit Zitat antworten Zitat
Antwort Antwort


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 08:33 Uhr.
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