RTTI
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á,
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
Curtidas 0
Respostas
Rafael Heise
01/12/2003
Acho que é melhor você fazer difenrete....
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:
ou ainda você pode usar a sua declaração com Pointer chamando então as funções com overload
sendo:
beleza?
valeu
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
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
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...
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
01/12/2003
Valeu pela ajuda!
GOSTEI 0