Delphi e TDateTime

155 views
Skip to first unread message

Diogo Augusto Pereira

unread,
Mar 3, 2010, 8:26:31 PM3/3/10
to DUG-RS - Delphi Users Group Rio Grande do Sul
Boa noite,

Estou desenvolvendo um projeto com o Delphi 2010 e em diversas rotinas
eu preciso obter a estrutura de classes e objetos através de reflexão
e, para isso estou usando o novo sistema de reflexão do Delphi 2010,
que está na unit Rtti.pas.

Até aí tudo bem, mas em determinada rotina preciso setar valores nas
propriedades dos objetos, e para tornar o processo mais dinâmico e
economizar código fui fazer isso via reflexão também. Mas para minha
surpresa, as propriedades do tipo TDateTime não puderam ser setadas,
pois ocorreu erro de conversão (Invalid class typecast).

Segue abaixo o código da rotina (o código parece meio sem sentido mas
coloquei aqui só a parte que interessa hehe):
...
var
lObject: TSomeObject;
lRtti: TRttiContext;
lType: TRttiType;
lProperty: TRttiProperty;
vValue: Variant;
begin
lObject := TSomeObject.Create;
lRtti := TRttiContext.Create;
try
lType := lRtti.GetType(lObject.ClassInfo);
lProperty := lType.GetProperty('Data');

vValue := GetSomeValue; //Este é um método qualquer que retorna um
Variant

if vValue <> null then
lProperty.SetValue(lObject, TValue.FromVariant(vValue)); //ERRO
DE CONVERSÃO
...

Como o SetValue da Rtti.pas não funcionou, recorri para o método
antigo de reflexão da unit TypInfo.pas, que funcionou perfeitamente:
SetPropValue(lObject, 'Data', vValue);

Resolvi então reportar o bug na QualityCentral da Embarcadero e o
pessoal de lá respondeu que isto está correto pois o tipo TDateTime é
na verdade um Double e que eu não posso fazer essa conversão de
Variant para TDateTime.

Ok, TDateTime é na verdade um Double mesmo. Mas aí eu pergunto, porque
no sistema antigo de reflexão a conversão funciona? Já não está na
hora de haver um mecanismo mais eficiente para detectar o type real de
um atributo no Delphi? Não deveria ter um tipo nativo para
trabalharmos com data e hora de forma mais adequada?

Coloquei esses questionamentos lá e a questão foi reaberta. Se mais
alguém concorda comigo e/ou quiser ajudar para que a Embarcadero tome
alguma providência em relação a isso, votem lá! O link da questão é
esse:
http://qc.embarcadero.com/wc/qcmain.aspx?d=82237

Obrigado!

Diogo Augusto Pereira

Wecsley Fey

unread,
Mar 5, 2010, 1:37:07 PM3/5/10
to DUG-RS
 Diogo,
 
 Interessante este teu post.
 
 Acredito que a TRttiProperty poderia ter uma identificação exata para data ou como tu mesmo comentaste, o próprio Delphi poderia ter uma identificação nativa. 
 
 
 Para mim é bug sim e o problema está na TRTTIProperty (métdos GerProperty e SetValue). Houve alguma alteração, restrição ou nova validação com relação ao antigo SetPropValue.
 
 Se quiseres mesmo setar estes valores por reflexão com a nova RTTI, não poderás usar variant... Ou pode testar se teu variant é uma data através das funções da DateUtils. Se for uma data, converte para um TDateTime e atribui o valor convertido por reflexão:
 
 Propriedade.SetValue(Objeto, Data);
 
 Gambiarra ! hehehe
 
 E Generics ? Testou ? Não adianta ?
 
 O problema foi tu ter ganho a licença do Delphi... Agora tu tá enchendo o saco dos caras ! hehehe
 
 Abraço !
 

 Att,
 Wecsley Fey
 Analista de Sistemas
 Aquasoft Tecnologia da Informação
 (51) 3022-3188 - Porto Alegre/RS - Brasil
 Parceira Embarcadero no RS
 http://www.wecsleyfey.com
 http://www.aquasoft.com.br




 
