Funcoes - parametros opcionais e diferentes

Top  Previous  Next

{

 Estes 2 exemplos abaixo mostram como criar funcoes que tenham numeros

 variaveis de parametros bem como de tipo

 -- passa por array.

}

 

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; .