Typecast não funciona !!!

29/11/2005

0

Nobres colegas,

Estou com o seguinte problema:

Tenho um procedimento que muda a cor de cada campo quando este recebe o foco. O procedimento é este:

class procedure TecUtils.MudaCorCampo(Campo: TObject; const CorCampo: String);
begin
   if Campo.ClassName = ´TEdit´ then (Campo as TEdit).Color := StringToColor(CorCampo);
   if Campo.ClassName = ´TComboBox´ then (Campo as TComboBox).Color := StringToColor(CorCampo);
   if Campo.ClassName = ´TMemo´ then (Campo as TMemo).Color := StringToColor(CorCampo);
   if Campo.ClassName = ´TDateTimePicker´ then (Campo as TDateTimePicker).Color := StringToColor(CorCampo);
   if Campo.ClassName = ´TMaskEdit´ then (Campo as TMaskEdit).Color := StringToColor(CorCampo);
   if Campo.ClassName = ´TStringGrid´then (Campo as TStringGrid).Color := StringToColor(CorCampo);
   if Campo.ClassName = ´TListBox´then (Campo as TListBox).Color := StringToColor(CorCampo);
end;


Como vcs viram eu testo o tipo do campo passado como parâmetro para fazer o typecast correto.
Porém, como a propriedade Color é uma propriedade de TControl, que é o ansestral dos objetos que utilizo neste procedimento, pensei em fazer desta forma:

class procedure TecUtils.MudaCorCampo(Campo: TObject; const CorCampo: String);
begin
   (Campo as TControl).Color := StringToColor(CorCampo);
end;


O problema é que qando compilo este procedimento o Delphi diz que a propriedade Color não existe.

Alguém tem idéia do que está acontecendo?

Qualquer dica será bem-vinda.


Carlosfim

Carlosfim

Responder

Posts

29/11/2005

Emerson Nascimento

tente assim:

class procedure TecUtils.MudaCorCampo(Campo: TObject; const CorCampo: String);
begin
TEdit(Campo).Color := StringToColor(CorCampo);
end;


Responder

29/11/2005

Carlosfim

Acontece que o parâmetro nem sempre é um TEdit. Aí dá erro.

Eu queria utilizar uma classe ansestral exatamente para não ter que fazer uma linha para cada tipo de Componente.


Obrigado mesmo assim.


Responder

29/11/2005

Massuda

Não teste o tipo de um objeto fazendo...
if Objeto.ClassName = ´TSuaClasse´...
...pois isso não leva em conta a possibilidade do Objeto ser de uma classe derivada de TSuaClasse. O teste correto é...
if Objeto is TSuaClasse...
...que funciona se Objeto for TSuaClasse ou TDerivadoDeSuaClasse.


Responder

29/11/2005

Jairroberto

Olá, Carlos!

A mensagem de erro é apresentada pelo Delphi porque, se você reparar bem no Help do ´TControl´, a propriedade ´Color´ é do tipo ´Protected´, visível apenas para classes derivadas de ´TControl´, ou para classes declaradas dentro da mesma Unit de ´TControl´.

Sendo assim, é possível ´passar a perna´ na limitação de acesso a essa propriedade se você declarar uma classe derivada de ´TControl´ na mesma Unit onde está o seu código de mudança de cor, utilizando um typecast simples para acessar a propriedade ´Color´. Veja um exemplo:

interface

uses
  Controls;

type
  THackControl = class(TControl);

implementation

class procedure TecUtils.MudaCorCampo(Campo: TObject; const CorCampo: String);
begin
  if Campo is TControl then
    (Campo as THackControl).Color := StringToColor(CorCampo);
end;



Um abraço,
Jair


Responder

30/11/2005

Carlosfim

Obrigado, Jair.

Realmente eu não tinha observado que a propriedade era Protegida. Esse macete para quebrar a ´Proteção´ é bem interessante.


Valeu mesmo!!!


Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar