−トップへ−

関数を使う

 プログラムソースは手続き(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内のプログラムソースが見やすくなることがあります。

−トップへ−