O construcție cea mai comună într-o aplicație Delphi ar fi o procedură sau o funcție. Cunoscute ca rutine, proceduri sau funcții sunt blocuri de declarații pe care le apelați din diferite locații dintr-un program.
Pur și simplu a pune o procedură este o rutină care nu returnează o valoare în timp ce o funcție returnează o valoare.
O valoare returnată dintr-o funcție este definită de tipul returnării. În cele mai multe cazuri, ai scrie o funcție returnează o singură valoare care ar fi un număr întreg, șir, boolean sau alt tip simplu, de asemenea, tipurile de retur ar putea fi un tablou, o listă de șiruri, o instanță a unui obiect personalizat sau similar.
Rețineți că, chiar dacă funcția dvs. returnează o listă de șiruri (o colecție de șiruri), aceasta returnează în continuare o singură valoare: o instanță a listei șir.
Mai mult, rutinele Delphi pot avea cu adevărat multe fețe: rutină, metodă, pointer metodă, delegat eveniment, metodă anonimă ...
Primul răspuns care îmi vine în minte este nu, pur și simplu pentru că atunci când ne gândim la o funcție, ne gândim la o singură valoare de retur.
Cu siguranță, răspunsul la întrebarea de mai sus este, totuși, da. O funcție poate returna mai multe valori. Să vedem cum.
Câte valori pot reveni următoarele funcții, una sau două?
funcţie PositiveReciprocal (const valueIn: număr întreg; var valueOut: real): boolean;
Funcția returnează evident o valoare booleană (adevărată sau falsă). Ce zici de al doilea parametru „valueOut” declarat ca parametru „VAR” (variabil)?
Parametri Var sunt trecute la funcție de referință ceea ce înseamnă că, dacă funcția schimbă valoarea parametrului - o variabilă din blocul de apelare a codului - funcția va modifica valoarea variabilei utilizate pentru parametru.
Pentru a vedea cum funcționează mai sus, iată implementarea:
funcţie PositiveReciprocal (const valueIn: număr întreg; var valueOut: real): boolean;
începe
rezultat: = valoareIn> 0;
dacă rezultat apoi valueOut: = 1 / valueIn;
Sfârșit;
„ValueIn” este transmis ca o funcție de parametru constantă nu o poate modifica și este tratată doar în citire.
Dacă „valueIn” sau mai mare de zero, parametrului „valueOut” i se atribuie valoarea reciprocă a „valueIn”, iar rezultatul funcției este adevărat. Dacă valoareaIn este <= 0 then the function returns false and "valueOut" is not altered in any way.
Iată utilizarea:
var
b: boolean;
r: real;
începe
r: = 5;
b: = PositiveReciprocal (1, r);
//aici:
// b = true (de la 1> = 0)
// r = 0,2 (1/5)
r: = 5;
b: = PositiveReciprocal (-1, r);
//aici:
// b = fals (din -1
Sfârșit;
Prin urmare, pozitivReciprocal poate „returna” 2 valori! Folosind parametrii var puteți obține un randament de rutină mai mult de o valoare.
Există un alt mod de a specifica un parametru de referință folosind cuvântul cheie „afară”, ca în:
funcţie PositiveReciprocalOut (const valueIn: număr întreg; afară valueOut: real): boolean;
începe
rezultat: = valoareIn> 0;
dacă rezultat apoi valueOut: = 1 / valueIn;
Sfârșit;
Implementarea PositiveReciprocalOut este aceeași ca în PositiveReciprocal, există o singură diferență: „valueOut” este un parametru OUT.
Cu parametrii declarați „ieșiți”, valoarea inițială a variabilei referite „valueOut” este aruncată.
Iată utilizarea și rezultatele:
var
b: boolean;
r: real;
începe
r: = 5;
b: = PositiveReciprocalOut (1, r);
//aici:
// b = true (de la 1> = 0)
// r = 0,2 (1/5)
r: = 5;
b: = PositiveReciprocalOut (-1, r);
//aici:
// b = fals (din -1
Sfârșit;
Rețineți cum, în al doilea apel, valoarea variabilei locale „r” este setată la „0”. Valoarea „r” a fost setată la 5 înainte de apelul funcției, dar din moment ce parametrul din „declarat” a fost declarat „afară”, când „r” a ajuns la funcție, valoarea a fost aruncată și valoarea implicită „goală” a fost setată pentru parametru (0 pentru tipul real).
Drept urmare, puteți trimite în siguranță variabile neinițializate pentru parametri out - ceva ce nu ar trebui să faceți cu parametrii „var”. Parametrii sunt folosiți pentru a trimite ceva la rutină, cu excepția celor de aici cu parametrii „out” :) și, prin urmare, variabilele neinicializate (utilizate pentru parametrii VAR) ar putea avea valori ciudate.
Implementările de mai sus, unde o funcție ar reveni mai mult de o valoare, nu sunt frumoase. Funcția returnează de fapt o singură valoare, dar, de asemenea, returnează, mai bine spus, modifică valorile parametrilor var / out.
Din această cauză, poate foarte rar doriți să utilizați parametrii de referință. Dacă sunt necesare mai multe rezultate dintr-o funcție, puteți avea o returnare a funcției o variabilă de tip record.
Luați în considerare următoarele:
tip
TLatitudeLongitude = record
Latitudine: real;
Longitudine: real;
Sfârșit;
și o funcție ipotetică:
funcţie Unde sunt(const Nume oraș: şir): TLatitudeLongitude;
Funcția WhereAmI ar returna Latitudinea și Longitudinea pentru un anumit oraș (oraș, zonă, ...).
Implementarea ar fi:
funcţie Unde sunt(const townName: şir): TLatitudeLongitude;
începe// folosiți un serviciu pentru a localiza „townName”, apoi atribuiți rezultatul funcției:
rezultat.Latitudine: = 45,54;
rezultat.Lungimea: = 18,71;
Sfârșit;
Și aici avem o funcție care returnează 2 valori reale. Ok, se întoarce 1 înregistrare, dar această înregistrare are 2 câmpuri. Rețineți că puteți avea o înregistrare foarte complexă amestecând diferite tipuri care trebuie returnate ca urmare a unei funcții.
Asta e. Prin urmare, da, funcțiile Delphi pot returna mai multe valori.