Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

J. L. Gregorio

Mudar a cor do TDBEdit sem passar o nome do componente!

Recommended Posts

Galera, é o seguinte..... tenho um form com muitos campos.... muitos mesmo....! Passa de 40....! Os usuários são leigos e devo criar um mecanismo que enfatize os campos mudando a cor dos DBEdit´s. No evento onEnter eu posso mudar a cor deles, e no onExit voltar ao normal...! :rolleyes:

 

Até aí tudo bem... o problema é o seguinte: tem muitos campos e eu gostaria de nos eventos citados passar como parâmetro o objeto a ser modificado e não ficar mudando os campos um a um.! Se conseguir posso colocar isso em uma procedure e reutilizar a qualquer momento....! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Em Java ou PHP isso é fácil...basta passar o objeto usando a diretiva "this" e a propriedade do objeto a ser modificada, no Delphi eu não consegui...! <_<

 

Alguém sabe como fazer isso..... ou alguma outra sugestão para resolver o problema....!

 

Aguardo sugestões.... abraços....!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desta forma que especificou, tem uma forma bem simples, basta criar um procedure e passar os parametros, algo do tipo:

 

procedure TForm1.MudarCor(Sender: TObject; tipo: string);beginif Sender.ClassType = TDBEdit then	begin	if tipo = 'E' then		TDBEdit(Sender).Color:=clRed	else		TDBEdit(Sender).Color:=clWindow;	end;end;

E fazer no OnEnter:

 

MudarCor(Sender,'E');

No OnExit:

 

MudarCor(Sender,'S');

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desta forma que especificou, tem uma forma bem simples, basta criar um procedure e passar os parametros, algo do tipo:

procedure TForm1.MudarCor(Sender: TObject; tipo: string);beginif Sender.ClassType = TDBEdit then	begin	if tipo = 'E' then		TDBEdit(Sender).Color:=clRed	else		TDBEdit(Sender).Color:=clWindow;	end;end;
E fazer no OnEnter:
MudarCor(Sender,'E');
No OnExit:
MudarCor(Sender,'S');
SHOW DE BOLA AMIGÃO...! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Deu certinho.....! :rolleyes: Um dos conceitos da Engenharia de Software que diz sobre a facilidade de uso de uma interface é chamar atenção do usuário para algum processo ou campo atual.....! Muito bom mesmo..... Agradeço sua atenção.... Abraços....! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza J. L. Gregorio, precisando estamos aqui :D

Eu agradeço! Agora... sem querer abusar de seus conhecimentos, será que tem como detectar os eventos do componente dentro do form? Por exemplo: ao invés de colocar a sua procedure nos eventos de cada objeto, não teria como eu detectar o tipo de objeto e também o seu evento e, então, teoricamente, eu colocaria essa rotina uma vez só no form e ao entrar no componente Dbedit ele já vai mudar de cor....!?

 

Será que tem como fazer isso?

 

Abraços.... e obrigado mais uma vez!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou ver aqui se tem como fazer isto pelo evento, ou então pelos fontes do componente, quem sabe criando um novo componente derivado do TDBEdit... qualquer coisa coloco o retorno aqui no post...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olhei aqui os fontes do TDBEdit, o que controla a entrada e saída do componente é pelas mensagens CMEnter e CMExit, para não precisar criar um novo componente, você pode fazer o seguinte:

 

Antes da declaração do seu form, logo abaixo do type adicione, depois faça:

TDBEdit = class(DBCtrls.TDBEdit)	procedure CMEnter(var Msg: TMessage); message CM_ENTER;	procedure CMExit(var Msg: TMessage); message CM_EXIT;  end;

Depois o fonte da procedure:

 

{ TDBEdit }procedure TDBEdit.CMEnter(var Msg: TMessage);begincolor:=clRed;end;procedure TDBEdit.CMExit(var Msg: TMessage);begincolor:=clWindow;end;

Os fontes do form de teste meu ficam assim:

 

unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, Mask, DBCtrls;type  TDBEdit = class(StdCtrls.TEdit)	procedure CMEnter(var Msg: TMessage); message CM_ENTER;	procedure CMExit(var Msg: TMessage); message CM_EXIT;  end;  TForm1 = class(TForm)	DBEdit1: TDBEdit;	DBEdit2: TDBEdit;	DBEdit3: TDBEdit;  private	{ Private declarations }  public	{ Public declarations }  end;var  Form1: TForm1;implementation{$R *.dfm}{ TDBEdit }procedure TDBEdit.CMEnter(var Msg: TMessage);begincolor:=clRed;end;procedure TDBEdit.CMExit(var Msg: TMessage);begincolor:=clWindow;end;end.

 

O único problema se bem me lembra, é que os OnEnter e OnExit dos seus DBEdit não vão ser executados...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz uma alteração aqui e funcionou certinho agora, basta colocar o comando inherited depois de mudar a cor, ficando assim:

 

procedure TDBEdit.CMEnter(var Msg: TMessage);beginColor:=clRed;inheritedend;procedure TDBEdit.CMExit(var Msg: TMessage);beginColor:=clWindow;inheritedend;
O fonte fica:

 

unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, Mask, DBCtrls;type  TDBEdit = class(DBCtrls.TDBEdit)	procedure CMEnter(var Msg: TMessage); message CM_ENTER;	procedure CMExit(var Msg: TMessage); message CM_EXIT;  end;  TForm1 = class(TForm)	DBEdit1: TDBEdit;	DBEdit2: TDBEdit;	DBEdit3: TDBEdit;	procedure DBEdit2Exit(Sender: TObject);	procedure DBEdit2Enter(Sender: TObject);  private	{ Private declarations }  public	{ Public declarations }  end;var  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.DBEdit2Enter(Sender: TObject);beginShowMessage('oi');end;procedure TForm1.DBEdit2Exit(Sender: TObject);beginShowMessage('t+');end;{ TDBEdit }procedure TDBEdit.CMEnter(var Msg: TMessage);beginColor:=clRed;inheritedend;procedure TDBEdit.CMExit(var Msg: TMessage);beginColor:=clWindow;inheritedend;end.
Funcionando o OnEnter e OnExit sem problemas, e aplicando a cor sem precisar repetir...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz uma alteração aqui e funcionou certinho agora, basta colocar o comando inherited depois de mudar a cor, ficando assim:

 

procedure TDBEdit.CMEnter(var Msg: TMessage);beginColor:=clRed;inheritedend;procedure TDBEdit.CMExit(var Msg: TMessage);beginColor:=clWindow;inheritedend;
O fonte fica:

 

unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, Mask, DBCtrls;type  TDBEdit = class(DBCtrls.TDBEdit)	procedure CMEnter(var Msg: TMessage); message CM_ENTER;	procedure CMExit(var Msg: TMessage); message CM_EXIT;  end;  TForm1 = class(TForm)	DBEdit1: TDBEdit;	DBEdit2: TDBEdit;	DBEdit3: TDBEdit;	procedure DBEdit2Exit(Sender: TObject);	procedure DBEdit2Enter(Sender: TObject);  private	{ Private declarations }  public	{ Public declarations }  end;var  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.DBEdit2Enter(Sender: TObject);beginShowMessage('oi');end;procedure TForm1.DBEdit2Exit(Sender: TObject);beginShowMessage('t+');end;{ TDBEdit }procedure TDBEdit.CMEnter(var Msg: TMessage);beginColor:=clRed;inheritedend;procedure TDBEdit.CMExit(var Msg: TMessage);beginColor:=clWindow;inheritedend;end.
Funcionando o OnEnter e OnExit sem problemas, e aplicando a cor sem precisar repetir...
Cara... Tu é fera...! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Conseguiu uma maneira de detectar o componente e o seu evento.....! Sabia que tinha como.... afinal, o Delphão é uma baita ferramenta de desenvolvimento, não é mesmo?

Deu certinho.....! Com isso é só reutilizar em outros softwares! Aqui na empresa onde trabalho, vamos começar a colocar em todos os nossos sistemas!!! Muito bom mesmo....!

 

marcio.theis, muito obrigado e abraços....! http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

J. L. Gregorio, se quiser veja este post -> http://forum.imasters.com.br/index.php?showtopic=230402

Alterei um pouco o procedimento inicial, tornando mais fácil propagar a alteração de cor em outros forms, bastando apenas declarar uma unit na uses...

valew... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.