Nejběžnější konstrukt v a Delphi aplikace by byla postup nebo funkce. Známé jako rutiny, procedury nebo funkce jsou bloky příkazů, které voláte z různých umístění v programu.
Jednoduše řečeno procedura je rutina, která nevrací hodnotu, zatímco funkce vrací hodnotu.
Návratová hodnota z funkce je definována typem návratu. Ve většině případů byste funkci napsali vrátit jednu hodnotu to by bylo celé číslo, řetězec, boolean nebo nějaký jiný jednoduchý typ, také návratové typy by mohly být pole, seznam řetězců, instance vlastního objektu nebo podobně.
Všimněte si, že i když vaše funkce vrací seznam řetězců (kolekce řetězce) stále vrací jednu hodnotu: jedna instance seznamu řetězců.
Dále mohou rutiny Delphi opravdu mít mnoho tváří: Rutina, Metoda, Ukazatel metody, Delegát události, Anonymní metoda ...
Může funkce vrátit více hodnot?
První odpověď, která přijde na mysl, je ne, jednoduše proto, že když myslíme na nějakou funkci, myslíme na jedinou návratovou hodnotu.
Odpověď na výše uvedenou otázku je však samozřejmě ano. Funkce může vrátit několik hodnot. Uvidíme jak.
Var Parametry
Kolik hodnot může následující funkce vrátit, jednu nebo dvě?
funkce PositiveReciprocal (konst valueIn: celé číslo; var valueOut: real): boolean;
Funkce zjevně vrací booleovskou hodnotu (true nebo false). A co druhý parametr "valueOut" deklarovaný jako "VAR" (variabilní) parametr?
Var parametry jsou předány funkci Odkazem což znamená, že pokud funkce změní hodnotu parametru - proměnné ve volajícím bloku kódu - funkce změní hodnotu proměnné použité pro parametr.
Chcete-li vidět, jak výše uvedené funguje, je zde implementace:
funkce PositiveReciprocal (konst valueIn: celé číslo; var valueOut: real): boolean;
začít
výsledek: = valueIn> 0;
-li výsledek pak valueOut: = 1 / valueIn;
konec;
"ValueIn" je předán jako konstantní parametr - funkce jej nemůže změnit a je považována za čtení.
Pokud je hodnota „valueIn“ nebo větší než nula, je parametru „valueOut“ přiřazena reciproční hodnota „valueIn“ a výsledek funkce je pravdivý. Pokud valueIn je <= 0, pak funkce vrací false a "valueOut" se žádným způsobem nezmění.
Zde je využití:
var
b: boolean;
r: skutečný;
začít
r: = 5;
b: = PositiveReciprocal (1, r);
//here:
// b = true (od 1> = 0)
// r = 0,2 (1/5)
r: = 5;
b: = PositiveReciprocal (-1, r);
//here:
// b = false (od -1
konec;
PositiveReciprocal tedy může „vrátit“ 2 hodnoty! Pomocí parametrů var můžete rutinu vrátit více než jednu hodnotu.
Out Parametry
Existuje další způsob, jak určit parametr vedlejší reference - pomocí klíčového slova „out“, jako v:
funkce PositiveReciprocalOut (konst valueIn: celé číslo; ven valueOut: real): boolean;
začít
výsledek: = valueIn> 0;
-li výsledek pak valueOut: = 1 / valueIn;
konec;
Implementace PositiveReciprocalOut je stejná jako v PositiveReciprocal, existuje pouze jeden rozdíl: „valueOut“ je OUT parametr.
U parametrů deklarovaných jako „out“ je počáteční hodnota odkazované proměnné „valueOut“ zahozena.
Zde je využití a výsledky:
var
b: boolean;
r: skutečný;
začít
r: = 5;
b: = PositiveReciprocalOut (1, r);
//here:
// b = true (od 1> = 0)
// r = 0,2 (1/5)
r: = 5;
b: = PositiveReciprocalOut (-1, r);
//here:
// b = false (od -1
konec;
Všimněte si, jak je při druhém volání hodnota místní proměnné "r" nastavena na "0". Hodnota "r" byla před voláním funkce nastavena na 5, ale protože parametr byl deklarován jako "out", když "r" dosáhl funkce, byla hodnota vyřazena a pro parametr byla nastavena výchozí „prázdná“ hodnota (0 pro skutečnou hodnotu) typ).
Díky tomu můžete bezpečně odesílat neinicializované proměnné pro parametry out - něco, co byste neměli dělat s parametry „var“. Parametry se používají k odeslání něco do rutiny, s výjimkou zde s parametry „out“ :), a proto by neinicializované proměnné (používané pro parametry VAR) mohly mít podivné hodnoty.
Vracení záznamů?
Výše uvedené implementace, kde by funkce vrátila více než jednu hodnotu, nejsou hezké. Funkce ve skutečnosti vrací jedinou hodnotu, ale také vrací, lépe řečeno, mění hodnoty parametrů var / out.
Z tohoto důvodu můžete velmi zřídka chtít použít parametry vedlejší reference. Pokud je vyžadováno více výsledků z funkce, můžete nechat funkci vrátit a typ záznamu proměnná.
Zvažte následující:
typ
TLatitudeLongitude = záznam
Zeměpisná šířka: skutečná;
Zeměpisná délka: skutečná;
konec;
a hypotetická funkce:
funkce Kde jsem(konst townName: tětiva): TLatitudeLongitude;
Funkce WhereAmI by vrátila Zeměpisná šířka a zeměpisná délka pro dané město (město, oblast, ...).
Implementace by byla:
funkce Kde jsem(konst townName: tětiva): TLatitudeLongitude;
začít// pomocí nějaké služby vyhledejte "townName", pak přiřaďte výsledek funkce:
výsledek. Zeměpisná šířka: = 45,54;
výsledek. Zeměpisná délka: = 18,71;
konec;
A zde máme funkci, která vrací 2 skutečné hodnoty. Ok, vrátí 1 záznam, ale tento záznam má 2 pole. Všimněte si, že můžete mít velmi složitý záznam, který mísí různé typy, které mají být vráceny v důsledku funkce.
A je to. Proto ano, funkce Delphi mohou vracet více hodnot.