Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wie ermittele ich ob eine Console zugewiesen ist? (https://www.delphipraxis.net/52127-wie-ermittele-ich-ob-eine-console-zugewiesen-ist.html)

MaBuSE 24. Aug 2005 09:13


Wie ermittele ich ob eine Console zugewiesen ist?
 
Hallo

wenn ich mit
Delphi-Quellcode:
WriteLn('Test');
einen Text ausgebe. Bekomme ich in einer
Delphi-Quellcode:
{$APPTYPE GUI}
Anwendung einen Fehler (EA Fehler 105).
Das ist auch soweit verständlich. Es gibt ja keine Console zugewiesen ist zu der WriteLn schreiben könnte.
Ich weise also mit
Delphi-Quellcode:
AllocConsole
eine Konsole zu und kann nun mit WriteLn in diese Console schreiben.
Wenn ich nun mit
Delphi-Quellcode:
FreeConsole;
die Konsole von der Anwendung trenne, kann ich natürlich nicht mehr mit WriteLn arbeiten -> Fehler (EA-Fehler 6)

Meine Frage: "Wie erkenne ich ob gerade eine Konsole zugewiesen ist?"

Mein Lösungsansatz war:
Delphi-Quellcode:
...
function isAllocConsole: Boolean;
begin
  Result := False;
  try
    {$I-}
    Write(#0#8); // Write(''); funktioniert nicht, da nix ausgegeben wird :-(
    {$I+}
    Result := (IOResult = 0);
  except
  end;
end;
...
  if isAllocConsole then WriteLn('DP RuLeZ');
...
Aber mit #0 wird trotzdem ein Leerzeichen auf den Bildschirm ausgegeben. Das dann mit DEL (#8) wieder gelöscht wird.
Das ist aber keine gute Lösung, da bei z.B. einer Ausgabeumleitung in eine Datei viele #0#8 enthalten wären :-(

Weiß jemand eine bessere Lösung?

Olli 24. Aug 2005 09:21

Re: Wie ermittele ich ob eine Console zugewiesen ist?
 
Wie wäre es mit MSDN-Library durchsuchenGetConsoleWindow() und einem Test auf 0 als Rückgabewert?!

Muetze1 24. Aug 2005 10:00

Re: Wie ermittele ich ob eine Console zugewiesen ist?
 
Moin!

Im Normalfall setzen beide Funktionen die globale Variable IsConsole entsprechend.

Ich möchte hier gleich auch nochmal auf einen Fehler Hinweisen in diesem Zusammenhang: Bei meinem Projekt habe ich auch nachträglich eine Konsole angelegt und das hatte aber sehr merkwürdige Nebeneffekte. Zum einen wurden Fenster und Klassen nicht mehr ordentlich und sauber abgeräumt und zum anderen funktionierte das minimieren des Hauptfenster nicht mehr (MDI App).

Es ist also Vorsicht geboten.

MfG
Muetze1

Motzi 24. Aug 2005 10:01

Re: Wie ermittele ich ob eine Console zugewiesen ist?
 
Oder alternativ GetStdHandle()?

MaBuSE 24. Aug 2005 10:08

Re: Wie ermittele ich ob eine Console zugewiesen ist?
 
Zitat:

Zitat von Muetze1
Im Normalfall setzen beide Funktionen die globale Variable IsConsole entsprechend.

Da muß ich Dir widersprechen!!!

isConsole ist bei {APPTYPE GUI} immer FALSE !!!

Auszug aus der system.pas:
Delphi-Quellcode:
...
  IsConsole: Boolean;      { True if compiled as console app }
...
in der Delphi Hilfe steht:
Zitat:

Wenn das Modul als Konsolenanwendung gelinkt wurde, ist die Variable IsConsole true. Dies gilt sowohl für eine ausführbare Datei als auch für eine gemeinsam genutzte Bibliothek.

Olli 24. Aug 2005 10:15

Re: Wie ermittele ich ob eine Console zugewiesen ist?
 
Zitat:

Zitat von Motzi
Oder alternativ GetStdHandle()?

Igitt, da muß man ja noch einen Parameter übergeben :mrgreen: ... muß man bei GetConsoleWindow() nicht, ätsch :P

@Mabuse: Du hast vollkommen recht mit dem Flag, da dieses bereits von der RTL vor dem Aufruf der Main (begin end. in der DPR) gesetzt wird. Es entspricht dem Flag in der EXE.

MaBuSE 24. Aug 2005 10:22

Re: Wie ermittele ich ob eine Console zugewiesen ist?
 
Zitat:

Zitat von Olli
Wie wäre es mit MSDN-Library durchsuchenGetConsoleWindow() und einem Test auf 0 als Rückgabewert?!

Leider ist diese Funktion nicht in der Windows.pas definiert :-(

Aber es klappt ;-)

Delphi-Quellcode:
function GetConsoleWindow:THandle; external kernel32 name 'GetConsoleWindow';

function isAllocConsole: Boolean;
begin
  Result := GetConsoleWindow <> 0;
end;

MaBuSE 24. Aug 2005 10:23

Re: Wie ermittele ich ob eine Console zugewiesen ist?
 
Danke für alle Antworten :dp:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 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