[GELÖST]Bedingte Kompilierung, wenn keine GUI verwendet

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Benutzeravatar
willi4willi
Lazarusforum e. V.
Beiträge: 155
Registriert: Sa 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows, Linux (debian) / Lazarus 3.2 / FPC 3.2.2
CPU-Target: i386, win64, arm

[GELÖST]Bedingte Kompilierung, wenn keine GUI verwendet

Beitrag von willi4willi »

Hallo liebe Lazarus-Gemeinde,

ist es möglich im Programm auszuwerten, ob ein Programm eine GUI-Anwendung hat, also in den Projekteinstellungen unter Konfiguration und Ziele der Schalter
"Win32-GUI-Anwendung (-WG)" gesetzt oder nicht gesetzt ist?

So in der Art:

Code: Alles auswählen

 {$IFDEF ????} MacheWas {$ELSE} MacheWasAnderes [$ENDIF} 
Zuletzt geändert von willi4willi am Do 29. Okt 2020, 21:43, insgesamt 1-mal geändert.
 

Viele Grüße

Willi4Willi

------------

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Bedingte Kompilierung, wenn keine GUI verwendet

Beitrag von fliegermichl »

Normalerweise ist ohne GUI CONSOLE definiert.
Also

Code: Alles auswählen

{$ifdef console}
 writeln('Konsolenanwendung');
{$else}
 ShowMessage('GUI Anwendung');
{$endif}
 

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Bedingte Kompilierung, wenn keine GUI verwendet

Beitrag von PascalDragon »

fliegermichl hat geschrieben:
Do 29. Okt 2020, 13:43
Normalerweise ist ohne GUI CONSOLE definiert.
Beachte aber bitte, dass das Ändern des Anwendungstyps nicht automatisch dazu führt, dass deine Units neu kompiliert werden. Also entweder nur im Hauptprogramm überprüfen oder manuell sauber neu bauen.
FPC Compiler Entwickler

Benutzeravatar
willi4willi
Lazarusforum e. V.
Beiträge: 155
Registriert: Sa 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows, Linux (debian) / Lazarus 3.2 / FPC 3.2.2
CPU-Target: i386, win64, arm

Re: Bedingte Kompilierung, wenn keine GUI verwendet

Beitrag von willi4willi »

Leider funktioniert das so nicht. Vielleicht zum Hintergrund meiner Frage:

Wenn ich ein GUI-Programm unter Windows erstelle, dann bekomme ich, wenn "Win32-GUI-Anwendung (-WG)" nicht gesetzt ist, ein zweites Fenster angezeigt. In diesem Fenster kann ich dann Status-Ausgaben mit Writeln(''); ausgeben.

Setzte ich diesen Schalter, dann kommt das Fenster nicht und das Programm läuft beim Writeln(''); gegen einen Fehler.

Das möchte ich verhindern. Nur, wie frage ich das im Programm-Code ab, ob der Schalter gesetzt ist oder nicht? :?:
 

Viele Grüße

Willi4Willi

------------

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Bedingte Kompilierung, wenn keine GUI verwendet

Beitrag von fliegermichl »

Das ist was anderes. Dann ist es immer ein GUI Programm aber eben mal mit und mal ohne Konsolenfenster.

Du kannst die Unit windows einbinden und vor dem Writeln prüfen ob es das Konsolenfenster gibt

Code: Alles auswählen

 if GetConsoleWindow <> 0 then writeln('test');
 

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Bedingte Kompilierung, wenn keine GUI verwendet

Beitrag von Winni »

Hi!

Falls Du später in Deinem code die Info naoc einmal brauchst,
kannst Du das in einer Variablen speichern

Code: Alles auswählen

Var isConsole : boolean;

{$ifdef console}
isConsole := true;
{$else}
 isConsole := false;
{$endif}
Winni

Benutzeravatar
willi4willi
Lazarusforum e. V.
Beiträge: 155
Registriert: Sa 1. Nov 2008, 18:06
OS, Lazarus, FPC: Windows, Linux (debian) / Lazarus 3.2 / FPC 3.2.2
CPU-Target: i386, win64, arm

Re: Bedingte Kompilierung, wenn keine GUI verwendet

Beitrag von willi4willi »

Danke allen für die Tipps!

Code: Alles auswählen

 if GetConsoleWindow <> 0 then writeln('test');
Das war die Lösung!

Und damit ich das öfter Im Programm verweden kann, ohne die Funktion erneut aufrufen zu müssen, packe ich das in eine Variable. Das ist auch eine gute Idee.
 

Viele Grüße

Willi4Willi

------------

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Bedingte Kompilierung, wenn keine GUI verwendet

Beitrag von PascalDragon »

willi4willi hat geschrieben:
Do 29. Okt 2020, 21:42
Danke allen für die Tipps!

Code: Alles auswählen

 if GetConsoleWindow <> 0 then writeln('test');
Das war die Lösung!

Und damit ich das öfter Im Programm verweden kann, ohne die Funktion erneut aufrufen zu müssen, packe ich das in eine Variable. Das ist auch eine gute Idee.
Für diesen Fall solltest du einfach die Variable IsConsole aus der Unit System verwenden, diese wird nämlich durch den jeweiligen Einsprungspunkt in die Anwendung gesetzt und spiegelt damit tatsächlich den Zustand von -WG wieder.

Die Prüfung von GetConsoleWindow hat nämlich den Nachteil, dass ein Aufruf deines Programms mit Dateiumleitung durch CreateProcess ebenfalls denkt, dass es im GUI-Modus ist.

Zur Demonstration:

Code: Alles auswählen

program tconsole;

uses
  Windows;

var
  s: AnsiString;
begin
  WriteStr(s, IsConsole);
  MessageBox(0, PChar(s), 'Info', MB_OK);
end.
Einmal mit und einmal ohne -WG kompiliert zeigt der Dialog TRUE in ersten und FALSE im zweiten Fall an.
FPC Compiler Entwickler

Antworten