Conforme explicação extraída e devidamente traduzida do help do Delphi:

"Variants represent values whose type is not determined at compile time. 
Instead, the type of their value can change at runtime. Variants can mix with 
other variants and with integer, real, string, and boolean values in 
expressions and assignments; the compiler automatically performs type 
conversions.

By default, variants can't hold values that are records, sets, static arrays, 
files, classes, class references, or pointers. You can, however, extend the 
Variant type to work with any particular example of these types.

Tudo que você precisa é criar um descendente da clase TCustomVariantType que 
indique como o tupo Variant executará as operações padrão nessa condições."

Ou seja, por default não existe conversão de Variant para verificar instâncias 
de objetos, mas existe uma maneira de resolver essa pinimba sem precisar criar 
uma classe derivada de TCustomVariantType, se vc ñ tratar o parâmetro do valor 
como um Variant. O que vc pode fazer é uma modificação na rotina 
AlteraComponente (e não AlteraComponete) que avalie parâmetros sem tipo e 
checar o tipo desse parâmetro com o tipo de registro TVarRec da seguinte 
maneira:

procedure AlteraComponente(Form: TForm; Propriedade: string; const Valor)
var
  i: integer;
begin
  for i := 0 to Form.ComponentCount - 1 do
    if IsPublishedProp(Form.Components[i], Propriedade) then
      if TVarRec(Valor).VarType = vtObject then
        Form.Components[i].Assign(TComponent(TVarRec(Valor).vtObject)
      else
        SetPropValue(Form.Components[i], Propriedade, 
TVarRec(TVarRec(Valor).VVariant^));
end;

Veja se isso funciona e depois poste seus comentários na lista!

P.S.: Eu acho que o certo é "propriedade", e não "propiedade"!

Sds.

> procedure AlteraComponete(Form :TForm; propiedade : string; valor :
> variant);
> var i : integer;
> begin
> for I := 0 to Form.ComponentCount -1 do
> begin
> if IsPublishedProp(Form.Components[i], propiedade)then
> begin
> SetPropValue(Form.Components[I], propiedade,valor);
> end;
> end;
> end;


________________________________

To: delphi-br@yahoogrupos.com.br
From: [EMAIL PROTECTED]
Date: Fri, 1 Feb 2008 13:13:19 -0200
Subject: Re: Res: [delphi-br] Como saber se um componente tem uma propriedade, 
em runtime?







Pessoal, através da dica fiz o seguinte:

if IsPublishedProp(Components[i], 'FrameController') then
SetPropValue(Components[I], 'FrameController',
DM.RzFrameController1);

tá dando o seguinte erro: Incompatible types: 'Variant' and
'TRzFrameController'

Como transformo TRzFrameController pra variant?

OBrigado

[]s

Em 01/02/08, Rubem Nascimento da Rocha <[EMAIL PROTECTED]> escreveu:
>
>
>
> Excelente dica, Evaldo! No entanto, falou mencionar que pra usar essa sua
> função, se faz necessário um uses da unit TypInfo.
>
> Sds.
>
> ________________________________
>
> To: delphi-br@yahoogrupos.com.br 
> From: [EMAIL PROTECTED] 
> Date: Fri, 1 Feb 2008 06:39:32 -0800
> Subject: Res: [delphi-br] Como saber se um componente tem uma propriedade,
> em runtime?
>
>
> Eu criei essa função ontem:
>
> procedure AlteraComponete(Form :TForm; propiedade : string; valor :
> variant);
> var i : integer;
> begin
> for I := 0 to Form.ComponentCount -1 do
> begin
> if IsPublishedProp(Form.Components[i], propiedade)then
> begin
> SetPropValue(Form.Components[I], propiedade,valor);
> end;
> end;
> end;
>
> pode usa-la assim
>
> AlteraComponete(FGerenciaUsuario,'ReadOnly',true);
>
> --
> Atenciosamente:
> Evaldo Avelar Marques
> Programador Junior: Delphi, firebird/interbase, C# Dot Net, C++
> Debian GNU/Linux.
> [EMAIL PROTECTED]  Belo Horizonte/MG
> Brazil
>
> ----- Mensagem original ----
> De: Fellipe Henrique <[EMAIL PROTECTED] >
> Para: "delphi-br@yahoogrupos.com.br " <
> delphi-br@yahoogrupos.com.br >
> Enviadas: Sexta-feira, 1 de Fevereiro de 2008 10:26:24
> Assunto: [delphi-br] Como saber se um componente tem uma propriedade, em
> runtime?
>
> Olá amigos, preciso saber se um componente tem uma propriedade, que eu vou
>
> selecionar, e caso tenha passe um valor para ela. Porém tem de ser
> genérico
>
> algo como:
>
> for i:=0 to ComponentsCount- 1
>
> if Components[i] .PROPRIEDADE = True then
>
> Components[i] .PROPRIEDADE := OBJETO;
>
> Isso existe? Como eu faria?
>
> Obrigado desde já.
>
> --
>
> ____________ _________ _________ ___
>
> T.·.F.·.A.·.
>
> Fellipe Henrique
>
> [EMAIL PROTECTED] com
>
> [As partes desta mensagem que não continham texto foram removidas]
>
> Abra sua conta no Yahoo! Mail, o único sem limite de espaço para
> armazenamento!
> http://br.mail.yahoo.com/
>
> [As partes desta mensagem que não continham texto foram removidas]
>
> __________________________________________________________
> Veja mapas e encontre as melhores rotas para fugir do trânsito com o Live
> Search Maps!
> http://www.livemaps.com.br/index.aspx?tr=true
>
>
>

--
_________________________________
T.·.F.·.A.·.
Fellipe Henrique
[EMAIL PROTECTED]

[As partes desta mensagem que não continham texto foram removidas]









_________________________________________________________________
Confira vídeos com notícias do NY Times, gols direto do Lance, videocassetadas 
e muito mais no MSN Video!
http://video.msn.com/?mkt=pt-br

Responder a