En mest vanlig konstruksjon i Delphi søknad ville være en prosedyre eller en funksjon. Kjent som rutiner, prosedyrer eller funksjoner er uttalelsesblokker du ringer fra forskjellige steder i et program.
Enkelt sagt er en prosedyre en rutine som ikke returnerer en verdi mens en funksjon returnerer en verdi.
En returverdi fra en funksjon er definert av returtypen. I de fleste tilfeller vil du skrive en funksjon til returnere en enkelt verdi det ville være et heltall, streng, boolsk eller en annen enkel type, også returtyper kan være en matrise, en strengliste, en forekomst av et tilpasset objekt eller likt.
Legg merke til at selv om funksjonen returnerer en strengliste (en samling av strenger) returnerer det fortsatt en enkelt verdi: en forekomst av strenglisten.
Videre kan Delphi-rutiner virkelig ha mange ansikter: Rutine, Method, Method Pointer, Event Delegate, Anonymous method ...
Kan en funksjon returnere flere verdier?
Det første svaret som kommer til tankene er nei, ganske enkelt fordi vi tenker på en enkelt returverdi når vi tenker på en funksjon.
Gjerne svaret på spørsmålet ovenfor er imidlertid ja. En funksjon kan returnere flere verdier. La oss se hvordan.
Var Parametre
Hvor mange verdier kan følgende funksjon returnere, en eller to?
funksjon PositiveReciprocal (konst verdiIn: heltall; Var verdiOut: ekte): boolsk;
Funksjonen returnerer tydeligvis en boolesk verdi (sann eller usann). Hva med den andre parameteren "valueOut" erklært som en "VAR" (variabel) parameter?
Var parametere overføres til funksjonen ved referanse noe som betyr at hvis funksjonen endrer verdien til parameteren - en variabel i koden blokkering av kode - vil funksjonen endre verdien på variabelen som brukes for parameteren.
For å se hvordan ovenstående fungerer, er implementeringen:
funksjon PositiveReciprocal (konst verdiIn: heltall; Var verdiOut: ekte): boolsk;
begynne
resultat: = verdiIn> 0;
hvis resultat deretter verdiOut: = 1 / verdiIn;
slutt;
"ValueIn" sendes som en konstant parameter - funksjonen kan ikke endre den, og den blir behandlet som skrivebeskyttet.
Hvis "valueIn" eller større enn null, tildeles parameteren "valueOut" den gjensidige verdien til "valueIn", og resultatet av funksjonen er sant. Hvis valueIn er <= 0, returnerer funksjonen falsk og "valueOut" blir ikke endret på noen måte.
Her er bruken:
Var
b: boolsk;
r: ekte;
begynne
r: = 5;
b: = PositiveReciprocal (1, r);
//here:
// b = sant (siden 1> = 0)
// r = 0,2 (1/5)
r: = 5;
b: = PositiveReciprocal (-1, r);
//here:
// b = usant (siden -1
slutt;
Derfor kan PositiveReciprocal faktisk "returnere" 2 verdier! Ved å bruke varparametere kan du ha rutinemessig mer enn én verdi.
Ut-parametere
Det er en annen måte å spesifisere en referanse-parameter - ved å bruke "ut" -nøkkelordet, som i:
funksjon PositiveReciprocalOut (konst verdiIn: heltall; ute verdiOut: ekte): boolsk;
begynne
resultat: = verdiIn> 0;
hvis resultat deretter verdiOut: = 1 / verdiIn;
slutt;
Implementeringen av PositiveReciprocalOut er den samme som i PositiveReciprocal, det er bare en forskjell: "valueOut" er en OUT-parameter.
Med parametere som er erklært som "ut", blir den opprinnelige verdien til den refererte variabelen "valueOut" kastet.
Her er bruken og resultatene:
Var
b: boolsk;
r: ekte;
begynne
r: = 5;
b: = PositiveReciprocalOut (1, r);
//here:
// b = sant (siden 1> = 0)
// r = 0,2 (1/5)
r: = 5;
b: = PositiveReciprocalOut (-1, r);
//here:
// b = usant (siden -1
slutt;
Legg merke til hvordan i det andre anropet verdien av den lokale variabelen "r" er satt til "0". Verdien av "r" ble satt til 5 før funksjonsanropet, men siden parameteren er erklært som "ut", når "r" nådde funksjonen verdien ble forkastet og standard "tom" verdi ble satt for parameteren (0 for real type).
Som et resultat kan du trygt sende uinitialiserte variabler for ut-parametere - noe du ikke bør gjøre med "var" -parametere. Parametere brukes til å sende noe til rutinen, bortsett fra her med "ut" -parametere :), og derfor kan uinitierte variabler (brukt for VAR-parametere) ha rare verdier.
Returnerer poster?
Ovennevnte implementeringer der en funksjon vil returnere mer enn en verdi, er ikke hyggelig. Funksjonen returnerer faktisk en enkelt verdi, men returnerer også, bedre å si endrer, verdiene til var / ut-parametrene.
På grunn av dette kan det hende du sjelden ønsker å bruke by-referanseparametere. Hvis det kreves flere resultater fra en funksjon, kan du få en funksjonsretur a posttype variabel.
Vurder følgende:
type
TLatitudeLongitude = ta opp
Bredde: ekte;
Lengdegrad: ekte;
slutt;
og en hypotetisk funksjon:
funksjon Hvor er jeg(konst townName: string): TLatitudeLongitude;
Funksjonen WhereAmI vil returnere Breddegrad og lengdegrad for en gitt by (by, område, ...).
Gjennomføringen vil være:
funksjon Hvor er jeg(konst townName: string): TLatitudeLongitude;
begynne// bruk noen tjenester for å finne "bynavn", og tilordn deretter funksjonsresultat:
resultat. Bredde: = 45,54;
resultat. Lengdegrad: = 18,71;
slutt;
Og her har vi en funksjon som returnerer 2 reelle verdier. OK, den gir tilbake en post, men denne posten har 2 felt. Merk at du kan ha en veldig kompleks post som blander forskjellige typer som skal returneres som et resultat av en funksjon.
Det er det. Derfor, ja, Delphi-funksjoner kan returnere flere verdier.