Create functions that can accept variable number of parameters such as Format() (Views: 27)
Problem/Question/Abstract: 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; |