値、参照パラメータ

変数を宣言した場合、その変数は、その関数( procedure, function ) 内でしか使えません。次の例を見てください。

procedure MyProc;
begin
  x := 20; // 使えません!
           // x は宣言されていません
end;
  
procedure TForm1.Button1Click(Sender: TObject);
var
  x: Integer; // 変数 x を宣言
begin
  x := 10; // もちろん x に代入できます。
  
  if x = 10 then // if 文でも x は使えます
    Color := clWhite;
end;

もちろん、MyProc 内では x は使用できません。 「 procedure って?」で見ましたように、関数どうしの連携プレーをしたい場合は、渡したい変数を引数( ひきすう )として、渡します。

function MyProc(i: Integer): Integer; 
var
  y: Integer;
begin
  y := 30;
  i := i + y; // もらった i に y を足します
  
  Result := i; // iを返します。
end;
  
procedure TForm1.Button1Click(Sender: TObject);
var
  x: Integer;
begin
  x := 10;
  
  MyProc(x); // 関数の引数として、xを渡します。

  ShowMessage(IntToStr(MyProc(x)));
end;

MyProc の引数の変数名が i となっていて初めは「 x じゃないのか?」と思うかもしれませんが、これは唯の名前なので、なんでもいいんです。

これで、無事に関数どうしの連携プレーが出来ました。それでは、今度は、二つの値を渡して、その値を交換してもらいましょう。

procedure MyProc(i, j: Integer);
var
  temp: Integer;
begin
  temp := i; // 交換します
  i := j;
  j := temp;
 
  ShowMessage('交換しました');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  x, y: Integer;
begin
  x := 10;
  y := 20;
  
  ShowMessage('xは' + IntToStr(x) + ' yは' + intToStr(y));
 
  MyProc(x, y); //二つの値を渡します
  
  ShowMessage('xは' + IntToStr(x) + ' yは' + IntToStr(y));
end;

コンパイルするとヒントが出てしまって、何を意図しているのかがばれてしまいましたが(^^;)これでは、交換したことにはなりません。実は、関数の引数として値を渡した時、値は値でも値のコピーを渡しているのです。MyProc 関数の中で、いくら値を変更しても元の x, y の値には影響はありません。実は、あることをすることで、値そのものを関数に引き渡すことが出来ます。それは、var をつけると可能になります。

procedure MyProc(var i, j: Integer); // varが付きました
var
  temp: Integer;
begin
  temp := i; // 交換します
  i := j;
  j := temp;
  
  ShowMessage('交換しました');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  x, y: Integer;
begin
  x := 10;
  y := 20;
  
  ShowMessage('xは'+IntToStr(x)+' yは'+intToStr(y));
 
  MyProc(x, y); //二つの値を渡します
  
  ShowMessage('xは'+IntToStr(x)+' yは'+IntToStr(y));
end;

無事交換する事が出来ました。

ちょっと一言:

Delphi では、エディタ、オブジェクトインスペクタ、フォームを行ったり来たりしてプログラミングをしなければなりません。特に、エディタとフォームは、頻繁に行ったり来たりします。そんな時は、F12 キーを押して下さい、これで、フォームとエディタが入れ替わります。また、F11 キーを押すと、オブジェクトインスペクタが前に出てきます。結構便利なので、使ってみてください。


up next
Last update 2002/3/5