Array
(
)

Typecast não funciona !!!

Carlosfim
   - 29 nov 2005

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:

#Código


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:

#Código
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.


Emerson
   - 29 nov 2005

tente assim:

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


Carlosfim
   - 29 nov 2005

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.


Massuda
   - 29 nov 2005

Não teste o tipo de um objeto fazendo...#Código

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 é...#Código
if Objeto is TSuaClasse...
...que funciona se Objeto for TSuaClasse ou TDerivadoDeSuaClasse.


Jairroberto
   - 29 nov 2005

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:

#Código


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


Carlosfim
   - 30 nov 2005

Obrigado, Jair.

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


Valeu mesmo!!!