Fórum Cor de entrada e saida dos componentes que recebe foco #321912

22/05/2006

0

Boa noite,

Nos meus forms faço como o código abaixo pra controlar a cor de entrada e saida dos componentes q recebe foco:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    edt1: TEdit;
    cbb1: TComboBox;
    edt2: TEdit;
    cbb2: TComboBox;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    FcorEntrada: TColor;
    procedure CorEntrada(Sender: TObject);
    procedure CorSaida(Sender: TObject);
    procedure CorFoco(Sender: TObject);
  public
    { Public declarations }
  end;

  THack = class(TWinControl);

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.CorEntrada(Sender: TObject);
begin
  FCorEntrada := THack(Sender).Color;
  THack(Sender).Color := clYellow;
end;

procedure TForm1.CorFoco(Sender: TObject);
var
  i: Integer;
begin
  with Sender do
  begin
    for i := 0 to ComponentCount - 1 do
      if (Components[i] is TCustomEdit) or
         (Components[i] is TCustomComboBox) then
      begin
        THack(Components[i]).OnEnter := CorEntrada;
        THack(Components[i]).OnExit := CorSaida;
      end;
  end;
end;

procedure TForm1.CorSaida(Sender: TObject);
begin
  THack(Sender).Color := FCorEntrada;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  CorFoco(Sender);
end;

end. 


Agora tenho 3 perguntas com relação a isso:

1 - Dessa forma que eu estou fazendo esta correto?

2 - Caso em algum DBEdit eu fizer alguma programação no envento OnEnter ou OnExit ele é sobreposto pela procedure CorEntrada ou CorSaida, como posso fazer pra executar o codigo q esta no DbEdit + o CorEntrada?

3 - Caso eu queira reaproveitar essas procedures em outro form, como poderia ser feito?
Teria que criar uma classe pra poder estar chamando esta classe em todos os forms que eu for usar?

Seria isso...

Obrigado

Renato.


Renato.pavan

Renato.pavan

Responder

Posts

23/05/2006

Rafael Gomes

tipo cara, acho que já vi no forum topicos explicando ocmo fazer isso de uma forma mais simples, da uma pesquisada ...
[..]s


Responder

Gostei + 0

23/05/2006

Renato.pavan

[quote:2cff522d91=´Rafael Gomes´]tipo cara, acho que já vi no forum topicos explicando ocmo fazer isso de uma forma mais simples, da uma pesquisada ...
[..]s[/quote:2cff522d91]

Sera q mais alguem saberia me responder, pois dei uma pesquisada e nada encontrei...

Obrigado

Renato


Responder

Gostei + 0

24/05/2006

Marco Salles

Nos meus forms faço como o código abaixo pra controlar a cor de entrada e saida dos componentes q recebe foco:


Não vejo dificuldade para se obter este efeito. Se é que entendi direito

Voce deve apenas ter um manipulador de evento onexit e um manipulador do evento onEnter [b:84d40e3058]comum[/b:84d40e3058] a todos os componentes

Como é feito isto ?????

Simples .. No objeto inspector na guia Events do componente selecionado , no evento onExit ou evento OnEnter , [b:84d40e3058]Escolha um Nome para estes eventos [/b:84d40e3058]..Por exemplo [b:84d40e3058]OnenterGeral e OnExitGeral[/b:84d40e3058]
Depois de dois clicks e o delpphi faz isto o resto para voce

procedure TForm1.EditEnterGeral(Sender: TObject);
begin
//atribuir a cor
end;

procedure TForm1.EditExitGeral(Sender: TObject);
begin
//atribuir a cor
end;


Feito isto , para cada componente que usufruir desse mesmo manipulador
é so atribuir no objeto inspector na guia Events os mesmos manipuladores

Ao selecionar a guia certamente ira aparecer os eventos com o mesmo Nome..Escolha estes eventos para[b:84d40e3058] ´todos´[/b:84d40e3058] os componentes..Com isto voce tem um mesmo manipulador para esses componentes

2 - Caso em algum DBEdit eu fizer alguma programação no envento OnEnter ou OnExit ele é sobreposto pela procedure CorEntrada ou CorSaida, como posso fazer pra executar o codigo q esta no DbEdit + o CorEntrada?


2) Caso voce tenha um componente que alem de atribuir a cor , tenha outros codigos para processar nesses eventos , voce tem que atribuir um evento onexit e um evento onenter diferente para esses componentes.. Mas para não ter que escrever codigos repetidos , voce pode chamar esse métodos ,

procedure TForm1.EditExitParticular(Sender: TObject);
begin
Form1.EditExitGeral(sender);
//Fazer o que tem que fazer
end;

procedure TForm1.EditEnterParticular(Sender: TObject);
begin
Form1.EditEnterGeral(sender);
//Fazer o que tem que fazer
end;


3 - Caso eu queira reaproveitar essas procedures em outro form, como poderia ser feito? Teria que criar uma classe pra poder estar chamando esta classe em todos os forms que eu for usar?


Devido a simplicidade do codigo , não vejo ganhos ...Mas nada impede que voce coloque esse métodos em um form que possa ser acessado por
todos os form do projeto.. Basta passar o paramentros correspondende (No caso o sender) e chamar a procedure correta

[b:84d40e3058]Deu para entender ??? Fui Claro ???[/b:84d40e3058]


Responder

Gostei + 0

24/05/2006

Marco Salles

Nos meus forms faço como o código abaixo pra controlar a cor de entrada e saida dos componentes q recebe foco:


Não vejo dificuldade para se obter este efeito. Se é que entendi direito

Voce deve apenas ter um manipulador de evento onexit e um manipulador do evento onEnter [b:21ac546272]comum[/b:21ac546272] a todos os componentes

Como é feito isto ?????

Simples .. No objeto inspector na guia Events do componente selecionado , no evento onExit ou evento OnEnter , [b:21ac546272]Escolha um Nome para estes eventos [/b:21ac546272]..Por exemplo [b:21ac546272]OnenterGeral e OnExitGeral[/b:21ac546272]
Depois de dois clicks e o delpphi faz isto o resto para voce

procedure TForm1.EditEnterGeral(Sender: TObject);
begin
//atribuir a cor
end;

procedure TForm1.EditExitGeral(Sender: TObject);
begin
//atribuir a cor
end;


Feito isto , para cada componente que usufruir desse mesmo manipulador
é so atribuir no objeto inspector na guia Events os mesmos manipuladores

Ao selecionar a guia certamente ira aparecer os eventos com o mesmo Nome..Escolha estes eventos para[b:21ac546272] ´todos´[/b:21ac546272] os componentes..Com isto voce tem um mesmo manipulador para esses componentes

2 - Caso em algum DBEdit eu fizer alguma programação no envento OnEnter ou OnExit ele é sobreposto pela procedure CorEntrada ou CorSaida, como posso fazer pra executar o codigo q esta no DbEdit + o CorEntrada?


2) Caso voce tenha um componente que alem de atribuir a cor , tenha outros codigos para processar nesses eventos , voce tem que atribuir um evento onexit e um evento onenter diferente para esses componentes.. Mas para não ter que escrever codigos repetidos , voce pode chamar esse métodos ,

procedure TForm1.EditExitParticular(Sender: TObject);
begin
Form1.EditExitGeral(sender);
//Fazer o que tem que fazer
end;

procedure TForm1.EditEnterParticular(Sender: TObject);
begin
Form1.EditEnterGeral(sender);
//Fazer o que tem que fazer
end;


3 - Caso eu queira reaproveitar essas procedures em outro form, como poderia ser feito? Teria que criar uma classe pra poder estar chamando esta classe em todos os forms que eu for usar?


Devido a simplicidade do codigo , não vejo ganhos ...Mas nada impede que voce coloque esse métodos em um form que possa ser acessado por
todos os form do projeto.. Basta passar o paramentros correspondende (No caso o sender) e chamar a procedure correta

[b:21ac546272]Deu para entender ??? Fui Claro ???[/b:21ac546272]


Responder

Gostei + 0

24/05/2006

Renato.pavan

Ola Marcos

Primeiramente obrigado pela sua resposta, mas vc reparou que eu tenho um laço que varre o form e atribui ao OnExit e OnEnter dos componentes as procedures CorSaida e CorEntrada?
Faço dessa forma pq caso eu inclua algum dbEdit no form não preciso ficar me preocupando em atribuir o OnEnter e OnExit, penso que desta forma não corro o risco de deixar algum componente sem cor de foco, por isso a pergunta de como atribuir o OnEnter pelo laço mas sem sobrepor a programação que eu ja tinha em algum Edit especifico.
Espero ter sido claro.

Mas um vez obrigado.

Renato


Responder

Gostei + 0

24/05/2006

Adriano Santos

Ola Marcos Primeiramente obrigado pela sua resposta, mas vc reparou que eu tenho um laço que varre o form e atribui ao OnExit e OnEnter dos componentes as procedures CorSaida e CorEntrada? Faço dessa forma pq caso eu inclua algum dbEdit no form não preciso ficar me preocupando em atribuir o OnEnter e OnExit, penso que desta forma não corro o risco de deixar algum componente sem cor de foco, por isso a pergunta de como atribuir o OnEnter pelo laço mas sem sobrepor a programação que eu ja tinha em algum Edit especifico. Espero ter sido claro. Mas um vez obrigado. Renato


Cara, não precisa disso tudo não. Vc precisa apenas desviar o evento onMessage da classe TApplication para o seu evento de cor. Veja:

procedure TForm1.FormShow(Sender: TObject);
begin
  Application.OnMessage := MudaCor;
end;


Cria uma função em uma UNIT que todos os forms enxergam fazendo a troca, algo como:

procedure TForm1.TrocaCor(Sender: TObject);
var
  I: Integer;
begin
  for I:= 0 to ComponentCount -1 do
    if Components[I] is TEdit then
      if TEdit(Components[I]).Focused then
        TEdit(Components[I]).Color := clBlue
      else
        TEdit(Components[I]).Color := clWhite;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Screen.OnActiveControlChange := TrocaCor;
end;



Responder

Gostei + 0

24/05/2006

Renato.pavan

[quote:b1572a5a5c=´Adriano Santos´]
procedure TForm1.FormCreate(Sender: TObject);
begin
Screen.OnActiveControlChange := TrocaCor;
end;
[/quote:b1572a5a5c]

Boa Adriano,

Vou testar qq coisa posto aqui novamente.

Obrigado

Renato


Responder

Gostei + 0

24/05/2006

Marco Salles

Primeiramente obrigado pela sua resposta, mas vc reparou que [b:4639723ebb]eu tenho um laço [/b:4639723ebb]que varre o form e atribui ao OnExit e OnEnter dos componentes as procedures CorSaida e CorEntrada?


[b:4639723ebb]Sim eu reparei[/b:4639723ebb]

Então deixa eu ver se entendi...

Voce pergunta primeiro se esta certo :cry:

1 - Dessa forma que eu estou fazendo esta correto?


Depois voce[b:4639723ebb] afirma[/b:4639723ebb] que faz desta forma.. Usando um Laço e ponto Final :?: :?:

Faço dessa forma pq caso eu inclua algum dbEdit no form não preciso ficar me preocupando em atribuir o OnEnter e OnExit, penso que desta forma não corro o risco de deixar algum componente sem cor de foco


Eu sou categorico em dizer que é uma prática ruim.. É desaconselhável.


Responder

Gostei + 0

