Contributor: CHAMI
Sometimes it's necessary to pass undefined number of [different type]
variables to a function -- look at Format() function in Delphi and
*printf() functions in C/C++ for example. Once you analyze the following
code, you'll be on your way to creating mysterious variable parameter
functions...
//
// FunctionWithVarArgs()
//
// skeleton for a function that
// can accept vairable number of
// multi-type variables
//
// here are some examples on how
// to call this function:
//
// FunctionWithVarArgs(
// [ 1, True, 3, '5', '0' ] );
//
// FunctionWithVarArgs(
// [ 'one', 5 ] );
//
// FunctionWithVarArgs( [] );
//
procedure FunctionWithVarArgs(
 const ArgsList : array of const );
var
 ArgsListTyped :
 array[0..$FFF0 div SizeOf(TVarRec)]
 of TVarRec absolute ArgsList;
 n : integer;
begin
 for n := Low( ArgsList ) to
 High( ArgsList ) do
 begin
 with ArgsListTyped[ n ] do
 begin
 case VType of
 vtInteger : begin
 {handle VInteger here} end;
 vtBoolean : begin
 {handle VBoolean here} end;
 vtChar : begin
 {handle VChar here} end;
 vtExtended : begin
 {handle VExtended here} end;
 vtString : begin
 {handle VString here} end;
 vtPointer : begin
 {handle VPointer here} end;
 vtPChar : begin
 {handle VPChar here} end;
 vtObject : begin
 {handle VObject here} end;
 vtClass : begin
 {handle VClass here} end;
 vtWideChar : begin
 {handle VWideChar here} end;
 vtPWideChar : begin
 {handle VPWideChar here} end;
 vtAnsiString: begin
 {handle VAnsiString here} end;
 vtCurrency : begin
 {handle VCurrency here} end;
 vtVariant : begin
 {handle VVariant here} end;
 else begin
 {handle unknown type here} end;
 end;
 end;
 end;
end;
//
// example function created using
// the above skeleton
//
// AddNumbers() will return the
// sum of all the integers passed
// to it
//
// AddNumbers( [1, 2, 3] )
// will return 6
//
//
function AddNumbers(
 const ArgsList : array of const )
 : integer;
var
 ArgsListTyped :
 array[0..$FFF0 div SizeOf(TVarRec)]
 of TVarRec absolute ArgsList;
 n : integer;
begin
 Result := 0;
 for n := Low( ArgsList ) to
 High( ArgsList ) do
 begin
 with ArgsListTyped[ n ] do
 begin
 case VType of
 vtInteger : Result := Result + VInteger;
 end;
 end;
 end;
end;


AltStyle によって変換されたページ (->オリジナル) /