RTTI

Delphi

01/12/2003

Gostaria de saber se é possível obter dinamicamente o tipo de uma variável primitiva (real, integer, etc...) somente através de seu endereço, utilizando RTTI ou algo semelhante.

Ex do problema:

function Recebe_Variaveis( const Variaveis: Array of Pointer ): Integer;
begin

// Obter o tipo da variavel

for i:=0 to Length( Variaveis ) -1 do
begin


// aqui seria feita a verificacao do tipo....
se Variaveis[i] é do tipo:
integer: faz x;
real: faz y;
...

end;

end;

Agradeço desde já,


Gustavocgm

Gustavocgm

Curtidas 0

Respostas

Rafael Heise

Rafael Heise

01/12/2003

Acho que é melhor você fazer difenrete....

function Recebe_Variaveis( const Variaveis: Array of variant ): Integer; 
begin 
  for i:=0 to Length( Variaveis ) -1 do 
  begin 
    // aqui seria feita a verificacao do tipo.... 
    case VarType(Variaveis[i]) of
      varInteger: faz x;
      varDouble: faz y;
      ... 
    end;
  end; 
end;


e aconselho ainda você a criar função com a declaração como overload, assim, função com o mesmo nome passando como parâmetro tipos diferentes sendo

funcao FazIsso(aValor: integer); overload;
funcao FazIsso(aValor: real); overload;

e ao invés das chamadas faz x; e faz y; usaria a mesma chamada apenas passando o tipo, assim, você tira até a validação para o tipo
(essa seria ma segunda opção para você fazer o que quer)

sendo:

function Recebe_Variaveis( const Variaveis: Array of variant ): Integer; 
begin 
  for i:=0 to Length( Variaveis ) -1 do  
    FazIsso(Variaveis[i]);
end; 


ou ainda você pode usar a sua declaração com Pointer chamando então as funções com overload

sendo:

function Recebe_Variaveis( const Variaveis: Array of Pointer ): Integer; 
begin 
  for i:=0 to Length( Variaveis ) -1 do 
    FazIsso(Variaveis[i]^);
end; 


beleza?
valeu


GOSTEI 0
Beppe

Beppe

01/12/2003

function Recebe_Variaveis( const Variaveis: Array of variant ): Integer; 
begin 
  for i:=0 to Length( Variaveis ) -1 do  
    FazIsso(Variaveis[i]);
end; 


Isto não funciona. As funções ´FazIsso´ não aceitam [i:969ce7b7f4]dispatching[/i:969ce7b7f4], ie a função não é escolhida com base no tipo dinâmico(tipo que tem em tempo de execução) da expressão.

Para chamar estas funções, você precisa indicar qual quer chamar. Um [b:969ce7b7f4]case[/b:969ce7b7f4] ainda é necessário, além de usar uma [i:969ce7b7f4]typecast[/i:969ce7b7f4] no argumento passado.

procedure Recebe_Variaveis(const Variaveis: array of Variant);
var
  I: Integer;
begin
  for I :=0 to High(Variaveis) do
    case VarType(Variaveis[I]) of
      varInteger: FazIsso(Integer(Variaveis[I]));
      varString: FazIsso(String(Variaveis[I]));
      ...
    end;
end;



GOSTEI 0
Rafael Heise

Rafael Heise

01/12/2003

Possivelmente não funciona mesmo..
mas dai você pode fazer direto
FazIsso(VarAsType(Variaveis[i],VarType(Variaveis[i])));

talvez funcione... talvez não...
não testei nada no Delphi.... não sei se compila...


GOSTEI 0
Gustavocgm

Gustavocgm

01/12/2003

Valeu pela ajuda!


GOSTEI 0
POSTAR