procedure と function

procedure と function の唯一の違いは、「値を返すか返さないか」ということです。また、一般に procedure のことを「手続き」と呼び、 function のことを「関数」と呼びます。ここで、具体的に手続きと関数の違いを見る前に少し基本的なことを見てみたいと思います。

パラメータ ( 引数 )
手続き、関数は共に任意のパラメータを取ることが出来ます。まず、手続き(procedure)について、その具体例を見て見ましょう。 パラメータを指定する場合、重要な点はパラメータの「個数」と「型」です。つまり、いくつのパラメータを取って、そしてそのパラメータの型は何なのかを最初に定義しなければなりません。(余談ですが、引数は「ひきすう」と読みます。最初は「いんすう」と読んでしまうのではないでしょうか。自分も最初は「いんすう」だと思って、ずっとそう読んでいました。procedureなども「プロシージャ」と呼ばずに「プロセデゥアー」とか適当に読んでました(^^;、何か「読み方」の一覧表などあれば便利かもしれませんね。また、今更ですが「Delphi」は「デルファイ」と読むようです。これも最初、自分は「デルフィ」と読んでいました。個人的には「デルフィ」の方が気に入っているのですが・・。)

それでは、最初に「手続き 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;

up next
Last Update 2002/5/08 by N.Kobayashi