En mest almindelig konstruktion i en Delphi ansøgning ville være en procedure eller en funktion. Kendt som rutiner, procedurer eller funktioner er erklæringsblokke, du kalder fra forskellige placeringer i et program.
Enkelt sagt er en procedure en rutine, der ikke returnerer en værdi, mens en funktion returnerer en værdi.
En returværdi fra en funktion defineres af returtypen. I de fleste tilfælde skriver du en funktion til returnere en enkelt værdi det ville være et heltal, streng, boolsk eller en anden simpelt type, også returtyper kan være en matrix, en strengliste, en forekomst af et brugerdefineret objekt eller ens.
Bemærk, at selv hvis din funktion returnerer en strengeliste (en samling af strygere) det returnerer stadig en enkelt værdi: en forekomst af strenglisten.
Desuden kan Delphi-rutiner virkelig have mange ansigter: rutine, metode, metode-pointer, begivenhedsdelegat, anonym metode ...
Kan en funktion returnere flere værdier?
Det første svar, der kommer til at tænke på, er nej, blot fordi vi tænker på en funktion, når vi tænker på en funktion.
Naturligvis er svaret på ovenstående spørgsmål imidlertid ja. En funktion kan returnere flere værdier. Lad os se hvordan.
Var Parametre
Hvor mange værdier kan følgende funktion returnere, en eller to?
fungere PositiveReciprocal (const valueIn: heltal; Var valueOut: real): boolsk;
Funktionen returnerer selvfølgelig en boolesk værdi (sand eller falsk). Hvad med den anden parameter "valueOut" erklæret som en "VAR" (variabel) parameter?
Var parametre overføres til funktionen ved henvisning hvilket betyder, at hvis funktionen ændrer værdien af parameteren - en variabel i den kaldende blok af kode - ændrer funktionen værdien af den variabel, der bruges til parameteren.
Her er implementeringen for at se, hvordan ovenstående fungerer:
fungere PositiveReciprocal (const valueIn: heltal; Var valueOut: real): boolsk;
begynde
resultat: = valueIn> 0;
hvis resultat derefter valueOut: = 1 / valueIn;
ende;
"ValueIn" sendes som en konstant parameter - funktionen kan ikke ændre den, og den behandles som skrivebeskyttet.
Hvis "valueIn" eller større end nul, tildeles parameteren "valueOut" den gensidige værdi af "valueIn", og resultatet af funktionen er sandt. Hvis valueIn er <= 0, returnerer funktionen falsk, og "valueOut" ændres ikke på nogen måde.
Her er brugen:
Var
b: boolsk;
r: reel;
begynde
r: = 5;
b: = PositiveReciprocal (1, r);
//here:
// b = sandt (siden 1> = 0)
// r = 0,2 (1/5)
r: = 5;
b: = PositiveReciprocal (-1, r);
//here:
// b = falsk (siden -1
ende;
Derfor kan PositiveReciprocal faktisk "returnere" 2 værdier! Ved at bruge varparametre kan du få mere end en værdi rutinemæssigt tilbage.
Ud parametre
Der er en anden måde at specificere en parameter til ved henvisning - ved hjælp af "ud" -søgeordet, som i:
fungere PositiveReciprocalOut (const valueIn: heltal; ud valueOut: real): boolsk;
begynde
resultat: = valueIn> 0;
hvis resultat derefter valueOut: = 1 / valueIn;
ende;
Implementeringen af PositiveReciprocalOut er den samme som i PositiveReciprocal, der er kun en forskel: "valueOut" er en OUT-parameter.
Med parametre, der er erklæret som "ud", kasseres den oprindelige værdi af den refererede variabel "valueOut".
Her er brugen og resultaterne:
Var
b: boolsk;
r: reel;
begynde
r: = 5;
b: = PositiveReciprocalOut (1, r);
//here:
// b = sandt (siden 1> = 0)
// r = 0,2 (1/5)
r: = 5;
b: = PositiveReciprocalOut (-1, r);
//here:
// b = falsk (siden -1
ende;
Bemærk, hvordan værdien af den lokale variabel "r" i det andet opkald er indstillet til "0". Værdien af "r" blev indstillet til 5 før funktionsopkaldet, men da parameteren er erklæret "ud", når "r" nåede den funktion, værdien blev kasseret, og standard "tom" værdi blev indstillet til parameteren (0 for real type).
Som et resultat kan du med sikkerhed sende uinitialiserede variabler til ud-parametre - noget du ikke skal gøre med "var" -parametre. Parametre bruges til at sende noget til rutinen, undtagen her med "ud" -parametre :), og derfor kan uinitialiserede variabler (brugt til VAR-parametre) have underlige værdier.
Vender tilbage poster?
Ovenstående implementeringer, hvor en funktion ville returnere mere end en værdi, er ikke pæne. Funktionen returnerer faktisk en enkelt værdi, men returnerer også, bedre at sige ændringer, værdierne for var / out-parametrene.
På grund af dette kan du meget sjældent ønske at bruge by-reference parametre. Hvis der kræves flere resultater fra en funktion, kan du få en funktionsretur a posttype variabel.
Overvej følgende:
type
TLatitudeLongitude = optage
Breddegrad: reel;
Længdegrad: reel;
ende;
og en hypotetisk funktion:
fungere Hvor er jeg(const townName: snor): TLatitudeLongitude;
Funktionen WhereAmI vil returnere Breddegrad og længdegrad for en given by (by, område, ...).
Implementeringen ville være:
fungere Hvor er jeg(const townName: snor): TLatitudeLongitude;
begynde// Brug en eller anden service til at finde "bynavn", og tildel derefter funktionens resultat:
resultat. Breddegrad: = 45,54;
resultat. Længdegrad: = 18,71;
ende;
Og her har vi en funktion, der returnerer 2 reelle værdier. Ok, den returnerer 1 post, men denne post har 2 felter. Bemærk, at du kan have en meget kompleks registrering, der blander forskellige typer, der skal returneres som et resultat af en funktion.
Det er det. Derfor, ja, Delphi-funktioner kan returnere flere værdier.