Einzelnen Beitrag anzeigen

ASM

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

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