Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Compiler Directive zur Laufzeit abfragen? (https://www.delphipraxis.net/154534-compiler-directive-zur-laufzeit-abfragen.html)

moelski 14. Sep 2010 18:52

Compiler Directive zur Laufzeit abfragen?
 
Moin !

Wenn ich eine Directive festlege ala
Delphi-Quellcode:
{$Define TESTMODE}
Kann ich das dann zur Laufzeit auch abfragen?

Oder bestehen die Infos nur bis zum Compilieren?

implementation 14. Sep 2010 18:53

AW: Compiler Directive zur Laufzeit abfragen?
 
Die bestehen erstmal nur bis zum Kompilieren, du könntest aber eine Konstante deklarieren ...
Delphi-Quellcode:
const
  TESTMODE = {$ifdef TESTMODE}true{$else}false{$endif};

moelski 14. Sep 2010 18:57

AW: Compiler Directive zur Laufzeit abfragen?
 
Moin !

Danke für den Tip. Das täte mir vermutlich schon reichen. :thumb:

himitsu 14. Sep 2010 20:49

AW: Compiler Directive zur Laufzeit abfragen?
 
Nur nochmal zum Verständnis ... die heißen nicht umsonst Compiler-Direktiven, da sie sich direkt an den Compiler wenden, diesen "steuern" und nicht persönlich in die EXE einkompiliert werden.

Also du kannst, wie schon genannt, den Compiler anweisen, daß er etwas machen soll, welches dein "Programm" verändert.


Man kann das ganze aber auch andersrum lösen.
Delphi-Quellcode:
const TESTMODE = true;

{$if TESTMODE} .. {$ifend};
Halt jenachdem, was man genau vor hat.

Die Muhkuh 14. Sep 2010 23:48

AW: Compiler Directive zur Laufzeit abfragen?
 
Zitat:

Zitat von implementation (Beitrag 1049619)
Die bestehen erstmal nur bis zum Kompilieren, du könntest aber eine Konstante deklarieren ...
Delphi-Quellcode:
const
  TESTMODE = {$ifdef TESTMODE}true{$else}false{$endif};

Wobei ich den Sinn dahinter nicht ganz so verstehe...

Weil, wenn Du nun im Code auf

Delphi-Quellcode:
if Testmode then
abfragst, dann kannst Du auch gleich wieder

Delphi-Quellcode:
{$ifdef TESTMODE}
machen.

Außerdem ist dann, wenn Du die Compiler-Direktive nutzt, ausgeschlossen, dass im Release-Build Testcode vorhanden ist. Wenn Du es mit dem normalen If einkompilierst, kann man den Testcode auch im Release wiederfinden.

BUG 14. Sep 2010 23:52

AW: Compiler Directive zur Laufzeit abfragen?
 
Um mal ein Beispiel zu konstruieren:
Eine DLL soll zur Laufzeit herausgeben, ob sie nun im TESTMODE läuft oder nicht.

moelski 15. Sep 2010 05:49

AW: Compiler Directive zur Laufzeit abfragen?
 
Moin !

Um mal kurz zu erklären warum ich das brauche ...
Unsere Software kommt aus dem Hobbybereich (Modellbau). Nun wollen wir aber bald die Soft auch kostenpflichtig anbieten da es doch einige Nachfragen von Firmen gab.
Diese haben aber im Normalfall kein Interesse an den "Hobbyfunktionen".

Somit brauche ich eine Möglichkeit entweder die Funktionen in DLLs auszulagern - was ich so langsam verworfen habe - oder eben eine EXE zu erzeugen die den Ballast erst gar nicht beinhaltet.

Soweit dazu. Ich habe das jetzt mal mit den Directiven getestet. In einer Unit klappt es super. Oben habe ich {$Define HOBBY} und weiter beim Use wird die Unit je nach Switch erst gar nicht eingebunden:
{$ifdef HOBBY},Project_Item_XYZ{$endif}.
Dann noch die eigentliche Erstellung der Project Item Instanz umklammern mit {$ifdef HOBBY} CODE {$endif} und ich kann 2 EXEn erzeugen.

Was mir aber nicht gelingt ist ein "globaler" Switch. Ich würde gerne in meinem Projekt Source einen Schalter setzen können. Das mag er aber nun gar nicht.
Sind die Directiven immer Unitbezogen?

himitsu 15. Sep 2010 06:02

AW: Compiler Directive zur Laufzeit abfragen?
 
Diese Compiler-Direktiven gelten nur innerhalb einer Unit.
Global geht von innerhalb nicht, außer man gibt die über den Compiler rein (z.B. über die Projektoptionen des Inlinecompilers oder über einen entsprechenden Parameter des Komandozeilencompilers).

Eine alternative wäre noch eine Include-Datei, welche man überall einbindet.

PS: Bei der Variante mit dem Kompilerschalter über die Projektoptionen und den Parameter, muß man alles manuell komplett neu kompilieren, da der Compiler dieses nur in neu kompilierten Dateien aktualisiert.
Wurde eine Datei nicht verändert, dann "optimiert" Delphi dieses weg, da dann die Datei nicht automatisch neu kompiliert wird, da Delphi nicht automatisch auf "extern" geänderte Kompilerschalter reagiert.

PS: Über die Variante mit der Konstante und dem {$IF kann man auch über Uses-Grenzen gehen. (das nutze ich in meinem himXML, um zu prüfen ob die Units im selben Modus kompiliert wurden, wenn man die Comilerschalter umgestellt hat)

moelski 15. Sep 2010 06:34

AW: Compiler Directive zur Laufzeit abfragen?
 
@himitsu : :thumb:

Im Project Source klappt es nicht mit der Konstanten. Aber wenn ich das in eine Unit packe die ich eh überall eingebungen habe, dann klappts.

Die Exe wird ja nach Schalter 2Kb größer oder eben nicht 8-) Man muss natürlich komplett neu compilieren, aber das ist ja kein wirkliches Problem.

Vielen Dank für den Tip !!!

dataspider 15. Sep 2010 07:25

AW: Compiler Directive zur Laufzeit abfragen?
 
Hi,

du hast doch D2010. Da kann man doch wunderschön in der Projektverwaltung eine neue Build-Konfiguration anlegen.
Dort kannst du unter Bedingungen dein DEF eintragen.
Und wenn du noch ein anderes Ausgabe - Verzeichnis dafür definierst, liegen die EXE'n auch noch in einem betreffenden Verzeichnis.

Das finde ich IMHO viel einfacher und übersichtlicher.

Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:45 Uhr.
Seite 1 von 2  1 2      

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