[関数と手続き]

◆関数と引数・戻り値

◎関数定義
function 関数名(仮引数1: 変数型 ;仮引数2 : 変数型): 戻り値の変数型; //;が必要
 begin
  実行文1;
  Result:=戻り値;
 end;
◎関数呼び出し
変数:=関数名(引数1,引数2);
・仮引数が複数ある場合は、セミコロン(;)で区切って記述します ・関数を呼び出して複数の引き数を記述する場合はカンマ(,)で区切ります ・仮引数がない場合は、関数定義、関数呼び出しともに()を省略します ・戻り値は Result変数 に設定します ・関数定義は、その関数が呼ばれる前に定義するか、fowardキーワードを付けてプロトタイプ宣言します ・プロトタイプ宣言では、forwardキーワードを付けた上で、引数や戻り値を宣言します。そのかわり、関数宣言では、引数や戻り値の宣言を省略できます
1program tips0044_1;
{$APPLTYPE CONSOLE}
var
 a,b,c:integer;

function sumFunc(x:integer; y:integer):integer;
 begin
  Result:= x + y;
 end;

begin
 a:=1000;
 b:=500;
 c:=sumFunc(a,b);
 WriteLn(a,'+',b,'=',c); 
end.
2function sumFunc(x:integer; y:integer):integer; forward;

procudure TForm1.FormCreate(Sender: TObject);
var
 a,b,c:integer;
begin
 a:=1000; b:=500;
 c:=sumFunc(a,b);
 ShowMessage(IntToStr(a) + '+' + IntToStr(b) + '=' +IntToStr(c)); 
end;

function sumFunc
 begin
  Result:= x + y;
 end;
◆手続きと引数 ◎手続き定義
procedure 手続き名(仮引数1: 変数型 ;仮引数2 : 変数型);     //;が必要
 begin
  実行文1;
 end;
◎手続き呼び出し 手続き名(引数1,引数2); ・仮引数が複数ある場合は、セミコロン(;)で区切って記述します ・関数を呼び出して複数の引き数を記述する場合はカンマ(,)で区切ります ・仮引数がない場合は、関数定義、関数呼び出しともに()を省略します ・手続き定義は、その手続きが呼ばれる前に定義するか、fowardキーワードを付けてプロトタイプ宣言します ・プロトタイプ宣言では、forwardキーワードを付けた上で、引数や戻り値を宣言します。そのかわり、手続き宣言では、引数や戻り値の宣言を省略できます
例1)
program tips0044_2;
{$APPLTYPE CONSOLE}

procedure msgProc(str:string);
 begin
  ShowMessage(str + ' Hello World');
 end;

begin
 msgProc('Delphi');
end.
2procedure msgProc(str);forward;

procedure TForm1.FormCreate(Sender:TObject);
var
 s:string;
begin
 msgProc(s);
end.

procedure msgProc;
 begin
  ShowMessage(str + ' Hello World');
 end;
◆関数、手続きからの脱出 関数や手続きから脱出するには、Exit手続きを使用します ◆値渡しと参照渡し 引数の記述で、なにも付けないと「値渡し」、varを付けると「参照渡し」、constを付けると「定数渡し」になります 値渡し:変数を変更しても、呼び出し側の値は変わらない 参照渡し:変数を変更すると、呼び出し側の値が変わる
例1)
program tips0044_1;
{$APPLTYPE CONSOLE}
var
 a,b,c:integer;

function sumFunc(var x:integer; var y:integer):integer;
 begin
  x:=1; y:=1;
  Result:= x + y;
 end;

begin
 a:=1000;
 b:=500;
 c:=sumFunc(a,b);
 WriteLn(a,'+',b,'=',c); // 1+1=2 と表示される 
end.
◆再帰的呼び出し ある関数や手続きから、自分自身を呼び出すことを、再帰的呼び出しといいます。 ◆関数や手続きのスコープ 関数・手続きを他のユニットから参照可能にする (方法1)  ・interface部に関数のプロトタイプを記述する  ・呼び出し側は、Implementation部のusesに呼び出したい関数が定義されたユニットを指定する (方法2)フォームのメンバ関数にする方法  ・Interface部のPublicに関数のプロトタイプを記述する  ・Implementation部で関数本体を定義する  ・呼び出し側で、「フォームクラス名.関数名」(TForm2.myFunc)で呼び出します
プライベート関数Implementation部
グローバル関数Interface部
メンバ関数フォーム名を付加
◆手続き型へのポインタ 関数名を変数に代入したり、関数名を別の関数に渡すことも可能です ◆関数のオーバーロード 同名の関数・手続きを複数定義することができます。これをオーバーロードといいます 但し、引数の型、または、引数の個数が異なっていることが条件で、コンパイラは関数・手続きが呼び出されたときに、引数の型・個数を確認して、どの関数を呼び出すか決定します。