[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]

    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;

[Back to DELPHI SWAG index] [Back to Main SWAG index] [Original]