Naučte se programovat v Delphi (7. díl) - Řízení toku programu - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Delphi

Naučte se programovat v Delphi (7. díl) - Řízení toku programu

24. září 2001, 00.00 | V dnešním článku se budu věnovat řízení toku programu. Podmínkám, cyklům apod. Také si vytvoříme pár pokusných prográmků, na kterých si vyzkoušíme probranou látku.

Úvodem

    Podkapitolu Úvodem jsem zavedl poprvé v tomto seriálu. Zavedl jsem ji proto, že bych se chtěl zmínit o distribucích Delphi. Někteří čtenáři mě bombardují maily, ve kterých se ptají na jedinné: "Kde sehnat Delphi?". Myslím si, že pro začátečníky nemá smysl kupovat hned ostrou verzi. Doporučoval bych trial verzi Delphi 5, která je zdarma a je funkční tři měsíce. Tato trial verze se dá sehnat třeba na serveru www.vypalcd.cz za 109 Kč (prosím, neberte to jako reklamu). Tuto možnost doporučuji zejména modemistům. Další možnost je stáhnout si Delphi 6 Personal Edition ze stránky ftpd.borland.com/download/delphi/personal/BorlandDelphiPersonalEdition.exe, které je distribuováno jako freeware. I tato verze je k mání na serveru Vypalcd.cz.  

Podmínky

    K řízení toku programu se používají podmínky a cykly.

    Podmínka je nejčastějším použitím řízení toku programu. V Object Pascalu máme tři typy podmínek. První, jakási základní podmínka je if...then. Dalo by se to přeložit jako když...tak.

if booleovský_výraz then příkaz;

    If bere za argument booleovský výraz. Když je booleovský výraz true, tak se vykoná příkaz nebo blok příkazů za klíčovým slovem then. Možnosti argunentů ukazuje následující tabulka.

if i=1 then ShowMessage('Hodnota proměnné i je 1');
if MainForm.Visible then ('Formulář MainForm je viditelný');
if Edit1.Text=('') then ('Editovací políčko Edit1 je prázdné');

    Velmi často se vyhodnocuje i několik výrazů pro splnění dané podmínky. K tomu se používají operátory OR, AND a XOR, které jsou popsány v předchozím díle seriálu. Další tabulka uvádí příklad použítí podmínky if...then s více argumenty.

if (i=1) AND (b=2) AND (MainForm.Visible) then ShowMessage('Podmínka byla splněna');

    Všimněte si závorek, ve kterých jsou všechny argumenty uzavřeny. Kdybychom nezávorkovali, tak by nám kompilátor oznámil chybu Operator not applicable to this operand type. V příkladu byla použita fce ShowMessage(), která zobrazí dialogové okno s proměnnou typu string, kterou jsme mu předali.

    Další typ podmínky je téměř shodný s předchozím typem, ale je rozšířen o nepovinou klauzuli else. Tato klauzule funguje tak, že když není splněna podmínka, tak jsou vykonány příkazy za klíčovým slovem else. Demonstraci použití najdete v následující tabulce.

if (i=1) then ShowMessage('Podmínka byla splněna') else ShowMessage('Podmínka nebyla splněna');

    A nakonec poslední typ podmínky je příkaz case. Tato podmínka je vlastně složení několika podmínek v jedné. Výhoda case spočívá v tom, že když chcete porovnat proměnnou s několika hodnotami, tak se nemusíte piplat se všemi těmi if, then a else.

...
var i:Integer;
begin
  // příkazy
  case i of
  1 : ShowMessage('Hodnota proměnné i je 1');
  2 : ShowMessage('Hodnota proměnné i je 2');
  3 : ShowMessage('Hodnota proměnné i je 3');
  4 : ShowMessage('Hodnota proměnné i je 4');
  5 : ShowMessage('Hodnota proměnné i je 5');
  else ShowMessage('Hodnota proměnné i je jiná než 1, 2, 3, 4 a 5');
end;
...

    Někdy je výhodnější použít první nebo druhý způsob podmínky a jindy zase ten třetí.

Cykly

    Dalším způsobem řízení toku programu je použití cyklů. V Object Pascalu máme na výběr z těchto cyklů: For, Repeat a While. Cykly slouži k opakovanému provádění příkazů.

For

    Často nastane situace, kdy potřebujete provést určitý příkaz třeba 20 krát. Samozřejmě, že byste mohli napsat jeden příkaz dvacetkrát, ale co kdybyste ho chtěli provést 1000 krát? Bylo by namáhavé psát příkaz 1000 krát, i kdybyste použili clipboard. Proto je tu cyklus for. Formální deklarace vypadá takto:

