Fórum Cor de entrada e saida dos componentes que recebe foco #321912
22/05/2006
0
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
Curtir tópico
+ 0Posts
23/05/2006
Rafael Gomes
[..]s
Gostei + 0
23/05/2006
Renato.pavan
[..]s[/quote:2cff522d91]
Sera q mais alguem saberia me responder, pois dei uma pesquisada e nada encontrei...
Obrigado
Renato
Gostei + 0
24/05/2006
Marco Salles
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 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;
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
24/05/2006
Marco Salles
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 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;
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
24/05/2006
Renato.pavan
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
24/05/2006
Adriano Santos
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
24/05/2006
Renato.pavan
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
24/05/2006
Marco Salles
[b:4639723ebb]Sim eu reparei[/b:4639723ebb]
Então deixa eu ver se entendi...
Voce pergunta primeiro se esta certo :cry:
Depois voce[b:4639723ebb] afirma[/b:4639723ebb] que faz desta forma.. Usando um Laço e ponto Final :?: :?:
Eu sou categorico em dizer que é uma prática ruim.. É desaconselhável.
Gostei + 0
24/05/2006
Adriano Santos
[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.
Gostei + 0
25/05/2006
Renato.pavan
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
25/05/2006
Renato.pavan
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
25/05/2006
Adriano Santos
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
Clique aqui para fazer login e interagir na Comunidade :)