手続き(procedure)は値を返す事は出来ませんが、関数(function)は値を返すことができます。返したい値は、 暗黙に宣言された変数 Result に代入します。この Result には何度も値を代入することができますが、 その場合、最後に Result に代入された戻り値となります。
function MyFunc(ParameterList): returnType;
ParameterListにパラメータを指定し、returnTypeに戻り値の型を指定します。簡単な例を見てみましょう。
function MyFunc(s: string): string; begin // Result は、戻り値の型と同じです。 // つまり、ここでは Return の型は string ということになります。 Result := s + ' world'; end; procedure TForm1.Button1Click(Sender: TObject); var s: string; ReturnString: string; begin s := 'Hello'; // データ(文字列型の変数 s ) を関数 MyFunc に渡し // 再びそのデータを返してもらいます。 ReturnString := MyFunc(s); ShowMessage(ReturnString); end;
関数 MyFunc 内で変数宣言していない Result 変数を使用しています。Delphi では全ての関数は暗黙のうちに、その関数で指定した戻り値と同じ型をもつ Result 変数を宣言しています。この Result 変数は普通に変数宣言した変数と同じように使用でき、関数が戻るときには、この Result 変数の値が返る事になります。つまり、Result 変数に代入された値が、その関数が返す値ということになります。
少し簡単なサンプルを見てみましょう。ListBox を貼り付けて下さい。
function Add30(int: Integer): Integer; begin Result := int + 30; end; function Add10(int : Integer): Integer; begin Result := int + 10; end; procedure TForm1.Button1Click(Sender: TObject); var Number, Sum: Integer; begin Number := 0; Sum := Add10(Number); ListBox1.Items.Add(IntToStr(Sum)); Sum := Add30(Number); ListBox1.Items.Add(IntToStr(Sum)); end;
次のサンプルは、Button1Click 内で関数を呼び出し、さらにその関数内で別の関数を呼び出している例です。
function Add30(int: Integer): Integer; begin Result := int + 30; end; function Add10(int : Integer): Integer; var TempNumber: Integer; begin TempNumber := Add30(int); Result := TempNumber + 10; // 上の2行は、以下の1行で置き換えることができます。 // Result := Add30(int) + 10; end; procedure TForm1.Button1Click(Sender: TObject); var Number, Sum: Integer; begin Number := 0; Sum := Add10(Number); ListBox1.Items.Add(IntToStr(Sum)); end;
また、関数が値を返してくれる事を利用して、再帰的に関数を呼び出すこともあります。「再帰を見てみよう」では、関数を再帰的に呼び出しているサンプルがあります。