Direktivy podmíněného překladu jsou ze všech asi úplně nejdůležitější. Umožňují přeložit rozdílný kód v závislosti na tom, jaká nastala podmínka. Je tak např. možné překládat jiný kód pro debuggovací a jiný pro finální verzi produktu, jiný pro Windows a jiný pro DOS.
Nejčastěji se podmíněný překlad používá tak, že na začátku definujete symbol DEBUG a pak jisté části kódu překládáte pouze tehdy, když je tento symbol definován. To vám pak umožní nemít ve finální verzi kódu ladící výpisy, poznámky o tom, kde je co v paměti umístěno atd.
Text co je mezi {$IFOPT Switch+} a {$ENDIF} se přeloží jen tehdy, když je přepínač $Switch zapnutý. Obdobně text co je mezi {$IFOPT Switch-} a {$ENDIF} se přeloží jen tehdy, když je přepínač $Switch vypnutý. Raději na ilustrativním příkladu:
program IFOPT; begin {$IFOPT N+} writeln('Momentalne je zapnuto generovani instrukci pro numericky koprocesor a vypocty jsou presnejsi'); {$ENDIF} {$IFOPT R+} writeln('Je zapnuta kontrola rozsahu'); {$ENDIF} {$IFOPT S+} writeln('Je zapnuta kontrola zasobniku'); {$IFOPT R+} writeln('Je zapnuta kontrola zasobniku i kontrola rozsahu'); {$ENDIF} {$ENDIF} end.
Pokud nevíte, co který přepínač znamená, můžete se podívat se do kapitoly Direktivy překladače.
Pomocí {$DEFINE Symbol} řekneme kompilátoru symbol Symbol je definovaný. Sama o sobě tato direktiva nemá žádný význam a rozhodně není obdobou #define z programovacího jazyku C.
{$UNDEF Symbol} zruší definici symbolu Symbol. I tato direktiva je sama o sobě naprosto k ničemu. Je k ničemu dokonce i při použití současně s direktivou $DEFINE.
Text mezi {$IFDEF Symbol} a {$ENDIF} se přeloží pouze tehdy, pokud je symbol Symbol definovaný. Spolu s $DEFINE tvoří tato direktiva velice silný nástroj. Mimo jiné i proto, že spousta symbolů je definována automaticky (např. symbol WINDOWS, pokud překládáme pro WINDOWS apod.).
Text mezi {$IFDEF Symbol} a {$ENDIF} se přeloží pouze tehdy, pokud symbol Symbol není definovaný. Podobně jako $IFDEF je toto velice užitečné.
I direktivy mají své ELSE, co více dodat.
{$DEFINE DEBUG} {$IFDEF DEBUG} {$R+,S+,Q+,C+} {$ELSE} {$R-,S-,Q-,C-} {$ENDIF} program Ukazka; begin {$IFDEF DEBUG} writeln('Nyni jsme v DEBUG modu'); {$ELSE} writeln('Nyni jsme ve final modu.'); {$ENDIF} {$IFOPT R+} writeln('Prepinac R je zapnuty'); {$ENDIF} end.
Tato direktiva ukončuje příslušnou direktivu IF. Jednotlivé direktivy lze mezi sebe různě zanořovat, větvit...
Přepište všechny své programy tak, aby umožnily zapnout a vypnout ladící výstupy.