for proměnná:=počáteční_hodnota to konečná_hodnota do příkaz;

    Jako praktický příklad využití si vytvoříme aplikaci, která při stisku tlačítka "napočítá" do tisíce. Pojem napočítá má vyjadřovat to, že program zobrazí všechny po sobě jdoucí číslice od 0 do 1000 jako vlastnost caption u komponenty Label. Bude to velmi jednoduchá ukázka, tak v ní nehledejte žádný skrytý smysl. Vytvoříme si nový projekt a na hlavní formulář si přidáme jedno tlačítko a jednu komponentu Label. Nemusíme si je nijak zvlášť pojmenovávat, protože se ve jménech komponent určitě neztratíme:-). Celý příklad vlastně závisí na obsluze události OnClick tlačítka Button1.

procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
begin
  for i:=0 to 1000 do
    begin
      Application.ProcessMessages;
      Label1.Caption:=IntToStr(i);
    end;
end;

    Form.gif (3949 bytes)

    Volání Application.ProcessMessages uvolní řízení pro zpracovávání událostí myši a klávesnice a pro další programy, které zrovna běží a spotřebovávají procesorový čas. Bez tohoto příkazu by náš příklad pouze zobrazil koncové číslo a ne všechna čísla.

Repeat

    Cyklus repeat je takový cyklus, ve kterém se provádějí příkazy, dokud není splněna podmínka. Formální deklarace má tvar:

Repeat
  Příkaz_nebo_blok_příkazů;
Until Booleovský_výraz;

    Jinak řečeno, příkazy nebo blok příkazů za repeat se provádí tak dlouho, dokud výraz za until není roven true. I pro cyklus repeat si vytvoříme pokusný program, kterým si demonstrujeme použití repeat v praxi. Pro další příklad můžeme použít předchozí projekt, jen upravíme obsluhu události OnClick tlačítka Button1.

procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
begin
  i:=0;
repeat
    inc(i);
    Label1.Caption:=IntToStr(i);
    Application.ProcessMessages;
until
    i=1000;
end;

    Tento program má vlatně stejnou funkci jako příklad s cyklem for, napočítá do tisíce. V tomto případě je možná jednoduší použít cyklus for, ale v jiných případech muže být zase na místě použití repeat.

While

    Třetím cyklem, který Object Pascal nabízí je cyklus while. Tento cyklus se skláda opět z podmínky a bloku příkazů, podobně jako repeat, ale s tím rozdílem, že u while se nejdříve testuje, zda je výraz za while roven true a pak se vykonávají příkazy. Formální deklarace výpadá následovně:

While Booleovský_výraz do
  Příkaz_nebo_blok_příkazů;

    Zásadní rozdíl mezi repeat a while je, že u cyklu repeat se příkazy provedou minimálně jednou, ale u while se nemusejí provést vůbec. Opět si vytvoříme pokusný prográmek na demonstraci použití cyklu while v praxi. Můžeme použít předchozí projekt jen změníme obsluhu události OnClick tlačítka Button1.

procedure TForm1.Button1Click(Sender: TObject);
var i:Integer;
begin
  i:=0;
  while (i<=1000) do
    begin
      Application.ProcessMessages;
      label1.Caption:=IntToStr(i);
      Inc(i);
  end;
end;

Řízení cyklů

    K řízení cyklů se používají přikazy break a continue. Sice bychom se bez nich mohli při běžném programování klidně obejít, ale i přesto bych se o nich rád zmínil. Tyto příkazy mají společné to, že všechny příkazy, které po nich následují, nebudou provedeny. I přes tuto skutečnost jsou rozdílné. Příkaz break ukončí celý cyklus a continue jen aktuální průchod.

...
for i:=0 to 5 do
  begin
    if i=2 then break;
    Label1.Caption:=IntToStr(i);
  end;
...

    Jako vlastnost Caption u komponenty Label1 se zobrazí 1, protože při třetím průchodu se příkazem break cyklus ukončí.

...
for i:=0 to 5 do
  begin
    if i=2 then continue;
    Label1.Caption:=IntToStr(i);
  end;
...

    U tohoto příkladu se zobrazují číslice od 0 do 5, ale číslice 2 se nezobrazí protože třetí průchod byl příkazem continue ukončen.

Příště

    V příštím díle si  povíme o typech a záznamech.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: