Cor de entrada e saida dos componentes que recebe foco
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:
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.
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
Curtidas 0
Respostas
Rafael Gomes
22/05/2006
tipo cara, acho que já vi no forum topicos explicando ocmo fazer isso de uma forma mais simples, da uma pesquisada ...
[..]s
[..]s
GOSTEI 0
Renato.pavan
22/05/2006
[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
[..]s[/quote:2cff522d91]
Sera q mais alguem saberia me responder, pois dei uma pesquisada e nada encontrei...
Obrigado
Renato
GOSTEI 0
Marco Salles
22/05/2006
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]
GOSTEI 0
Marco Salles
22/05/2006
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]
GOSTEI 0
Renato.pavan
22/05/2006
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
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
GOSTEI 0
Adriano Santos
22/05/2006
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;
GOSTEI 0
Renato.pavan
22/05/2006
[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
procedure TForm1.FormCreate(Sender: TObject);
begin
Screen.OnActiveControlChange := TrocaCor;
end;
[/quote:b1572a5a5c]
Boa Adriano,
Vou testar qq coisa posto aqui novamente.
Obrigado
Renato
GOSTEI 0
Marco Salles
22/05/2006
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.
GOSTEI 0
Adriano Santos
22/05/2006
[quote:0a7492887c=´Marco Salles´]
[b:0a7492887c]Sim eu reparei[/b:0a7492887c]
Então deixa eu ver se entendi...
Voce pergunta primeiro se esta certo :cry:
Depois voce[b:0a7492887c] afirma[/b:0a7492887c] que faz desta forma.. Usando um Laço e ponto Final :?: :?:
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.
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.
GOSTEI 0
Renato.pavan
22/05/2006
[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
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
GOSTEI 0
Renato.pavan
22/05/2006
[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
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
GOSTEI 0
Adriano Santos
22/05/2006
[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
GOSTEI 0