2008-09-29 4 views

Antwort

24

verwenden:

{$IFDEF DEBUG} 
... 
{$ENDIF} 
+0

Und stellen Sie sicher, dass die Projektoptionen DEBUG definieren. Ich denke, nur die neueren Versionen von Delphi (D2007 und höher?) Setzen es standardmäßig für einen Debug-Build. –

+4

Für ältere Versionen können Sie {$ IFOPT D +} verwenden. 'D' ist das Compiler-Optionssymbol für "Kompiliere mit Debug-Info".'D +' zeigt an, dass das Folgende nur dann kompiliert werden sollte, wenn diese Option * ON * ist. – Deltics

+1

Für die Portabilität des besser lesbaren {$ IFDEF DEBUG} könnten Sie natürlich auch etwas wie {$ IFOPT C +} {$ DEFINE DEBUG} {$ ENDIF} in eine Standard-Include-Datei aufnehmen (in den Abschnitten, die sich auf Versionen von Delphi beziehen) DEBUG für Sie nicht selbst. Beachten Sie jedoch, dass diese "automatische Definition" nicht immer zuverlässig ist. DEBUGINFO Ich denke, es ist automatisch definiert, aber DEBUG ist nur definiert, wenn Sie die Standardbedingungen für den DEBUG-Build unverändert belassen Fügen Sie DEBUG als "Factory" -Einstellung hinzu, aber dies kann und kann entfernt werden, dh es ist keine "eingebaute" Definition, wenn mit Debug Info erstellt wird. – Deltics

7

Abgesehen von dem, was gesagt lassevk, können Sie auch ein paar andere Methoden der Compiler-Auswertung verwenden können (seit Delphi 6, glaube ich):

{$IF NOT DECLARED(SOME_SYMBOL)} 
    // Mind you : The NOT above is optional 
{$ELSE} 
{$IFEND} 

Um zu überprüfen, Wenn der Compiler über diese Funktion verfügt, verwenden Sie:

{$IFDEF CONDITIONALEXPRESSIONS} 

Es gibt mehrere Verwendungen dafür.

Zum Beispiel könnten Sie die Version des RTL überprüfen; Von der Delphi-Hilfe:

Sie können RTLVersion in $ IF verwenden Ausdrücke die Runtime-Bibliothek Versionsstufe unabhängig der Compiler-Version Ebene zu testen.
Beispiel: {IF $ RTLVersion> = 16,2} ... {$ IFEND}

Auch kann der Compiler-Version selbst aus dem Code überprüft, wieder:

Compiler zugeordnet ist ein Wert von der Compiler, wenn die Systemeinheit kompiliert wird. Es zeigt die Version Ebene der Compiler-Funktionen/ Sprache Syntax, die unabhängig von der RTLVersion voranbringen kann. CompilerVersion kann in $ IF Ausdrücken getestet werden und sollte anstelle von Test für die VERxxx bedingte Definition verwendet werden. Testen Sie immer für größer oder kleiner als eine bekannte Revisionsnummer. Es ist eine schlechte Idee zu Test für eine bestimmte Revisionsstufe.

Eine andere Sache, die ich regelmäßig zu tun, ist ein Symbol definieren, wenn es noch nicht definiert ist (schön für zukunfts Kompatiblität), wie folgt aus:

{$IF NOT DECLARED(UTF8String)} 
type 
    UTF8String = type AnsiString; 
{$IFEND} 

hoffe, das hilft!

+0

Deklariert(), duh –

+0

@ user205376: Danke für das scharfe Auge, reparierte ich den Tippfehler. – PatrickvL

3

Diese Steuerrichtlinien stehen zur Verfügung:

{$IFDEF} 
{$ELSE} 
{$ENDIF} 
{$IFNDEF} //if *not* defined 

und sie verwendet werden können, wie hier gezeigt:

procedure TfrmMain.Button1Click(Sender: TObject); 
begin 
    {$IFDEF MY_CONDITIONAL} 
    ShowMessage('my conditional IS defined!'); 
    {$ELSE} 
    ShowMessage('my conditional is NOT defined!'); 
    {$ENDIF} 

    {$IFNDEF MY_CONDITIONAL} 
    ShowMessage('My conditional is explicitly NOT defined'); 
    {$ENDIF} 
end; 
+2

Sie haben {$ IFOPT} vergessen, mit dem Sie direkt nach Compilereinstellungen testen können. {$ IFOPT D +} // DEBUG INFO AUF {$ IFOPT C +} // ASSERTIONS AKTIVIERT etc – Deltics

5

DebugHook gesetzt, wenn eine Anwendung unter dem IDE-Debugger ausgeführt wird. Nicht wie eine Compiler-Direktive, aber immer noch ziemlich nützlich. Zum Beispiel:

ReportMemoryLeaksOnShutdown := DebugHook <> 0; // show memory leaks when debugging