Typecast não funciona !!!
29/11/2005
0
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
Posts
29/11/2005
Emerson Nascimento
class procedure TecUtils.MudaCorCampo(Campo: TObject; const CorCampo: String);
begin
TEdit(Campo).Color := StringToColor(CorCampo);
end;
29/11/2005
Carlosfim
Eu queria utilizar uma classe ansestral exatamente para não ter que fazer uma linha para cada tipo de Componente.
Obrigado mesmo assim.
29/11/2005
Massuda
if Objeto.ClassName = ´TSuaClasse´...
if Objeto is TSuaClasse...
29/11/2005
Jairroberto
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
30/11/2005
Carlosfim
Realmente eu não tinha observado que a propriedade era Protegida. Esse macete para quebrar a ´Proteção´ é bem interessante.
Valeu mesmo!!!
Clique aqui para fazer login e interagir na Comunidade :)