引数の数制限の無い関数
|
10 |
FreeCountArgumentFunction |
動作確認 |
Delphi2007 |
更新日 |
2008/02/03(日) |
オープン配列パラメータを
引数に使うと引数の数を任意個数で指定できます。
※ たしか対応されたのはD4以降です。
サンプルソースをどうぞ。
────────────────────
//任意個数の引数をとれる関数
procedure ABC(Values: array of Integer);
var
i: Integer;
begin
for i := 0 to High(Values) do
begin
ShowMessage(IntToStr(Values[i]));
end;
end;
//関数の呼び出し方法
procedure TForm1.Button1Click(Sender: TObject);
var
AAA: array of Integer;
i: Integer;
begin
//直接記入するとこのように呼び出せる。
ABC([ 5, 4, 3, 2, 1]);
//変数に入れて呼び出す場合は動的配列を使うこともできる。
SetLength(AAA, 3);
for i := 0 to 2 do
begin
AAA[i] := 100 + i;
end;
AAA[0] := 5;
ABC(AAA);
end;
────────────────────
このコードでは、ShowMessageによって、メッセージダイアログが
5 4 3 2 1 5 101 102
と順番に表示されます。
次の例では、参照渡しした引数を
呼び出し元でも使っています。
────────────────────
procedure PlusValue(var Values: array of Integer; Plus: Integer);
var
i: Integer;
begin
if Length(Values) = 0 then
raise ERangeError.Create('引数の数が足りません');
for i := 0 to High(Values) do
begin
Values[i] := Values[i] + Plus;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
AAA: array of Integer;
i: Integer;
begin
SetLength(AAA, 3);
for i := 0 to 2 do
begin
AAA[i] := 100 + i;
end;
PlusValue(AAA, 51);
for i := 0 to 2 do
begin
ShowMessage(IntToStr(AAA[i]));
end;
end;
────────────────────
メッセージが
151, 152, 53
と順番に表示されます。
これを
例えば実用的なものとして利用するなら
次のような関数を実装するのがよいでしょう。
────────────────────
//-------------------------------
//引数中の最大値を返す関数 引数制限無し
//使い方: MaxValue([5, 2, 100, Y, X, -5]);など
function MaxValue(Values: array of Integer): Integer;
var
i: Integer;
begin
if Length(Values) = 0 then
raise ERangeError.Create('引数の数が足りません');
Result := Low(Integer);
for i := 0 to High(Values) do
begin
if Result < Values[i] then
Result := Values[i];
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Button2.Caption := IntToStr(MaxValue([Self.Top, Self.Left]));
end;
────────────────────
上記例では、配列内の最大値を求めることができます。
せっかくつくったMaxValue関数ですが
すでにVCLのMathユニットに
MaxIntValue/MinIntValueというものがありました。
使うと便利です。
参考────────────────────
[Seventh Delphi][旧 Delphi 入門][オープン配列パラメータ]
http://kakinotane.s7.xrea.com/delphi/d2/d028.html
|