ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

[Resolvido] Esta correto o código que altera a cor do comp.?

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
pestana
Colaborador
Colaborador


Registrado: Sábado, 25 de Junho de 2005
Mensagens: 3147
Localização: Araras-SP

MensagemEnviada: Qui Set 10, 2009 7:49 pm    Assunto: [Resolvido] Esta correto o código que altera a cor do comp.? Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
marcosalles
Moderador
Moderador


Registrado: Quarta-Feira, 26 de Março de 2008
Mensagens: 1695
Localização: Muriaé Mg

MensagemEnviada: Sáb Set 12, 2009 11:13 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
cainelli
Novato
Novato


Registrado: Sexta-Feira, 29 de Outubro de 2004
Mensagens: 7

MensagemEnviada: Seg Set 14, 2009 8:49 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
cainelli
Novato
Novato


Registrado: Sexta-Feira, 29 de Outubro de 2004
Mensagens: 7

MensagemEnviada: Seg Set 14, 2009 9:16 am    Assunto: Responder com Citação

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
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
pestana
Colaborador
Colaborador


Registrado: Sábado, 25 de Junho de 2005
Mensagens: 3147
Localização: Araras-SP

MensagemEnviada: Seg Set 14, 2009 10:46 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Seg Set 14, 2009 5:07 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
pestana
Colaborador
Colaborador


Registrado: Sábado, 25 de Junho de 2005
Mensagens: 3147
Localização: Araras-SP

MensagemEnviada: Ter Set 15, 2009 10:42 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
pestana
Colaborador
Colaborador


Registrado: Sábado, 25 de Junho de 2005
Mensagens: 3147
Localização: Araras-SP

MensagemEnviada: Qua Set 16, 2009 8:22 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
marcosalles
Moderador
Moderador


Registrado: Quarta-Feira, 26 de Março de 2008
Mensagens: 1695
Localização: Muriaé Mg

MensagemEnviada: Qui Set 17, 2009 7:26 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
pestana
Colaborador
Colaborador


Registrado: Sábado, 25 de Junho de 2005
Mensagens: 3147
Localização: Araras-SP

MensagemEnviada: Qui Set 17, 2009 12:42 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail
AdecioJR
Novato
Novato


Registrado: Quarta-Feira, 20 de Novembro de 2013
Mensagens: 1

MensagemEnviada: Qua Nov 20, 2013 10:55 am    Assunto: Colorir Componente Focado Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB