So geben Sie mehrere Werte aus einer Delphi-Funktion zurück
Ein Prozedur-/Funktionsparameter und Rückgabetypen: Var, Out, Record
Ein häufigstes Konstrukt in a Delphi Anwendung wäre a Prozedur oder eine Funktion . Bekannt als Routinen, Prozeduren oder Funktionen sind Anweisungsblöcke, die Sie von verschiedenen Stellen in einem Programm aufrufen.
Einfach ausgedrückt ist eine Prozedur eine Routine, die keinen Wert zurückgibt, während eine Funktion einen Wert zurückgibt.
Ein Rückgabewert einer Funktion wird durch den Rückgabetyp definiert. In den meisten Fällen würden Sie eine Funktion schreiben gibt einen einzelnen Wert zurück das wäre eine Ganzzahl, ein String, ein boolescher Wert oder ein anderer einfacher Typ, auch Rückgabetypen könnten ein Array, eine Stringliste, eine Instanz eines benutzerdefinierten Objekts oder ähnliches sein.
Beachten Sie, dass selbst wenn Ihre Funktion eine Zeichenfolgenliste (eine Sammlung von Saiten ) gibt es immer noch einen einzelnen Wert zurück: eine Instanz der Zeichenfolgenliste.
Darüber hinaus können Delphi-Routinen wirklich viele Gesichter haben: Routine, Methode, Methodenzeiger, Ereignisdelegierter, anonyme Methode ...
Kann eine Funktion mehrere Werte zurückgeben?
Die erste Antwort, die mir in den Sinn kommt, ist nein, einfach weil wir an einen einzelnen Rückgabewert denken, wenn wir an eine Funktion denken.
Sicherlich lautet die Antwort auf die obige Frage jedoch ja. Eine Funktion kann mehrere Werte zurückgeben. Mal sehen wie.
Var-Parameter
Wie viele Werte kann die folgende Funktion zurückgeben, einen oder zwei?
|_+_||_+_|Die Funktion gibt offensichtlich einen booleschen Wert zurück (true oder false). Wie wäre es mit dem zweiten Parameter „valueOut“, der als „VAR“-Parameter (Variable) deklariert ist?
Var-Parameter werden an die Funktion übergeben per Referenz Das heißt, wenn die Funktion den Wert des Parameters ändert – eine Variable im aufrufenden Codeblock –, ändert die Funktion den Wert der Variablen, die für den Parameter verwendet wird.
Um zu sehen, wie das obige funktioniert, hier ist die Implementierung:
|_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
„valueIn“ wird als konstanter Parameter übergeben – die Funktion kann ihn nicht ändern und wird als schreibgeschützt behandelt.
Wenn 'valueIn' oder größer Null ist, wird dem Parameter 'valueOut' der reziproke Wert von 'valueIn' zugewiesen und das Ergebnis der Funktion ist wahr. Wenn valueIn ist<= 0 then the function returns false and 'valueOut' is not altered in any way.
Hier ist die Verwendung:
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
Daher kann der PositiveReciprocal tatsächlich 2 Werte zurückgeben! Mit var-Parametern können Sie eine Routine veranlassen, mehr als einen Wert zurückzugeben.
Out-Parameter
Es gibt eine andere Möglichkeit, einen Referenzparameter anzugeben – mit dem Schlüsselwort „out“, wie in:
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
Die Implementierung von PositiveReciprocalOut ist dieselbe wie in PositiveReciprocal, es gibt nur einen Unterschied: „valueOut“ ist ein OUT-Parameter.
Bei als 'out' deklarierten Parametern wird der Initialwert der referenzierten Variablen 'valueOut' verworfen.
Hier ist die Verwendung und die Ergebnisse:
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
|_+_|
Beachten Sie, dass beim zweiten Aufruf der Wert der lokalen Variablen 'r' auf '0' gesetzt wird. Der Wert von „r“ wurde vor dem Funktionsaufruf auf 5 gesetzt, aber da der Parameter als „out“ deklariert wurde, wurde der Wert verworfen, als „r“ die Funktion erreichte, und der standardmäßige „leere“ Wert für den Parameter (0 für echten Typ).
Infolgedessen können Sie sicher nicht initialisierte Variablen für out-Parameter senden – etwas, das Sie mit 'var'-Parametern nicht tun sollten. Parameter werden verwendet, um etwas an die Routine zu senden, außer hier mit 'out'-Parametern :), und daher könnten nicht initialisierte Variablen (die für VAR-Parameter verwendet werden) seltsame Werte haben.
Datensätze zurückgeben?
Die obigen Implementierungen, bei denen eine Funktion mehr als einen Wert zurückgeben würde, sind nicht schön. Die Funktion gibt tatsächlich einen einzelnen Wert zurück, gibt aber auch die Werte der var/out-Parameter zurück, besser gesagt ändert sie.
Aus diesem Grund möchten Sie möglicherweise sehr selten Referenzparameter verwenden. Wenn mehr Ergebnisse von einer Funktion benötigt werden, können Sie eine Funktion a zurückgeben lassenFolgendes berücksichtigen:
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
und eine hypothetische Funktion:
|_+_||_+_|Die Funktion WhereAmI würde die zurückgeben Breiten-und Längengradfür eine bestimmte Stadt (Stadt, Gebiet, ...).
Die Umsetzung wäre:
|_+_||_+_||_+_|
|_+_|
|_+_|
|_+_|
Und hier haben wir eine Funktion, die 2 reelle Werte zurückgibt. Ok, es gibt 1 Datensatz zurück, aber dieser Datensatz hat 2 Felder. Beachten Sie, dass Sie einen sehr komplexen Datensatz haben können, der verschiedene Typen mischt, die als Ergebnis einer Funktion zurückgegeben werden sollen.
Das ist es. Daher können Delphi-Funktionen mehrere Werte zurückgeben.