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.