> Date: Wed, 3 Mar 2010 17:26:31 -0800
> Subject: [dug-rs] Delphi e TDateTime
> From: diog...@gmail.com
> To: dug...@googlegroups.com
> --
> Você recebeu esta mensagem porque está inscrito no "DUG-RS -
> Delphi Users Group Rio Grande do Sul" em Grupos do Google.
> Acesse o nosso BLOG em http://www.dug-rs.org e contribua com a comunidade Delphi do Rio Grande do Sul
> Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
> Para cancelar a sua inscrição neste grupo, envie um e-mail para
> dug-rs-un...@googlegroups.com
> Para ver mais opções, visite este grupo em
> http://groups.google.com.br/group/dug-rs?hl=pt-BR


Transforme-se em personagens engraçados. Conheça o novo site de I Love Messenger.

Diogo Augusto Pereira

unread,
Mar 8, 2010, 10:16:26 PM3/8/10
to DUG-RS - Delphi Users Group Rio Grande do Sul
Pois é Wescley, se no método antigo funciona, no novo também deveria
funcionar...

Sim, usando algumas gambiarras é possível contornar o problema, mas
não concordo com a postura do suporte da Embarcadero, de simplesmente
dizer que é assim e deu.

Com generics funciona, mas no meu caso não tem muito sentido usar,
pois tenho que saber o tipo de dado da propriedade para fazer umas
conversões e formatações antes de retornar o Variant.

Pois é, tô enchendo o saco deles, mas é uma crítica construtiva heheh.
Se puderem ajudar votando lá, pode ser que no futuro eles façam
melhorias em relação a esse problema.

Abraço!

Diogo Augusto Pereira

On Mar 5, 3:37 pm, Wecsley Fey <wecsley...@hotmail.com> wrote:
>  Diogo,
>
>  Interessante este teu post.
>
>  Acredito que a TRttiProperty poderia ter uma identificação exata para data ou como tu mesmo comentaste, o próprio Delphi poderia ter uma identificação nativa.
>
>  Para mim é bug sim e o problema está na TRTTIProperty (métdos GerProperty e SetValue). Houve alguma alteração, restrição ou nova validação com relação ao antigo SetPropValue.
>
>  Se quiseres mesmo setar estes valores por reflexão com a nova RTTI, não poderás usar variant... Ou pode testar se teu variant é uma data através das funções da DateUtils. Se for uma data, converte para um TDateTime e atribui o valor convertido por reflexão:
>
>  Propriedade.SetValue(Objeto, Data);
>
>  Gambiarra ! hehehe
>
>  E Generics ? Testou ? Não adianta ?
>
>  O problema foi tu ter ganho a licença do Delphi... Agora tu tá enchendo o saco dos caras ! hehehe
>
>  Abraço !
>
>  Att,
>  Wecsley Fey
>  Analista de Sistemas
>  Aquasoft Tecnologia da Informação
>  (51) 3022-3188 - Porto Alegre/RS - Brasil
>  Parceira Embarcadero no RS
>  http://www.wecsleyfey.com
>  http://www.aquasoft.com.br
>
>
>
>
>
> > Date: Wed, 3 Mar 2010 17:26:31 -0800
> > Subject: [dug-rs] Delphi e TDateTime

> > From: diogoa...@gmail.com

> > Acesse o nosso BLOG emhttp://www.dug-rs.orge contribua com a comunidade Delphi do Rio Grande do Sul


> > Para postar neste grupo, envie um e-mail para dug...@googlegroups.com
> > Para cancelar a sua inscrição neste grupo, envie um e-mail para
> > dug-rs-un...@googlegroups.com
> > Para ver mais opções, visite este grupo em
> >http://groups.google.com.br/group/dug-rs?hl=pt-BR
>

> _________________________________________________________________
> Com o Internet Explorer 8 você fica mais protegido contra ameaças da web. Saiba mais.http://go.microsoft.com/?linkid=9707132

Reply all
Reply to author
Forward
0 new messages