procedure と function の唯一の違いは、「値を返すか返さないか」ということです。また、一般に procedure のことを「手続き」と呼び、 function のことを「関数」と呼びます。ここで、具体的に手続きと関数の違いを見る前に少し基本的なことを見てみたいと思います。
それでは、最初に「手続き MyProc はパラメータを一つとり、その型は Integer である」という設定で見てみます。
procedure MyProc(i: Integer); begin ShowMessage(IntToStr(i) + ' を受け取りました。'); end; procedure TForm1.Button1Click(Sender: TObject); begin MyProc(10); // 手続きMyProcに10(Integer)を渡す end;
色がついている所は全て手書きした所です。つまり、手続きや関数を自作する場合は procedure から end までプログラマが自分で全て書かなくてはなりません。また、( i: Integer ) がパラメータをあらわしています。この例については特に問題は無いと思います。それでは今度はパラメータがない例です。
procedure MyProc; begin ShowMessage('Button1Clickの中で呼ばれました'); end; procedure TForm1.Button1Click(Sender: TObject); begin MyProc; // 手続きMyProcを呼び出す。 end;
このように、パラメータを取らない場合は、単に procedure MyProc; と書いてやればいいだけです。続いて、パラメータを2つ取る例です。
procedure MyProc(i, j: Integer); begin ShowMessage(IntToStr(i) + ' と ' + IntToStr(j) + ' を受け取りました。'); end; procedure TForm1.Button1Click(Sender: TObject); begin MyProc(10, 50); // 手続きMuProcに10と50(Integer)を渡す。 end;
このようにパラメータが複数ある場合でも時に難しいことはありません。 もう一つ例を見て見ます。
procedure MyProc(a: Integer; s: string); begin ShowMessage(IntToStr(a) + ' と ' + s + ' を受け取りました'); end; procedure TForm1.Button1Click(Sender: TObject); begin MyProc(10, 'Delphi'); end;
パラメータに関しては、関数(function)の場合でも同じ要領で設定します。特に問題は無いと思います。
それでは、手続きと関数の違いについてみていきます。手続きについては上の例で示した通りです。問題は関数の方です。関数は値を返します。この場合もパラメータ同様、返す値の型を指定してやらなければなりません。また、返すことの出来る値は一つだけです。
// ↓戻り値の型を指定する function MyFunc(a: Integer): Integer; begin ShowMessage(IntToStr(a) + ' を受け取りました'); Result := a + 10; // 受け取った値に10を足して // 呼び出し元に返します。 end; procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin i := MyFunc(2); // MyFuncに2(Integer)を渡し、 // 返してもらった値を変数iに代入 ShowMessage(IntToStr(i)); end;
このように、返す値の型を括弧の後ろにつけてやります。括弧の後ろに付けるのは:(コロン)なので注意して下さい。また、ここでは Result という宣言していない変数が出てきました。この Result は、関数において暗黙的に宣言されているものです。つまり、明示的に宣言しなくても良いということです。この Result の型は、返す値の型と同じになりますので、ここでは Integer ということになります。この Result に呼び出し元に返す値を代入してやります。
また、Result に値を代入したら直ちに呼び出し元に値が返されるわけではありませんので、以下のように、ある条件によって返す値を変更することも出来ます。
function MyFunc(i: Integer): Integer; begin Result := 0; // とりあえず値を入れておく if i = 12 then // 受け取った値が特定の値ならば Result := 100; // 返す値を変更 end; procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin i := MyFunc(10); ShowMessage(IntToStr(i)); i := MyFunc(12); ShowMessage(IntToStr(i)); end;
もちろん、返すのは値ではなく Boolean 型でもOKです。
function MyFunc(str: string): Boolean; begin Result := False; if str = 'Delphi' then Result := True; end; procedure TForm1.Button1Click(Sender: TObject); begin if MyFunc('Kylix') then ShowMessage('Kylixです') else if MyFunc('Delphi') then ShowMessage('Delphiです'); end;