Funktionen
Zuletzt geändert: 12.06.2023 05:58

Funktionen (Pascal-Script) #

Eine Funktion unterscheidet sich nicht wesentlich von einer Prozedur. Es gibt nur eine kleine, aber feine Erweiterung: Eine Funktion liefert einen Wert zurück. Das muss beim Erstellen einer Funktion, aber auch bei deren Aufruf beachtet werden. Dadurch dass eine Funktion einen Wert zurückliefert kann man erheblich mehr damit machen als mit einer Prozedur. Dies wird vor allem unter Beispiele verdeutlicht. Was es heißt, die Funktion liefere einen Wert zurück, verdeutlich man sich am besten indem man sich die Funktionsaufrufe und Beispiele ansieht.

Die aller einfachste Funktion sieht etwa so aus:

function Beispiel_Funktion_1: Boolean;
begin
	if (Rechnung['VkBrutto'] > 0) then Result:=true
	else Result:=false;
end;

Diese Funktion würde true zurückliefern, wenn der Rechnungsbetrag größer 0 ist, false wenn der Rechnungsbetrag kleiner 0 ist (also bei einer Gutschrift). Hier fällt schon auf, dass es eine Variable „Result“ gibt. Diese bekommt immer den Wert zugewiesen, der zurückgegeben werden soll. Die Variable „Result“ existiert in allen Funktionen und ist automatisch von dem Typ der im Funktionskopf hinter dem Doppelpunkt definiert wurde (hier: Boolean).

Genau wie bei Prozeduren kann man Funktionen Werte übergeben:

function Beispiel_Funktion_2 (I: Integer): String;
begin
	case I of
 	    1: Result:='Es wurde 1 übergeben.';
	    2: Result:='Es wurde 2 übergeben.';
	    else: Result:= 'Es wurde weniger als 0 oder mehr als 2
			  übergeben.';
	end;
end;

Diese Funktion würde anhand des übergebenen Integer-Wertes I einen bestimmten String zurückgeben. Die zu übergebenden Werte werden genau wie bei Prozeduren in Klammern, getrennt durch Semikolon, angegeben (Name1: Typ1; Name2: Typ2). Der Typ des Rückgabewerts folge dahinter nach dem Doppelpunkt.

Natürlich kann man auch mehrere Werte übergeben, zurückliefern kann die Funktion freilich nur einen Wert eines bestimmten Typs:

function Beispiel_Funktion_3 (A: Integer; B: Boolean; C: String): String;
begin
 	if B then
 	begin
		Result:= C;
		while A > 0 do
		begin
			Result:= Result + '!?';
			A:= A - 1;
     	end;
 	end
	else
	    begin
			case A of
		   		1: Result:= C + ' ;-)) ' ;
		   		2: Result:= C + ' :-(( ' ;
		   		3: Result:= C + ' ;-|  ' ;
		   	else Result:= '< ' + c + '>';
		end;
	end;
end;

Ja nachdem of B true oder false ist stellt diese Funktion etwas mit dem String C an und gibt das Ergebnis zurück.

Mehr Beispiele und praxisnahe Anwendungen finden Sie unter Beispiele.

Funktionen aufrufen #

Der Aufruf von Funktionen funktioniert natürlich fast genauso wie der von Prozeduren. Da die Funktion einen Wert zurück liefert, steht der Funktionsaufruf praktisch als Variable für diesen Wert, und genauso wird eine Funktion auch benutzt, wie eine Variable:

„Beispiel 1“, bekommt keine Werte übergeben, liefert ein Boolean zurück.

procedure ReportBeforePrint;
    var   
	B: Boolean;

    begin
	B:= Beispiel_Funktion_1;

{ oder ...}

	if (Beispiel_Funktion_1) then
	     ShowMessage('Beispiel Funktion 1 hat true zurückgeliefert')
	else ShowMessage('Beispiel Funktion 1 hat false zurückgeliefert');	    
 
{ oder ...}

	TextFeld.visible:=Beispiel_Funktion_1;

   end;

Man kann also den zurück gelieferten Wert direkt verwenden, einer Variablen zuweisen (kommt selten vor), in einer if-Abfrage benutzen oder damit die (visible-) Eigenschaft eines Objektes setzen.

„Beispiel 2“, bekommt einen Integer übergeben, liefert einen String zurück:

procedure ReportBeforePrint;
    var   
	S: String;
	I: Integer;

    begin
	I:= 8;

	S:=Beispiel_Funktion_2(I);

{ oder ...}

	ShowMessage( Beispiel_Funktion_2(4) );

{ oder ...}

	S:= 'Nachricht: ' + Beispiel_Funktion_2( (I + 89) );
    end;

„Beispiel 3“, bekommt einen Integer, ein Boolean und einen String übergeben, liefert einen String zurück:

procedure ReportBeforePrint;
    var   
	S1, S2: String;
	I: Integer;
	B: Boolean;

    begin
	I:= 10;
	B:= Beispiel_Funktion_1;
	S1:= Beispiel_Funktion_2(I);
	S2:= Beispiel_Funktion_3(I, B, S1);

{ oder ...}

	ShowMessage ( Beispiel_Funktion_3 (10, Beispiel_Funktion_1, Beispiel_Funktion_2 (I) ) );
    end;

Wie man hier sieht können Funktionsaufrufe auch verschachtelt werden, im Aufruf der Funktion Beispiel_Funktion_3 können durchaus Beispiel_Funktion_2 und Beispiel_Funktion_1 verwendet werden. Auch hier gilt: Nicht unbedingt übertreiben! Immer nur soweit verschachteln, dass man noch den Überblick hat und sich vorstellen kann, was der Code macht, den man grade produziert hat.