変数を宣言した場合、その変数は、その関数( 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 キーを押すと、オブジェクトインスペクタが前に出てきます。結構便利なので、使ってみてください。