Comment renvoyer plusieurs valeurs à partir d'une fonction Delphi

Sur les paramètres de procédure/fonction et les types de retour : Var, Out, Record

Une construction la plus courante dans un Delphes l'application serait une procédure ou une fonction . Connus sous le nom de routines, de procédures ou de fonctions, ce sont des blocs d'instructions que vous appelez à partir de différents emplacements dans un programme.





En termes simples, une procédure est une routine qui ne renvoie pas de valeur alors qu'une fonction renvoie une valeur.

Une valeur de retour d'une fonction est définie par le type de retour. Dans la plupart des cas, vous écririez une fonction pour retourner une seule valeur ce serait un entier, une chaîne, un booléen ou un autre type simple, les types de retour pourraient également être un tableau, une liste de chaînes, une instance d'un objet personnalisé ou similaire.



Notez que même si votre fonction renvoie une liste de chaînes (une collection de cordes ), il renvoie toujours une seule valeur : une instance de la liste de chaînes.

De plus, les routines Delphi peuvent vraiment avoir plusieurs visages : routine, méthode, pointeur de méthode, délégué d'événement, méthode anonyme...



Une fonction peut-elle renvoyer plusieurs valeurs ?

La première réponse qui vient à l'esprit est non, simplement parce que quand on pense à une fonction, on pense à une seule valeur de retour.

Certes, la réponse à la question ci-dessus est, cependant, oui. Une fonction peut retourner plusieurs valeurs. Voyons comment.

Paramètres variables

Combien de valeurs la fonction suivante peut-elle renvoyer, une ou deux ?

|__+_||_+_|

La fonction renvoie évidemment une valeur booléenne (vrai ou faux). Qu'en est-il du deuxième paramètre 'valueOut' déclaré en tant que paramètre 'VAR' (variable) ?



Paramètres var sont passés à la fonction par référence ce qui signifie que si la fonction modifie la valeur du paramètre (une variable dans le bloc de code appelant), la fonction modifiera la valeur de la variable utilisée pour le paramètre.

Pour voir comment fonctionne ce qui précède, voici la mise en œuvre :



|__+_||_+_|
|__+_|
|__+_|
|__+_|
|__+_|

Le 'valueIn' est passé en tant que paramètre constant - la fonction ne peut pas le modifier et il est traité en lecture seule.

Si 'valueIn' ou supérieur à zéro, le paramètre 'valueOut' reçoit la valeur réciproque de 'valueIn' et le résultat de la fonction est vrai. Si valueIn est<= 0 then the function returns false and 'valueOut' is not altered in any way.



Voici l'utilisation :

|__+_||_+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|

Par conséquent, le PositiveReciprocal peut réellement 'retourner' 2 valeurs ! En utilisant les paramètres var, une routine peut renvoyer plusieurs valeurs.



Paramètres de sortie

Il existe une autre façon de spécifier un paramètre par référence, en utilisant le mot-clé 'out', comme dans :

|__+_||_+_|
|__+_|
|__+_|
|__+_|
|__+_|

L'implémentation de PositiveReciprocalOut est la même que dans PositiveReciprocal, il n'y a qu'une seule différence : la 'valueOut' est un paramètre OUT.

Avec des paramètres déclarés comme 'out', la valeur initiale de la variable référencée 'valueOut' est rejetée.

Voici l'utilisation et les résultats :

|__+_||_+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|
|__+_|

Notez que lors du deuxième appel, la valeur de la variable locale 'r' est définie sur '0'. La valeur de 'r' a été définie sur 5 avant l'appel de la fonction, mais puisque le paramètre a été déclaré comme 'out', lorsque 'r' a atteint la fonction, la valeur a été supprimée et la valeur par défaut 'empty' a été définie pour le paramètre (0 pour le type réel).

Par conséquent, vous pouvez envoyer en toute sécurité des variables non initialisées pour les paramètres out, ce que vous ne devriez pas faire avec les paramètres 'var'. Les paramètres sont utilisés pour envoyer quelque chose à la routine, sauf ici avec les paramètres 'out' :), et donc les variables non initialisées (utilisées pour les paramètres VAR) pourraient avoir des valeurs bizarres.

Retourner des disques ?

Les implémentations ci-dessus où une fonction renverrait plus d'une valeur ne sont pas agréables. La fonction renvoie en fait une valeur unique, mais renvoie également, mieux vaut modifier, les valeurs des paramètres var/out.

Pour cette raison, vous souhaiterez peut-être très rarement utiliser des paramètres par référence. Si plus de résultats d'une fonction sont requis, vous pouvez faire en sorte qu'une fonction renvoie unvariable.

Considérer ce qui suit:

|__+_||_+_|
|__+_|
|__+_|
|__+_|
|__+_|

et une fonction hypothétique :

|__+_||_+_|

La fonction WhereAmI renverrait le Latitude et longitudepour une commune donnée (ville, région, ...).

La mise en œuvre serait :

|__+_||_+_|
|__+_|
|__+_|
|__+_|
|__+_|

Et ici nous avons une fonction renvoyant 2 valeurs réelles. Ok, il renvoie 1 enregistrement, mais cet enregistrement a 2 champs. Notez que vous pouvez avoir un enregistrement très complexe mélangeant différents types à renvoyer à la suite d'une fonction.

C'est ça. Par conséquent, oui, les fonctions Delphi peuvent renvoyer plusieurs valeurs.