A Delphi programozási nyelv

Utasítások, vezérlési szerkezetek

Értékadás, üres utasítás

Értékadás

Formája balérték := kifejezés. Maga az értékadás nem kifejezés. Balérték lehet változó, típuskényszerített változó, pointer által hivatkozott változó vagy egy összetett típusú változó egy komponense.
Értékadás szerinti kompatibilitás
Egy T2 típusú kifejezés értékül adható egy T1 típusú változónak, ha a kifejezés értéke T1 típusértékhalmazában van és az alábbiak közül legalább egy teljesül:

Üres utasítás

Az üres utasítás megfelelője az, hogy a forráskódban az utasítás helyén nincs semmi.

Szekvencia

utasítás1; utasítás2; utasítás3

A ; elválasztójel, nem lezáró. Ha utasítás3 után is írnánk ;-t, az azt jelentené, hogy a szekvencia négy utasításból áll, ahol a negyedik az üres utasítás. Gyakorlatban mégis oda szoktuk írni, hátha később új utasítás kerül a végére.

Elágazások

 Az elágazásokkal a programunk végrehajtását bizonyos feltételek teljesüléséhez köthetjük. Pascalban kétféle feltételes utasítás létezik: az if és a case.

Az if utasítás

 Az if utasítás szintaxisa a következő:

if kifejezés then utasítás;

vagy

if kifejezés then utasítás1 else utasítás2;

 A kifejezés tetszőleges logikai érték lehet, de pl. szám nem. Megfigyelhető, hogy az egyes ágakban csak egyetlen utasítás állhat, ezért ha több utasítást akarunk végrehajtani, akkor azokat begin end; blokkba kell zárnunk. Azt is észrevehettük, hogy az else előtt nem állhat ; (pontosvessző). A Delphiben nincs elseif utasítás, ezt a következőképpen valósíthatjuk meg:

if kifejezés1 then utasítás1 else if kifejezés2 then utasítás2 else if kifejezés3 then utasítás3 else utasítás4;

A case utasítás

 A case utasítás egy kifejezést és az általa felvehető értékeket (vagy azok egy részét) tartalmazza. Ezek az értékek csak konstansok lehetnek, és mindenképpen megszámlálható típusúnak kell lenniük. Minden érték legfeljebb egyszer szerepelhet. Használhatunk else ágat is, amely akkor hajtódik végre, ha egyetlen érték sem felel meg a kifejezésnek. Egy kiválasztott ág végrehajtása után a vezérlés az end kulcsszó után folytatódik.  

Példa a case utasítás használatára:

case MyChar of ' ' : Text:='szóköz'; // ebben az ágban egyetlen értéket adtunk meg '.', ',', ';', '!', '?' : Text:='írásjel'; // így adhatunk meg több értéket 'a' .. 'z' : Text:='kisbetű'; // így adhatunk meg intervallumot 'A' .. 'Z' : Text:='nagybetű'; '0' .. '9' : Text:='szám'; else Text:='ismeretlen';

Ciklusok

 A Pascal nyelvben is léteznek olyan utasítások, melyek egy adott programrész többszörös végrehajtását teszik lehetővé. Ezen utasításokat vizsgáljuk meg a következő pontokban.

A for ciklus

 A Delphi számláló ciklusa a for utasítással adható meg. Példa:

Faktorialis:=1; for I:=1 to 10 do // ez a ciklus 10!-t számolja ki Faktorialis:=Faktorialis*I;

A ciklusmag egyetlen utasításból állhat, több utasítást úgy tudunk megadni, ha begin end; blokkba zárjuk. A Pascal for ciklusa kötöttebb, mint más programnyelvekben, pl. C-ben. Arra azonban van mód, hogy a számlálás visszafelé történjen: a to helyére downto-t kell írni, és persze a megadott intervallumnak csökkenőnek kell lennie. Ha bonyolultabb ciklust szeretnénk írni, válasszuk a while vagy repeat utasítást. Lényeges még, hogy a for ciklus ciklusváltozója csak lokális változó lehet! (Erre a fordító is figyelmeztet.) A ciklusváltozó értéke nem módosítható a ciklusmagból.

    Pl.:

