16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
""ファンクション" って?"
この発言に対し以下のコメントが寄せられています
#00295 J-OH! さん "ファンクション" って?訂正 ( );
◆説明◆
プログラミングを始めて徐々に勉強を進めて行くと、その内に function
なるモノがやたらと目に付くようになってきます。
ここでは、
・"function" とは何なのか?
・ どうやって使うのか?
・ どんな場合に役立つのか?
――― というコトについて説明してみます。
◆ 例1◆
以下の2組コードは、結果的にはどちらも同じ処理を行います。
= その1−1= = = = = = = = = = = = = =
procedure TForm1.Button1Click(Sender: TObject);
var
A, B, C: Integer;
begin
A := StrToInt(Edit1.Text);
B := StrToInt(Edit2.Text);
C := A + B;
Label1.Caption := IntToStr(C);
end;
= その1−2= = = = = = = = = = = = = =
function Func01(A, B: Integer): Integer;
begin // ^^^^^^^^^^^^^#1 ^^^^^^^#2
Result := A + B;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
A, B, C: Integer; // ← #3
begin
A := StrToInt(Edit1.Text);
B := StrToInt(Edit2.Text);
C := Func01(A,B);
// ^^^^^^^^^^^#4
Label1.Caption := IntToStr(C);
end;
この場合、#1 はこの function が "受け取る" 変数名と型を意味し、こ
れら変数名・型は #3 での宣言と同じでなくてはなりません。
で、#4 は「Func01 に変数 A, B を "渡している"」コトを意味していて
、Func01 はそれらを足し合わせた結果を #2 の Integer 型で "戻す" とい
う意味です。
ここではその戻ってきた値を C に代入しているコトになり、つまり、#2
の型と C とも同じ型である必要があります。
同じ結果を示すサンプルを、異なる変数型・戻り値型で「例2」に示しま
す。
◆ 例2◆
= = = = = = = = = = = = = = = = =
function Func01(A, B: Integer): String;
begin // ^^^^^^戻り値を String とする
Result := IntToStr(A + B);
end; // ^^^^^^^^受け取った Integer A,B を加工して String で
// 戻す
procedure TForm1.Button1Click(Sender: TObject);
var
A, B; Integer;
C: String; // ← これ(戻り値 String を受け取るため)
begin
A := StrToInt(Edit1.Text);
B := StrToInt(Edit2.Text);
C := Func01(A,B);
Label1.Caption := C;
end; // ^これ(INtToStr(C); ではなくなっています)
◆どんな場合に役立つのか◆
例えば、StringGrid1 に以下のようなデータが入力されているとしま
す。
1 2 3 4 5
1 国語 算数 理科 社会
2 AAA 10 20 30 40
3 BBB 11 21 31 41
4 CCC 12 22 32 42
5 DDD 13 23 33 43
6 EEE 14 24 34 44
で、このような状態から、例えば、
・AAA の国語の点数(Cells[2,2])と、
・BBB の国語の点数(Cells[2,3])とを比較し、
・得点の高い方の氏名を Label1 に表示させる。
というような場合であれば「例3」のように書くことが出来ます。
◆ 例3◆
= = = = = = = = = = = = = = = = =
function Func02(Simei, Kamoku: String): Integer;
var
RC, CC: Integer;
begin
RC = 1
while StringGrid1.Cells[1,RC] <> Simei do inc(RC);
CC = 1
while StringGrid1.Cells[CC,1] <> Kamoku do inc(CC);
Result = StrToInt(StringGrid1.Cells[CC,RC]);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Simei, Kamoku; String;
Fst, Snd; Integer;
begin
Simei = Edit1.Text;
Kamoku = Edit2.Text;
Fst = Func02(Simei, Kamoku); '← #1
Simei = Edit3.Text;
Kamoku = Edit4.Text;
Snd = Func02(Simei, Kamoku); '← #2
If Fst > Snd Then Label1.Caption := Edit1.Text else
Label1.Caption := Edit3.Text;
end;
この場合、仮に function を使わなかったとすると、#1, #2 の部分で
どちらとも Func02 に相当するコードを書く必要があるコトになるのです
が、function を使用すると Simei, Kamoku の値が分かった時点で、様々
な位置から利用することが出来ます。
◆注意◆
function コードは、その function を使用する procedure よりも、
必ず "上" に書かれていなければなりません。
J-OH!(VEC05267)
Original document by J-OH! 氏 ID:(VEC05267)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|