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 2 von 2     12   
ASM

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

AW: GUI-Anwendung mit Konsolenausgabe

  Alt 14. Apr 2011, 16: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
Seite 2 von 2     12   


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 13:26 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