24/05/2006

Adriano Santos

[quote:0a7492887c=´Marco Salles´]
Primeiramente obrigado pela sua resposta, mas vc reparou que [b:0a7492887c]eu tenho um laço [/b:0a7492887c]que varre o form e atribui ao OnExit e OnEnter dos componentes as procedures CorSaida e CorEntrada?


[b:0a7492887c]Sim eu reparei[/b:0a7492887c]

Então deixa eu ver se entendi...

Voce pergunta primeiro se esta certo :cry:

1 - Dessa forma que eu estou fazendo esta correto?


Depois voce[b:0a7492887c] afirma[/b:0a7492887c] que faz desta forma.. Usando um Laço e ponto Final :?: :?:

Faço dessa forma pq caso eu inclua algum dbEdit no form não preciso ficar me preocupando em atribuir o OnEnter e OnExit, penso que desta forma não corro o risco de deixar algum componente sem cor de foco


Eu sou categorico em dizer que é uma prática ruim.. É desaconselhável.[/quote:0a7492887c]

Inclusive, é possível criar um componente não-visual que faz isso. Eu tenho o meu próprio, assim coloco apenas um componente na tela principal. Configuro as cores de entrada e saída e ativo...ja era, aplicação inteira mudada.


Responder

Gostei + 0

25/05/2006

Renato.pavan

[quote:94d366b2ff=´Adriano Santos´]
Inclusive, é possível criar um componente não-visual que faz isso. Eu tenho o meu próprio, assim coloco apenas um componente na tela principal. Configuro as cores de entrada e saída e ativo...ja era, aplicação inteira mudada.[/quote:94d366b2ff]
Adriano, e como eu faço pra deixar esse exemplo q vc mandou pra todo projeto, gostaria de criar essa unit no menu principal e ele agisse em todo projeto.

Obrigado

Renato


Responder

Gostei + 0

25/05/2006

Renato.pavan

[quote:e2cf27381e=´Adriano Santos´]
Inclusive, é possível criar um componente não-visual que faz isso. Eu tenho o meu próprio, assim coloco apenas um componente na tela principal. Configuro as cores de entrada e saída e ativo...ja era, aplicação inteira mudada.[/quote:e2cf27381e]
Adriano, e como eu faço pra deixar esse exemplo q vc mandou pra todo projeto, gostaria de criar essa unit no menu principal e ele agisse em todo projeto.

Obrigado

Renato


Responder

Gostei + 0

25/05/2006

Adriano Santos

[quote:82d52c914a=´Adriano Santos´] Inclusive, é possível criar um componente não-visual que faz isso. Eu tenho o meu próprio, assim coloco apenas um componente na tela principal. Configuro as cores de entrada e saída e ativo...ja era, aplicação inteira mudada.

Adriano, e como eu faço pra deixar esse exemplo q vc mandou pra todo projeto, gostaria de criar essa unit no menu principal e ele agisse em todo projeto.

Obrigado

Renato[/quote:82d52c914a]


Na realidade nem precisa cara de unit cara. Apenas insira a função TrocaCor no form principal e no onCreate, onShow ou onActivate do principal vc desvia o evento OnActiveControlChange para sua procedure que troca a cor. Só que o algotirimo que eu coloquei tah bem simples. Precisa fazer algumas verificações como por exemplo:

[list:82d52c914a]
[*:82d52c914a] Verificar se o form está ativo: [b:82d52c914a][color=red:82d52c914a]If Screen.ActiveForm <> nil then[/color:82d52c914a][/b:82d52c914a].
[*:82d52c914a] Verificar se o controle tem a propriedade color e etc.
[/list:u:82d52c914a]

E etc. Só precisa implementar.
Se quiser colocar uma configuração do sistema para ele ativar ou não a mudança de cores vc pode desativar com o esquema:

OnActiveControlChange := Nil; //volta ao normal da aplicação


Flw


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar