Typecast não funciona !!!
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:
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:
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.
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
Curtidas 0
Respostas
Emerson Nascimento
29/11/2005
tente assim:
class procedure TecUtils.MudaCorCampo(Campo: TObject; const CorCampo: String);
begin
TEdit(Campo).Color := StringToColor(CorCampo);
end;
class procedure TecUtils.MudaCorCampo(Campo: TObject; const CorCampo: String);
begin
TEdit(Campo).Color := StringToColor(CorCampo);
end;
GOSTEI 0
Carlosfim
29/11/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.
Eu queria utilizar uma classe ansestral exatamente para não ter que fazer uma linha para cada tipo de Componente.
Obrigado mesmo assim.
GOSTEI 0
Massuda
29/11/2005
Não teste o tipo de um objeto fazendo......pois isso não leva em conta a possibilidade do Objeto ser de uma classe derivada de TSuaClasse. O teste correto é......que funciona se Objeto for TSuaClasse ou TDerivadoDeSuaClasse.
if Objeto.ClassName = ´TSuaClasse´...
if Objeto is TSuaClasse...
GOSTEI 0
Jairroberto
29/11/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:
Um abraço,
Jair
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
GOSTEI 0
Carlosfim
29/11/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!!!
Realmente eu não tinha observado que a propriedade era Protegida. Esse macete para quebrar a ´Proteção´ é bem interessante.
Valeu mesmo!!!
GOSTEI 0