Programmierung > Delphi/Lazarus > Compilerweiche

Compilerweiche

Beschreibung

Lazarus und Delphi sind nicht vollständig zueinander kompatibel. Auch zwischen den Delphiversionen gibt es Unterschiede. Deshalb ist es manchmal notwendig compilerabhängige unterschiedliche Anweisungen auszuführen.

Delphiversionen

In jeder Delphiversion ist ein eigenes Symbol definiert. Dieses Symbol beginnt mit VER, gefolgt von einer zwei- bzw. dreistelligen Zahl. Mit den Compilerdirektiven $IfDef und $IfNDef wird abgefragt, ob ein bestimmtes Symbol definiert ist oder nicht. Die Direktive wird zusammen mit dem Symbol in geschweifte Klammern eingeschlossen. Anschliessend folgt die Anweisungsfolge, welche ausgeführt werden soll, wenn die Bedingung erfüllt ist. Zum Abschluss folgt die Anweisung {$EndIf}. Wie bei normalen If-Anweisungen ist auch ein {$Else} möglich.

Die Symbole für die Delphiversionen sind.

VER80  - Delphi 1
VER90  - Delphi 2
VER100 - Delphi 3
VER120 - Delphi 4
VER130 - Delphi 5
VER140 - Delphi 6
VER150 - Delphi 7
VER160 - Delphi 8
VER170 - Delphi 2005
VER180 - Delphi 2006
VER185 - Delphi 2007
VER200 - Delphi 2009
VER210 - Delphi 2010
VER220 - Delphi XE
VER230 - Delphi XE2
VER240 - Delphi XE3
VER250 - Delphi XE4
VER260 - Delphi XE5
VER270 - Delphi XE6
VER280 - Delphi XE7
VER290 - Delphi XE8
VER300 - Delphi 10 Seattle
VER310 - Delphi 10.1 Berlin
VER320 - Delphi 10.2 Tokyo

Zum Test könnte man in das FormCreate folgendes einfügen:

{$IFDEF VER80} ShowMessage('Delphi 1');{$ENDIF}
{$IFDEF VER90} ShowMessage('Delphi 2');{$ENDIF}
{$IFDEF VER100} ShowMessage('Delphi 3');{$ENDIF}
{$IFDEF VER120} ShowMessage('Delphi 4');{$ENDIF}
{$IFDEF VER130} ShowMessage('Delphi 5');{$ENDIF}
{$IFDEF VER140} ShowMessage('Delphi 6');{$ENDIF}
{$IFDEF VER150} ShowMessage('Delphi 7');{$ENDIF}
{$IFDEF VER160} ShowMessage('Delphi 8');{$ENDIF}
{$IFDEF VER170} ShowMessage('Delphi 2005');{$ENDIF}
{$IFDEF VER180} ShowMessage('Delphi 2006');{$ENDIF}
{$IFDEF VER185} ShowMessage('Delphi 2007');{$ENDIF}
{$IFDEF VER200} ShowMessage('Delphi 2009');{$ENDIF}
{$IFDEF VER210} ShowMessage('Delphi 2010');{$ENDIF}
{$IFDEF VER220} ShowMessage('Delphi XE');{$ENDIF}
{$IFDEF VER230} ShowMessage('Delphi XE2');{$ENDIF}
{$IFDEF VER240} ShowMessage('Delphi XE3');{$ENDIF}
{$IFDEF VER250} ShowMessage('Delphi XE4');{$ENDIF}
{$IFDEF VER260} ShowMessage('Delphi XE5');{$ENDIF}
{$IFDEF VER270} ShowMessage('Delphi XE6');{$ENDIF}
{$IFDEF VER280} ShowMessage('Delphi XE7');{$ENDIF}
{$IFDEF VER290} ShowMessage('Delphi XE8');{$ENDIF}
{$IFDEF VER300} ShowMessage('Delphi 10 Seattle');{$ENDIF}
{$IFDEF VER310} ShowMessage('Delphi 10.1 Berlin');{$ENDIF}
{$IFDEF VER320} ShowMessage('Delphi 10.2 Tokyo');{$ENDIF}

In Delphi gibt es die Systemvariable CompilerVersion. Die Werte sind

8    - Delphi 1
9    - Delphi 2
10   - Delphi 3
12   - Delphi 4
13   - Delphi 5
14   - Delphi 6
15   - Delphi 7
16   - Delphi 8
17   - Delphi 2005
18   - Delphi 2006
18.5 - Delphi 2007
20   - Delphi 2009
21   - Delphi 2010
22   - Delphi XE
23   - Delphi XE2
24   - Delphi XE3
25   - Delphi XE4
26   - Delphi XE5
27   - Delphi XE6
28   - Delphi XE7
29   - Delphi XE8
30   - Delphi 10 Seattle
31   - Delphi 10.1 Berlin
32   - Delphi 10.2 Tokyo

Die Variable lässt sich innerhalb von Direktiven und im Quelltext verwenden:

{$IF CompilerVersion >= 20} {$DEFINE CanUnicode} {$IFEND}
 
if CompilerVersion >= 20 then ShowMessage('Can Unicode');

 

Freepascalversionen

In Lazarus gibt es anschenend keine Möglichkeit die Version der IDE zu ermitteln. Jedoch kann man über Makros die Version des Freepascalcompilers ermitteln:

FPC_FULLVERSION  Die Version des Compiler als Integer (ZB FPC 2.2.4 ist 20204).
FPC_VERSION      Die Majorversionsnummer des Compiler.
FPC_RELEASE      Die Minornummer des Compilers.
FPC_PATCH        Die Patchnummer des Compilers.

Um diese Makros nutzen zu können benötig man die Compilerdirektiven:

{$macro on}
{$macro off}

Mit dem Symbol FPC kann geprüft werden, ob der Freepascalcompiler verwendet wird:

{$IfDef FPC}ShowMessage('Freepascal');{$EndIf}

 

Unterscheidung Delphi/Lazarus

Dafür bietet sich die Prüfung auf den Freepascalcompiler an. In Delphi

{$IfNDef FPC}
  ShowMessage('Delphi');
{$Else}
  ShowMessage('Freepascal');
{$EndIf}

Und in Lazarus:

{$IfNDef FPC}
  ShowMessage('Delphi');
{$Else}
  ShowMessage('Freepascal');
{$EndIf}

 

Demos

Quelltext einer Demo für Delphi: Compiler Delphi (Compiler_Delphi.7z - 2 kb) MD5 (1 kb).
Stand: 31. August 2018

Quelltext einer Demo für Lazarus: Compiler Lazarus (Compiler_Lazarus.7z - 2 kb) MD5 (1 kb).
Stand: 31. August 2018

 

Links