関数を使う
プログラムソースは手続き(procedure)に書きますが,その他に関数(function)に書くこともできます。
手続き(procedure)は,いろいろな変数を自由に使え,いろいろなコンポーネントを操作することができますが,関数(function)にはいろいろな制約があります。いくつかあげてみると,
・ 関数に代入された変数のみを使うことができ,他の変数や各種コンポーネントの状態を参照することができません。
・ 関数から他のコンポーネントを操作したりすることができません。
つまり,関数は代入された変数を処理し,その結果を出力することしかしません。
そのため,私はほとんど関数を使ったことがありませんが,使い方によってはプログラムソースが見やすくなったり,関数を他のプログラムに流用しやすくなったりします。
関数を使うときに注意点としては,関数を使う前に関数を記述しておく必要があります。プログラムソースの最後に関数を記述すると,関数を読み取ることができず,エラーが起きますので,手続き(procedure)を記述する前に,関数を記述しておきます。
ここでは,西暦と月を入力するとその月の日数と,和名を表示するプログラムを作ってみます。
まず,フォームに「Button」と,「Edit」と「Label」を2個ずつ貼り付けます。
そしてButton1Clickイベントを呼び出します。
//=========================================================
//関数=====================================================
function monthd(y,m:integer):integer;
begin
if m>12 then begin
result:=0; //m(月)が,12を越えたら,関数の返値を0にする
exit;
end;
if m=2 then begin //もしmが2(2月)のとき
if y mod 4 >0 then begin //4で割りきれなかったら
result:=28; //関数の返値を28にする
end else begin //それ以外のとき
if (y mod 100=0) and (y mod 400>0) then begin //西暦が100で割り切れ,400で割りきれないとき
result:=28; /関数の返値を28にする
end else begin //それ以外のとき
result:=29; //関数の返値を29にする
end;
end;
exit; //2月のときが終われば終了
end;
if m<=7 then begin //7月以下のとき
if m mod 2=0 then begin //mが偶数のとき
result:=30; //関数の返値を30にする
end else begin //それ以外(奇数)のとき
result:=31; //関数の返値を31にする
end;
end else begin //それ以外(8月以上)のとき
if m mod 2=0 then begin //mが偶数なら
result:=31; //関数の返値を31にする
end else begin //それ以外(奇数)のとき
result:=30; //関数の返値を30にする
end;
end;
end;
function jmonth(m:integer):string;
begin
case m of
1:result:='睦月'; //1月のときは,関数の返値を「睦月」にする(以下同様)
2:result:='如月';
3:result:='弥生';
4:result:='卯月';
5:result:='皐月';
6:result:='水無月';
7:result:='文月';
8:result:='葉月';
9:result:='長月';
10:result:='神無月';
11:result:='霜月';
12:result:='師走';
else result:='(名前なし)';
end;
end;
//関数終了=================================================
//=========================================================
procedure TForm1.Button1Click(Sender: TObject);
var
ye,mo:integer; //整数型変数を宣言する
begin
ye:=strtoint(edit1.Text); //yeにedit1の数字を代入する
mo:=strtoint(edit2.Text); //moにedit2の数字を代入する
label1.caption:=edit1.text+'年'+edit2.text+'月の日数は'+inttostr(monthd(ye,mo))+'日です';
label2.Caption:='和名は'+jmonth(mo)+'です'
end;
上の例では関数「monthd」に西暦と月を代入すると,その月の日数を整数型の変数で返します。
function monthd(y,m:integer):integer;について
(y,m:integer)の部分で,関数に代入する変数(引数)が2個であり,それが整数型であることを示します。
最後の:integerは,返値が整数型であることを示します。
同様に「jmonth」では月を代入すると,その和名を文字列型の変数で返します。
function jmonth(m:integer):string;について
(m:integer)は引数が整数型の変数が1個で,
:stringは返値が,文字列型の変数であることを示します。
これを実行すると,下記のようになります。

このように関数を使うとprocedure内のプログラムソースが見やすくなることがあります。