![ActiveDelphi - Índice do Fórum](templates/subSilver/images/logo_phpBB.gif) |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
pestana Colaborador
![Colaborador Colaborador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/colaborador.gif)
Registrado: Sábado, 25 de Junho de 2005 Mensagens: 3147 Localização: Araras-SP
|
Enviada: Qui Set 10, 2009 7:49 pm Assunto: [Resolvido] Esta correto o código que altera a cor do comp.? |
|
|
Eu peguei este código na web e gostaria de saber a opnião dos colegas.
O objetivo é alterar a cor do componente que recebe o foco!
Código: | unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, Spin, Mask;
type
TForm1 = class(TForm)
Edit1: TEdit;
Memo1: TMemo;
ComboBox1: TComboBox;
Button1: TButton;
MaskEdit1: TMaskEdit;
SpinEdit1: TSpinEdit;
DateTimePicker1: TDateTimePicker;
CheckBox1: TCheckBox;
RadioButton1: TRadioButton;
RadioGroup1: TRadioGroup;
Edit2: TEdit;
Button2: TButton;
Button3: TButton;
procedure FormShow(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
objAnterior : TEdit;
color : TColor;
procedure ControlChange(Sender: TObject);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit2, Unit3;
{$R *.dfm}
procedure TForm1.ControlChange(Sender: TObject);
begin
if Assigned(objAnterior) then
objAnterior.Color := color;
if (Screen.ActiveControl is TEdit) and
((Screen.ActiveControl as TEdit).Color = clBtnFace) then
exit
else
if (Screen.ActiveControl is TEdit) or (Screen.ActiveControl is TRadioButton) or
(Screen.ActiveControl is TCheckBox) or (Screen.ActiveControl is TMaskEdit) or
(Screen.ActiveControl is TRadioGroup) or (Screen.ActiveControl is TComboBox) or
(Screen.ActiveControl is TSpinEdit) or (Screen.ActiveControl is TMemo) or
(Screen.ActiveControl is TDateTimePicker) then
begin
objAnterior := TEdit(Screen.ActiveControl);
color := objAnterior.Color;
TEdit(Screen.ActiveControl).Color := clCream;
end
else
objAnterior := nil;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
Screen.OnActiveControlChange := ControlChange;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Screen.OnActiveControlChange := nil;
end; |
Entendi parte do código, mas estas duas linhas abaixo eu não consegui entender:
Citação: | objAnterior := TEdit(Screen.ActiveControl);
...
TEdit(Screen.ActiveControl).Color := clCream; |
sabendo que o objeto ativo pode ser de vários tipos (que satisfaz a condição do IF). Porque TEdit permite? O código funciona, mas isso está correto? _________________ Ao invés de ficar desanimado no que deu de errado, olhe para frente, aprenda com os erros e veja o que ainda pode ser feito. A determinação e a persistência é uma das etapas para o sucesso.
Editado pela última vez por pestana em Qui Set 17, 2009 12:51 pm, num total de 1 vez |
|
Voltar ao Topo |
|
![](templates/subSilver/images/spacer.gif) |
marcosalles Moderador
![Moderador Moderador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/moderador.gif)
Registrado: Quarta-Feira, 26 de Março de 2008 Mensagens: 1695 Localização: Muriaé Mg
|
Enviada: Sáb Set 12, 2009 11:13 am Assunto: |
|
|
olha pestana , no meu ver , deve funcionar , mas este codigo com
ifs ... se for isto ,se for aquilo , se não for isto nen aquilo , se for isto e
aquilo .. etc... como vc mesmo sabe , deve ser evitado ..
Eu sugiro que vc faça o Teste usando este POG
type
TClasshelper = class(TControl)
public
property Color;
end;
{Apesar do nome ClasseHelpher , não estamos diante de classes Helper em
sua definição :
Citação: | Não modificar classes source do delphi.
Não precisar instalar um componente novo.
E fácil implementação para código já existente. | }
Isto é apenas uma Herança ... OK ??
Dai definido esta simpes classe Hedada da TControl e adicionada a ela
uma propriedade , podemos implementar
Código: | type
Tclasshelper = class(TControl)
public
property Color;
end; |
Código: | type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
controle: TWinControl;
CorAnterior: TColor;
procedure ControlColorChange(Sender: TObject);
public
{ Public declarations }
end; |
const
CorSemFoco = clWindow;
CorComFoco = clBlue;
{ TForm1 }
Código: | procedure TForm1. ControlColorChange(Sender: TObject);
begin
if controle <> nil then
try
Tclasshelper(Controle).Color := CorAnterior;
except
end;
with Screen.ActiveForm do
begin
if ActiveControl is TWinControl then
try
CorAnterior := Tclasshelper(ActiveControl).Color;
Controle := ActiveControl;
Tclasshelper(Controle).Color := CorComFoco;
except
end;
end;
end; |
Código: | procedure TForm1.FormCreate(Sender: TObject);
begin
Screen.OnActiveControlChange := ControlColorChange;
end; |
Código: | procedure TForm1.FormDestroy(Sender: TObject);
begin
Screen.OnActiveControlChange := nil;
end; |
|
|
Voltar ao Topo |
|
![](templates/subSilver/images/spacer.gif) |
cainelli Novato
![Novato Novato](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/star1.gif)
Registrado: Sexta-Feira, 29 de Outubro de 2004 Mensagens: 7
|
Enviada: Seg Set 14, 2009 8:49 am Assunto: |
|
|
marcosalles implementei conforme vc postou no forum mas esta ocorrendo erro de acess violation de maneira intermitente, ou seja, eu estou trabalhando no programa, abrindo e fechando forms qdo, de repente, ocorre o erro.
Os comandos Código: | Screen.OnActiveControlChange:= ControlColorChange | e Código: | Screen.OnActiveControlChange := nil; | devem ser colocados em todos os forms do projeto ou apenas no form principal ? |
|
Voltar ao Topo |
|
![](templates/subSilver/images/spacer.gif) |
cainelli Novato
![Novato Novato](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/star1.gif)
Registrado: Sexta-Feira, 29 de Outubro de 2004 Mensagens: 7
|
Enviada: Seg Set 14, 2009 9:16 am Assunto: |
|
|
marcos, me parece que o comando Código: | if controle <> nil then | não esta funcionando. Tentei colocar um begin/end nele e dai para de trocar as cores. Acredito que esta tentando trocar as cores mesmo se o componente = nil e dai provoca o acess violation.
Só q não consegui resolver ... ![Crying or Very sad](images/smiles/icon_cry.gif) |
|
Voltar ao Topo |
|
![](templates/subSilver/images/spacer.gif) |
pestana Colaborador
![Colaborador Colaborador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/colaborador.gif)
Registrado: Sábado, 25 de Junho de 2005 Mensagens: 3147 Localização: Araras-SP
|
Enviada: Seg Set 14, 2009 10:46 am Assunto: |
|
|
bom dia MarcoSalles!
Obrigado por responder a minha dúvida!!!
Eu vou testar o seu código, mas adiantando, gostaria de saber porque você utiliza um bloco try ... except end e no bloco da exceção não tem nada declarado. Porque você implementou dessa maneira? Qual a finalidade?
E você saberia me dizer o que siginifica esta citação que eu postei:
Citação: | objAnterior := TEdit(Screen.ActiveControl);
...
TEdit(Screen.ActiveControl).Color := clCream; |
Obrigado pela sua atenção! _________________ Ao invés de ficar desanimado no que deu de errado, olhe para frente, aprenda com os erros e veja o que ainda pode ser feito. A determinação e a persistência é uma das etapas para o sucesso. |
|
Voltar ao Topo |
|
![](templates/subSilver/images/spacer.gif) |
gilsonnrodrigues Moderador
![Moderador Moderador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/moderador.gif)
Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Seg Set 14, 2009 5:07 pm Assunto: |
|
|
Código: | if controle <> nil then
try
Tclasshelper(Controle).Color := CorAnterior;
Controle := nil;
except
end; |
try
...
...
except
end;
suprime a exceção, pelo fato de não lançar outra ou relaçar a mesma. |
|
Voltar ao Topo |
|
![](templates/subSilver/images/spacer.gif) |
pestana Colaborador
![Colaborador Colaborador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/colaborador.gif)
Registrado: Sábado, 25 de Junho de 2005 Mensagens: 3147 Localização: Araras-SP
|
Enviada: Ter Set 15, 2009 10:42 am Assunto: |
|
|
valeu pela resposta Gilson!
Eu não utilizo desta forma, mas como eu andei pesquisando que tem mais pessoas que utilizam, eu queria saber o porque.
Gilson não querendo abusar de sua boa vontade, você poderia explicar o significado desta citação abaixo, no qual foi descrito no meu primeiro post.
Citação: | objAnterior := TEdit(Screen.ActiveControl);
...
TEdit(Screen.ActiveControl).Color := clCream; |
Objeto ativo pode ser de vários tipos (que satisfaz a condição do IF). Porque TEdit permite? O código funciona, mas isso está correto?
eu pesquisei na web, mas não encontrei a resposta, você poderia me ajudar?
Obrigado! _________________ Ao invés de ficar desanimado no que deu de errado, olhe para frente, aprenda com os erros e veja o que ainda pode ser feito. A determinação e a persistência é uma das etapas para o sucesso. |
|
Voltar ao Topo |
|
![](templates/subSilver/images/spacer.gif) |
pestana Colaborador
![Colaborador Colaborador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/colaborador.gif)
Registrado: Sábado, 25 de Junho de 2005 Mensagens: 3147 Localização: Araras-SP
|
Enviada: Qua Set 16, 2009 8:22 pm Assunto: |
|
|
UP _________________ Ao invés de ficar desanimado no que deu de errado, olhe para frente, aprenda com os erros e veja o que ainda pode ser feito. A determinação e a persistência é uma das etapas para o sucesso. |
|
Voltar ao Topo |
|
![](templates/subSilver/images/spacer.gif) |
marcosalles Moderador
![Moderador Moderador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/moderador.gif)
Registrado: Quarta-Feira, 26 de Março de 2008 Mensagens: 1695 Localização: Muriaé Mg
|
Enviada: Qui Set 17, 2009 7:26 am Assunto: |
|
|
Citação: | Objeto ativo pode ser de vários tipos (que satisfaz a condição do IF). Porque TEdit permite? O código funciona, mas isso está correto? |
funciona mas não funciona ...Pelo menos não deveria ... mas funciona
qnd vc faz o Typcast TClass(Objeto) , coisa estranhas pode ocorrer ou
deixarem de ocorrer. e aproveitando desta fragilidade do delphi o se usa
este POG.
Quer ver seu codigo da pau ,troque o
Código: | objAnterior := Tedit(Screen.ActiveControl )
por
objAnterior := (Screen.ActiveControl as Tedit); |
Ai fica comprovado de fato o que todos sabemos :
Código: | Objeto ativo pode ser de vários tipos |
O que recomenda :
Citação: | TTipo(Objeto) é um type-cast estilo C.
(Objeto as TTipo), nos bastidores, testa o tipo do objeto usando um "IS", que é um operador RTTI, e RTTI é lento, sempre vai ser. As boas práticas sempre sugerem este método, é mais seguro, MAS se você tiver certeza sobre o tipo que está convertendo, com certeza o type cast estilo C vai ser sempre mais rápido. |
Existem outros exemplos que ser pode burlar ou tirar proveito desta
condição a que o Delphi permite ... O Próprio codigo apresentado por
mim , tb tira proveito deste Artificio ... Afinal
Tclasshelper(Controle).Color := CorComFoco;
e qnd o Controle for um Button que não tem esta propriedade Color ???
Deveria dar uma exceção , mas nada acontece e vamos simbora...
Alem disso
(Controle as Tclasshelper).color :=
// Nen compila o que é mais do que Normal , é so olhar as definiçoes de
// Tclasshelper e de Controle ... Troque Controle para TControl que
//o compilador aceita porém na execução
(Controle as Tclasshelper).color := corComFoco;
vai dar erro de Tipos Inválidos ,afinal o Controle não é um Tclasshelper
Finalizando ...
Veja , no inicio eu não questionei desta Fragilidade que ambos os codigos
usam ( O primeiro o seu de modo mais escancarado o segundo o meu de
forma mais velada ) o que eu questionei foi a quantidade de IFS
Mas tecnicamente ambos os codigos estão errados , so que ao mer ver o
segundo é mais legivel do que o primeiro e ambos usam este POG. |
|
Voltar ao Topo |
|
![](templates/subSilver/images/spacer.gif) |
pestana Colaborador
![Colaborador Colaborador](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/colaborador.gif)
Registrado: Sábado, 25 de Junho de 2005 Mensagens: 3147 Localização: Araras-SP
|
Enviada: Qui Set 17, 2009 12:42 pm Assunto: |
|
|
Obrigado a todos que me ajudaram pela a explicação que foi de grande importância! Agora eu entendi do problema que pode ocorrer.
É sempre bom contar com pessoas como vocês!!!! _________________ Ao invés de ficar desanimado no que deu de errado, olhe para frente, aprenda com os erros e veja o que ainda pode ser feito. A determinação e a persistência é uma das etapas para o sucesso. |
|
Voltar ao Topo |
|
![](templates/subSilver/images/spacer.gif) |
AdecioJR Novato
![Novato Novato](../modules/PNphpBB2/templates/PNTheme/images/narodniki-classic/star1.gif)
Registrado: Quarta-Feira, 20 de Novembro de 2013 Mensagens: 1
|
Enviada: Qua Nov 20, 2013 10:55 am Assunto: Colorir Componente Focado |
|
|
Bom dia Pessoal, sei que o post é antigo mas fica aqui minha solução para futuras duvidas e até mesmo para conhecimento da técnica,
na técnica implementada eu nao preciso me ater a classe do componente dada a variedade de edits por exemplo de diversos fabricantes, apenas aponto peculiaridades da propriedade que desejo controlar
private
LastScreenControl: TWinControl;
procedure ChangeColorOnFocus(Sender: TObject);
public
procedure FormCreate(Sender: TObject);
implementation
procedure TFrmRomaneioNovo.FormCreate(Sender: TObject);
begin
Screen.OnActiveControlChange:= ChangeColorOnFocus;
end;
procedure TFrmRomaneioNovo.FormClose(Sender: TObject; var Action: TCloseAction);
begin
{Importante para evitar access violation no encerramento da aplicação}
Screen.OnActiveControlChange:= Nil;
end;
procedure TFrmRomaneioNovo.ChangeColorOnFocus(Sender: TObject);
procedure SetColor(AObject: TObject; AColor: TColor);
begin
if isPublishedProp(AObject, 'Color') then
begin
if (isPublishedProp(AObject, 'Text')) or (isPublishedProp(AObject, 'Lines')) then
begin
SetPropValue(AObject,'Color', AColor);
end;
end;
end;
begin
if Assigned(LastScreenControl) then
begin
SetColor(LastScreenControl, clSilver);
end;
SetColor(ActiveControl, clYellow);
LastScreenControl:= ActiveControl;
end; |
|
Voltar ao Topo |
|
![](templates/subSilver/images/spacer.gif) |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|