引数の数制限の無い関数
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