for Index:=100 downto 1 do begin for SubIndex:=1 to Index-1 do DummyArray[Index, SubIndex] := 0; Inc(Index); // ez hibás sor! end;

A while ciklus

 A Pascal nyelv általános előltesztelő ciklusa a while-do ciklus. Szintaxisa:

while logikai_kifejezés do utasítás;

A ciklus addig fut, míg a logikai kifejezés igaz. Több utasítás esetén itt is a begin end; blokk a megoldás.

A repeat ciklus

 A Pascal nyelv hátultesztelő ciklusa a repeat-until ciklus. Szintaxisa:

repeat utasitás1; utasitás2; ... utasitásn; until logikai_kifejezés;

A ciklus akkor ér véget, ha a logikai_kifejezés igaz (!) lesz, de legalább egyszer mindenképpen végrehajtódik a ciklusmag. Látható, hogy itt több utasítás is megadható, nincs szükség begin end; blokkra.

A foreach ciklus

A Delphi 9-es verziójában megjelenő egyik újdonság a C#-ból is ismert foreach ciklusszervező utasítás megjelenése. Szintaxisa:

for elem in konténer do utasítás;

A for .. in bejárja a konténert és elemeit sorra értékül adja a ciklusváltozónak, amelynek megfelelő típusúnak kell lennie. Konténernek minősülnek a tömbök (akár a többdimenziósak és a dinamikusak is), a stringek, a halmazok, valamint a megfelelő interfésszel rendelkező rekordok és osztályok.

Egy rekord vagy osztály akkor tekinthető konténernek, ha van GetEnumerator() metódusa. A visszaadott „enumerátor”-nak (ez lehet rekord, osztály vagy interfész típusú) az alábbi két dologgal kell rendelkeznie: egy MoveNext():Boolean függvénnyel, amely a következő elemre áll és false-t ad vissza, ha ez nem sikerült, valamint egy Current csak olvasható jellemzővel (property), ennek típusa lesz a konténer elemtípusa és az értékét kapja meg a ciklusváltozó. A könyvtárbeli konténer osztályok (pl. TList, TCollection, TStringList, TComponent, TMenuItem) rendelkeznek a megfelelő enumerátorral.

Vezérlésátadó utasítások

Goto

Goto címkenév: a címkenévvel jelölt utasításra ugrik a végrehajtás. A címkét a goto-t tartalmazó alprogram vagy főprogram utasításblokkja előtt fel kell sorolni a label kulcsszó után. Egy utasítás úgy látható el címkével, hogy az utasítás elé odaírjuk a címkét kettősponttal elválasztva. Ha lehet, ne használjuk, legalább tanáraink tisztelete miatt. A goto nem tud kiugrani kivételkezelő blokkból és bele se.

procedure FindFirstAnswer; var X, Y, Z, Count: Integer; label FoundAnAnswer; begin Count := SomeConstant; for X := 1 to Count do for Y := 1 to Count do for Z := 1 to Count do if ... { valami igaz az X, Y, Z hármasra } then goto FoundAnAnswer; ... { akkor hajtódik végre, ha nem találjuk meg a választ } Exit; FoundAnAnswer: ... { akkor hajtódik végre, ha megtaláltuk a választ } end;

Strukturált vezérlésátadás

Vészleállás

Blokk utasítás

Begin ... End;

Akkor használjuk, ha pl. elágazás, ciklus, kivételkezelés belsejébe egy utasítás helyett többet szeretnénk írni. Ez a kulcsszópár szerepel továbbá a főprogram és alprogramok törzse körül is, de ott nem hagyhatók el.