Mega Code Archive

 
Categories / Delphi / Forms
 

How to create functions that can accept variable number of parameters such as Format()

Title: How to create functions that can accept variable number of parameters such as Format()? Question: How to create functions that can accept variable number of parameters such as Format()? Answer: 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;