So geben Sie mehrere Werte von einer Delphi-Funktion zurück

Ein am häufigsten vorkommendes Konstrukt in a Delphi Anwendung wäre ein Prozedur oder eine Funktion. Als Routinen, Prozeduren oder Funktionen bezeichnet, sind Anweisungsblöcke, die Sie von verschiedenen Stellen in einem Programm aus 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 einen einzelnen Wert zurückgeben Dies wäre eine Ganzzahl, eine Zeichenfolge, ein Boolescher Wert oder ein anderer einfacher Typ. Auch Rückgabetypen können ein Array, eine Zeichenfolgenliste, eine Instanz eines benutzerdefinierten Objekts oder ähnliches sein.

Beachten Sie, dass selbst wenn Ihre Funktion eine Zeichenfolgenliste zurückgibt (eine Sammlung von Saiten) gibt immer noch einen einzelnen Wert zurück: eine Instanz der Zeichenfolgenliste.

Außerdem können Delphi-Routinen wirklich viele Gesichter haben: Routine, Methode, Methodenzeiger, Ereignisdelegierter, anonyme Methode ...

instagram viewer

Kann eine Funktion mehrere Werte zurückgeben?

Die erste Antwort, die uns in den Sinn kommt, ist nein, einfach weil wir, wenn wir an eine Funktion denken, an einen einzelnen Rückgabewert denken.

Die Antwort auf die obige Frage lautet jedoch sicherlich Ja. Eine Funktion kann mehrere Werte zurückgeben. Mal sehen wie.

Var-Parameter

Wie viele Werte kann die folgende Funktion zurückgeben, einer oder zwei?

Funktion PositiveReciprocal (const valueIn: integer; var valueOut: real): boolean;

Die Funktion gibt offensichtlich einen booleschen Wert zurück (wahr oder falsch). Wie wäre es mit dem zweiten Parameter "valueOut", der als "VAR" -Parameter (Variable) deklariert ist?

Var Parameter werden an die Funktion übergeben durch Bezugnahme Das heißt, wenn die Funktion den Wert des Parameters ändert - eine Variable im aufrufenden Codeblock -, ändert die Funktion den Wert der für den Parameter verwendeten Variablen.

Um zu sehen, wie das oben genannte funktioniert, ist hier die Implementierung:

Funktion PositiveReciprocal (const valueIn: integer; var valueOut: real): boolean;

Start

 Ergebnis: = valueIn> 0;

wenn Ergebnis dann valueOut: = 1 / valueIn;

Ende;

Das "valueIn" wird als konstanter Parameter übergeben - die Funktion kann es nicht ändern und wird als schreibgeschützt behandelt.

Wenn "valueIn" oder größer als Null ist, wird dem Parameter "valueOut" der Kehrwert von "valueIn" zugewiesen und das Ergebnis der Funktion ist wahr. Wenn valueIn <= 0 ist, gibt die Funktion false zurück und "valueOut" wird in keiner Weise geändert.

Hier ist die Verwendung:

var

 b: Boolescher Wert;

 r: real;

Start

 r: = 5;

 b: = PositiveReciprocal (1, r);

 //here:

 // b = wahr (da 1> = 0)

 // r = 0,2 (1/5)

 r: = 5;

 b: = PositiveReciprocal (-1, r);

 //here:

 // b = false (seit -1 

Ende;

Daher kann der PositiveReciprocal tatsächlich 2 Werte "zurückgeben"! Mit var-Parametern kann eine Routine mehr als einen Wert zurückgeben.

Out-Parameter

Es gibt eine andere Möglichkeit, einen Referenzparameter anzugeben: Verwenden Sie das Schlüsselwort "out" wie folgt:

Funktion PositiveReciprocalOut (const valueIn: integer; aus valueOut: real): boolean;

Start

 Ergebnis: = valueIn> 0;

wenn Ergebnis dann valueOut: = 1 / valueIn;

Ende;

Die Implementierung von PositiveReciprocalOut ist dieselbe wie in PositiveReciprocal, es gibt nur einen Unterschied: Der "valueOut" ist ein OUT-Parameter.

Bei als "out" deklarierten Parametern wird der Anfangswert der referenzierten Variablen "valueOut" verworfen.

Hier ist die Verwendung und die Ergebnisse:

var

 b: Boolescher Wert;

 r: real;

Start

 r: = 5;

 b: = PositiveReciprocalOut (1, r);

 //here:

 // b = wahr (da 1> = 0)

 // r = 0,2 (1/5)

 r: = 5;

 b: = PositiveReciprocalOut (-1, r);

 //here:

 // b = false (seit -1 

Ende;

Beachten Sie, wie 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 in als "out" deklariert wurde, wenn "r" Bei Erreichen der Funktion wurde der Wert verworfen und der Standardwert "leer" für den Parameter festgelegt (0 für real Art).

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önnen nicht initialisierte Variablen (die für VAR-Parameter verwendet werden) seltsame Werte haben.

Aufzeichnungen zurückgeben?

Die obigen Implementierungen, bei denen eine Funktion mehr als einen Wert zurückgeben würde, sind nicht nett. Die Funktion gibt tatsächlich einen einzelnen Wert zurück, gibt aber auch, besser gesagt, die Werte der var / out-Parameter zurück.

Aus diesem Grund möchten Sie möglicherweise nur sehr selten Referenzparameter verwenden. Wenn mehr Ergebnisse von einer Funktion erforderlich sind, kann eine Funktion a zurückgeben Aufnahmetyp Variable.

Folgendes berücksichtigen:

Art

 TLatitudeLongitude = Aufzeichnung

 Breitengrad: real;

 Längengrad: real;

Ende;

und eine hypothetische Funktion:

Funktion Wo bin ich(const Stadtname: Zeichenfolge): TLatitudeLongitude;

Die Funktion WhereAmI würde die zurückgeben Breiten-und Längengrad für eine bestimmte Stadt (Stadt, Gebiet, ...).

Die Implementierung wäre:

Funktion Wo bin ich(const Stadtname: Zeichenfolge): TLatitudeLongitude;

Start// Verwenden Sie einen Dienst, um "townName" zu finden, und weisen Sie dann das Funktionsergebnis zu:

 Ergebnis. Breitengrad: = 45,54;

 Ergebnis. Längengrad: = 18,71;

Ende;

Und hier haben wir eine Funktion, die 2 reelle Werte zurückgibt. Ok, es wird 1 Datensatz zurückgegeben, aber dieser Datensatz enthält 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.