Destacar o Edit em foco: Mesma classe em 4 linguagens!
Criar uma classe de "Highlight on focus" que destacará todos os edits de uma form quando estiverem em foco, sem perder os eventos já programados nesses edits. Sem retrabalho. Classe pode ser reaproveitada ao longo de todo o projeto. feita em delphi, lazarus, c#, C++ e no arquivo para download você eencontrará em VB e prism
Sabe quando você tem varios Edits (ou textbox) num form, quer destacar com uma determinada cor quando eles ganharem o foco mas todos eles já tem eventos e você não quer sobrescrever, substituir e nem mecher nos eventos deles? Tambem não quer escrever o codigo pra mudar de cor no proprio evento, porque são varios edits e você quer reaproveitamento de código e o minimo possivel de retrabalho?
no C# isso é facil porque você pode concatenar eventos, colocando facilmente dois metodos para um mesmo evento. No javascript tambem dá para você chamar dois ou mais metodos por evento. Mas e no C++, delphi e Lazarus?
OBS.: Coloquei delphi e lazarus como duas "linguagens" diferentes porque apesar de serem praticamente iguais, no lazarus, para se trabalhar com variaveis de métodos de objetos e atribuir metodos à variaveis você precisa obrigatoriamente do operador de endereço "@". No delphi tambem era assim antigamente, mas não sei em que versão que isso mudou.
Com estas classes abaixo você pode simplesmente criar um objeto, passando a form, a cor quando entra e a cor quando "passa o mouse" como parametros que todos os Edits (ou Textboxes) manterão os eventos originais.
A primeira classe é simplesmente um container de eventos (esta é apenas um conteiner de cores no codigo em C#, uma vez que é desnecessario que ela armazene os eventos), a outra classe é uma lista desses containers.
A principio o codigo desta classe trabalha somente com TEdit. Mas usando bem a RTTI, ispecionando por nomes e valores de propriedades, usando os ancestrais em comum, uma dose de if's e criatividade você pode adaptar para que funcione com todos os componentes.
Num mesmo projeto eu apresento a classe e a maneira de usar. Em breve postarei um componente para delphi feito com esse conceito.
Como isso é só uma demonstração, eu não estou criando os metodos Acessores Get e Set para minhas propriedades. Estou escrevendo direto no campo privado. Não faça isso porque é muito feio, viola o encapsulamento e quem faz isso não vai pro céu :) .
Primeiro C++ builder:
Cabeçalhos e interfaces das classes (arquivo .h)
A implementação (arquivo cpp)
O dfm:
em C#:
Agora a mesma coisa em delphi:
o Pas:
o DFM:
A mesma coisa em Lazarus:
o Pas
o LFM
Espero que esse artigo seja util para quem precisar implementar algo assim sem mecher no codigo já existente, ou para quem deseja estudar as semelhanças e diferenças entre as varias linguagens de programação. baixe o conjunto de exemplos no meu sky drive: clicando aqui
no C# isso é facil porque você pode concatenar eventos, colocando facilmente dois metodos para um mesmo evento. No javascript tambem dá para você chamar dois ou mais metodos por evento. Mas e no C++, delphi e Lazarus?
OBS.: Coloquei delphi e lazarus como duas "linguagens" diferentes porque apesar de serem praticamente iguais, no lazarus, para se trabalhar com variaveis de métodos de objetos e atribuir metodos à variaveis você precisa obrigatoriamente do operador de endereço "@". No delphi tambem era assim antigamente, mas não sei em que versão que isso mudou.
Com estas classes abaixo você pode simplesmente criar um objeto, passando a form, a cor quando entra e a cor quando "passa o mouse" como parametros que todos os Edits (ou Textboxes) manterão os eventos originais.
A primeira classe é simplesmente um container de eventos (esta é apenas um conteiner de cores no codigo em C#, uma vez que é desnecessario que ela armazene os eventos), a outra classe é uma lista desses containers.
A principio o codigo desta classe trabalha somente com TEdit. Mas usando bem a RTTI, ispecionando por nomes e valores de propriedades, usando os ancestrais em comum, uma dose de if's e criatividade você pode adaptar para que funcione com todos os componentes.
Num mesmo projeto eu apresento a classe e a maneira de usar. Em breve postarei um componente para delphi feito com esse conceito.
Como isso é só uma demonstração, eu não estou criando os metodos Acessores Get e Set para minhas propriedades. Estou escrevendo direto no campo privado. Não faça isso porque é muito feio, viola o encapsulamento e quem faz isso não vai pro céu :) .
Primeiro C++ builder:
Cabeçalhos e interfaces das classes (arquivo .h)
class TEventContainer: public TObject
{
private:
TNotifyEvent FOnEnter;
TNotifyEvent FOnExit;
TColor FCorOriginal;
__published:
__property TNotifyEvent OnEnter = {read=FOnEnter, write=FOnEnter};
__property TNotifyEvent OnExit = {read=FOnExit, write=FOnExit};
__property TColor CorOriginal = {read = FCorOriginal, write =
FCorOriginal};
};
class TMudaCor: public TObject
{
private:
TForm
*FForm;
TColor
FCorEntra;
TStringList *FlistaEvt;
public:
__fastcall virtual TMudaCor(TForm *frm, TColor corentra);
__fastcall virtual ~TMudaCor(void);
void
__fastcall DoEnter(TObject *sender);
void
__fastcall DoExit(TObject *sender);
};
class TForm1 : public TForm
{
__published: // IDE-managed Components
TEdit *Edit1;
TEdit *Edit2;
TEdit *Edit3;
TButton *Button1;
TButton *Button2;
TLabel *Label1;
void __fastcall Edit1Enter(TObject
*Sender);
void __fastcall Edit1Exit(TObject
*Sender);
void __fastcall Edit2Enter(TObject
*Sender);
void __fastcall Edit2Exit(TObject
*Sender);
void __fastcall FormCreate(TObject
*Sender);
void __fastcall FormDestroy(TObject
*Sender);
private: // User declarations
TMudaCor *mudacor;
public: //
User declarations
__fastcall TForm1(TComponent* Owner);
};
A implementação (arquivo cpp)
//--------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//--------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//--------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)
{
}
//--------------------------------------------------------------
void __fastcall TForm1::Edit1Enter(TObject *Sender)
{
Label1->Caption = "Entrou no edit
1";
}
//-------------------------------------------------------------
void __fastcall TForm1::Edit1Exit(TObject *Sender)
{
Label1->Caption = "Saiu do edit
1";
}
//-------------------------------------------------------------
void __fastcall TForm1::Edit2Enter(TObject *Sender)
{
Label1->Caption = "Entrou no edit
2";
}
//-------------------------------------------------------------
void __fastcall TForm1::Edit2Exit(TObject *Sender)
{
Label1->Caption = "saiu do edit
2";
}
//-------------------------------------------------------------
__fastcall TMudaCor::TMudaCor(TForm *frm, TColor corentra)
{
int i;
TEventContainer *evtc;
FlistaEvt = new TStringList();
FlistaEvt->Sorted = true;
TEdit *ed;
FForm = frm;
FCorEntra=corentra;
for (i=0; i<FForm->ComponentCount;i++)
{
if (
CompareStr(FForm->Components[i]->ClassName(),
"TEdit") == 0 )
{
evtc = new TEventContainer();
ed = (TEdit *)
FForm->Components[i];
evtc->OnEnter =
ed->OnEnter;
evtc->OnExit = ed->OnExit;
evtc->CorOriginal =
ed->Color;
FlistaEvt->AddObject(ed->Name, evtc);
ed->OnEnter= DoEnter;
ed->OnExit= DoExit;
};
};
FlistaEvt->Sort();
}
__fastcall TMudaCor::~TMudaCor(void)
{
int i;
for (i = 0 ; i <
FlistaEvt->Count ; i++)
if (FlistaEvt->Objects[i] != NULL)
FlistaEvt->Objects[i]->Free();
FlistaEvt->Free();
}
void __fastcall TMudaCor::DoEnter(TObject *Sender)
{
TEventContainer *evtc;
int idx;
if
(CompareStr(Sender->ClassName(), "TEdit") == 0)
{
((TEdit *)Sender)->Color =
FCorEntra;
}
idx =
FlistaEvt->IndexOf(((TEdit *)Sender)->Name);
if(idx > -1)
{
if (FlistaEvt->Objects[idx] != NULL)
{
evtc= (TEventContainer
*)(FlistaEvt->Objects[idx]);
}
if ((evtc != NULL ) && (
evtc->OnEnter != NULL)) {
evtc->OnEnter(Sender);
}
}
}
void __fastcall TMudaCor::DoExit(TObject *Sender)
{
TEventContainer *evtc;
int idx;
idx =
FlistaEvt->IndexOf(((TEdit *)Sender)->Name);
if(idx > -1)
{
if (FlistaEvt->Objects[idx] != NULL)
{
evtc= (TEventContainer
*)(FlistaEvt->Objects[idx]);
}
if (evtc != NULL )
{
if
(CompareStr(Sender->ClassName(), "TEdit") == 0)
{
((TEdit *)Sender)->Color =
evtc->CorOriginal;
}
if (
evtc->OnExit != NULL)
{
evtc->OnExit(Sender);
}
}
}
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
mudacor = new TMudaCor(this,
clYellow);
}
//------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
mudacor->Free();
}
//------------------------------------------------------------
O dfm:
object Form1: TForm1
Left = 0
Top = 0
Caption = 'Form1'
ClientHeight = 293
ClientWidth = 426
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
OnDestroy = FormDestroy
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 24
Top = 8
Width = 31
Height = 13
Caption = 'Label1'
end
object Edit1: TEdit
Left = 24
Top = 32
Width = 121
Height = 21
Color = clMoneyGreen
TabOrder = 0
Text = 'Edit1'
OnEnter = Edit1Enter
OnExit = Edit1Exit
end
object Edit2: TEdit
Left = 24
Top = 72
Width = 121
Height = 21
Color = clSkyBlue
TabOrder = 1
Text = 'Edit2'
OnEnter = Edit2Enter
OnExit = Edit2Exit
end
object Edit3: TEdit
Left = 24
Top = 120
Width = 121
Height = 21
Color = clSilver
TabOrder = 2
Text = 'Edit3'
end
object Button1: TButton
Left = 176
Top = 30
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 3
end
object Button2: TButton
Left = 176
Top = 70
Width = 75
Height = 25
Caption = 'Button2'
TabOrder = 4
end
end
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace MudaCorCSharp
{
/// <summary>
/// Summary description for Form1.
/// </summary>
///
public class Form1 :
System.Windows.Forms.Form
{
private
System.Windows.Forms.TextBox textBox1;
private
System.Windows.Forms.TextBox textBox2;
private
System.Windows.Forms.TextBox textBox3;
private
System.Windows.Forms.Button button1;
private
System.Windows.Forms.Label label1;
private
System.Windows.Forms.TextBox a3;
private
System.Windows.Forms.TextBox a2;
private
System.Windows.Forms.TextBox a1;
///
<summary>
///
Required designer variable.
///
</summary>
private
System.ComponentModel.Container components = null;
public
Form1()
{
//
// Required for Windows Form Designer
support
//
InitializeComponent();
//
// TODO: Add any constructor code after
InitializeComponent call
//
}
///
<summary>
/// Clean
up any resources being used.
///
</summary>
protected
override void Dispose( bool disposing )
{
if( disposing )
{
if
(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region
Windows Form Designer generated code
///
<summary>
///
Required method for Designer support - do not modify
/// the
contents of this method with the code editor.
///
</summary>
private
void InitializeComponent()
{
this.textBox1 = new
System.Windows.Forms.TextBox();
this.textBox2 = new
System.Windows.Forms.TextBox();
this.textBox3 = new
System.Windows.Forms.TextBox();
this.button1 = new
System.Windows.Forms.Button();
this.label1 = new
System.Windows.Forms.Label();
this.a3 = new
System.Windows.Forms.TextBox();
this.a2 = new
System.Windows.Forms.TextBox();
this.a1 = new
System.Windows.Forms.TextBox();
this.SuspendLayout();
//
// textBox1
//
this.textBox1.BackColor =
System.Drawing.Color.Gainsboro;
this.textBox1.Location = new
System.Drawing.Point(16, 72);
this.textBox1.Name = "textBox1";
this.textBox1.TabIndex = 0;
this.textBox1.Text = "textBox1";
this.textBox1.MouseEnter += new
System.EventHandler(this.textBox1_MouseEnter);
this.textBox1.Leave += new
System.EventHandler(this.textBox1_Leave);
this.textBox1.MouseLeave += new
System.EventHandler(this.textBox1_MouseLeave);
this.textBox1.Enter += new
System.EventHandler(this.textBox1_Enter);
//
// textBox2
//
this.textBox2.BackColor =
System.Drawing.Color.MistyRose;
this.textBox2.Location = new
System.Drawing.Point(16, 104);
this.textBox2.Name = "textBox2";
this.textBox2.TabIndex = 1;
this.textBox2.Text = "textBox2";
this.textBox2.MouseEnter += new
System.EventHandler(this.textBox2_MouseEnter);
this.textBox2.Leave += new
System.EventHandler(this.textBox2_Leave);
this.textBox2.MouseLeave += new
System.EventHandler(this.textBox2_MouseLeave);
this.textBox2.Enter += new
System.EventHandler(this.textBox2_Enter);
//
// textBox3
//
this.textBox3.BackColor =
System.Drawing.Color.PeachPuff;
this.textBox3.Location = new
System.Drawing.Point(16, 136);
this.textBox3.Name = "textBox3";
this.textBox3.TabIndex = 2;
this.textBox3.Text = "textBox3";
//
// button1
//
this.button1.Location = new
System.Drawing.Point(144, 24);
this.button1.Name = "button1";
this.button1.TabIndex = 3;
this.button1.Text = "button1";
this.button1.Click += new
System.EventHandler(this.button1_Click);
//
// label1
//
this.label1.Location = new
System.Drawing.Point(16, 16);
this.label1.Name = "label1";
this.label1.TabIndex = 4;
this.label1.Text = "label1";
//
// a3
//
this.a3.BackColor =
System.Drawing.Color.PaleTurquoise;
this.a3.Location = new
System.Drawing.Point(144, 136);
this.a3.Name = "a3";
this.a3.TabIndex = 7;
this.a3.Text = "textBox4";
//
// a2
//
this.a2.BackColor =
System.Drawing.Color.PaleGreen;
this.a2.Location = new
System.Drawing.Point(144, 104);
this.a2.Name = "a2";
this.a2.TabIndex = 6;
this.a2.Text = "textBox5";
//
// a1
//
this.a1.BackColor =
System.Drawing.Color.LightGoldenrodYellow;
this.a1.Location = new
System.Drawing.Point(144, 72);
this.a1.Name = "a1";
this.a1.TabIndex = 5;
this.a1.Text = "textBox6";
//
// Form1
//
this.AutoScaleBaseSize = new
System.Drawing.Size(5, 13);
this.ClientSize = new
System.Drawing.Size(292, 273);
this.Controls.Add(this.a3);
this.Controls.Add(this.a2);
this.Controls.Add(this.a1);
this.Controls.Add(this.label1);
this.Controls.Add(this.button1);
this.Controls.Add(this.textBox3);
this.Controls.Add(this.textBox2);
this.Controls.Add(this.textBox1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new
System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);
}
#endregion
///
<summary>
/// The
main entry point for the application.
///
</summary>
[STAThread]
static
void Main()
{
Application.Run(new Form1());
}
private
void textBox1_MouseEnter(object sender, System.EventArgs e)
{
label1.Text = "Mouse enter 1";
}
private
void textBox1_MouseLeave(object sender, System.EventArgs e)
{
label1.Text = "Mouse leave 1";
}
private
void textBox1_Enter(object sender, System.EventArgs e)
{
label1.Text = " enter 1";
}
private
void textBox1_Leave(object sender, System.EventArgs e)
{
label1.Text = "leave 1";
}
private
void textBox2_Enter(object sender, System.EventArgs e)
{
label1.Text = " enter 2";
}
private
void textBox2_Leave(object sender, System.EventArgs e)
{
label1.Text = "leave 2";
}
private
void textBox2_MouseEnter(object sender, System.EventArgs e)
{
label1.Text = "Mouse enter 2";
}
private
void textBox2_MouseLeave(object sender, System.EventArgs e)
{
label1.Text = "Mouse leave 2";
}
private
void button1_Click(object sender, System.EventArgs e)
{
}
private
void Form1_Load(object sender, System.EventArgs e)
{
TMudaCor mudacor = new TMudaCor(this,
System.Drawing.Color.Yellow, System.Drawing.Color.Orange);
}
}
public class TColorContainer
{
private
System.Drawing.Color FCorOriginal;
public
System.Drawing.Color CorOriginal {get{return FCorOriginal;}
set{FCorOriginal = value;}}
}
public class TMudaCor
{
private
System.Windows.Forms.Form FForm;
private
System.Drawing.Color FCorEntra;
private
System.Drawing.Color FCorMouseEntra;
//private
System.Collections.SortedList FlistaEvt;
private
System.Collections.Hashtable FlistaEvt;
public
TMudaCor(System.Windows.Forms.Form frm, System.Drawing.Color
corMouseEnter, System.Drawing.Color corEnter )
{
FForm = frm;
//FlistaEvt = new SortedList();
FlistaEvt = new Hashtable();
FCorEntra = corEnter;
FCorMouseEntra = corMouseEnter;
for(int i=0; i <
FForm.Controls.Count; i++)
{
if
(FForm.Controls[i] is TextBox)
{
TColorContainer evtc = new
TColorContainer();
evtc.CorOriginal = (FForm.Controls[i] as
TextBox).BackColor;
FlistaEvt.Add(FForm.Controls[i].Name,
evtc);
(FForm.Controls[i] as TextBox).Enter +=
new System.EventHandler( this.DoEnter);
(FForm.Controls[i] as TextBox).Leave +=
new System.EventHandler(this.DoExit);
(FForm.Controls[i] as
TextBox).MouseEnter += new System.EventHandler( this.DoMouseEnter);
(FForm.Controls[i] as
TextBox).MouseLeave += new System.EventHandler(this.DoMouseLeave);
}
}
}
public
void DoEnter(object sender, System.EventArgs e)
{
if(sender is TextBox)
{
(sender
as TextBox).BackColor = FCorEntra;
}
}
public
void DoExit(object sender, System.EventArgs e)
{
if(sender is TextBox)
{
TColorContainer evtc = (TColorContainer) FlistaEvt[(sender as
TextBox).Name];
if(evtc
!= null)
{
(sender as TextBox).BackColor =
evtc.CorOriginal;
}
}
}
public
void DoMouseEnter(object sender, System.EventArgs e)
{
if(sender is TextBox)
{
//sair
sem fazer nada se tiver o foco
if
((sender as TextBox).Focused) return;
(sender
as TextBox).BackColor = FCorMouseEntra;
}
}
public
void DoMouseLeave(object sender, System.EventArgs e)
{
if(sender is TextBox)
{
//sair
sem fazer nada se tiver o foco
if
((sender as TextBox).Focused) return;
TColorContainer evtc = (TColorContainer) FlistaEvt[(sender as
TextBox).Name];
if(evtc
!= null)
{
(sender as TextBox).BackColor =
evtc.CorOriginal;
}
}
}
}
}
o Pas:
unit
Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,
Dialogs, StdCtrls;
type
TEventContainer = class
private
FOnEnter: TNotifyEvent;
FOnExit: TNotifyEvent;
FCorOriginal: TColor;
public
property OnEnter: TNotifyEvent read FOnEnter write FOnEnter;
property OnExit: TNotifyEvent read FOnExit write FOnExit;
property CorOriginal: TColor read FCorOriginal write FCorOriginal;
end;
TMudaCor = class
private
FForm: TForm;
FCorEntra: TColor;
FlistaEvt: TStringList;
public
constructor Create(frm: Tform; corentra:TColor); reintroduce;
destructor Destroy; override;
procedure DoEnter(sender: tobject);
procedure DoExit(sender: tobject);
end;
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
aEdit4: TEdit;
aEdit5: TEdit;
aEdit6: TEdit;
Label1: TLabel;
Label2: TLabel;
procedure aEdit6Enter(Sender: TObject);
procedure aEdit6Exit(Sender: TObject);
procedure Edit1Enter(Sender: TObject);
procedure Edit1Exit(Sender: TObject);
procedure Edit2Enter(Sender: TObject);
procedure Edit2Exit(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ private declarations }
mudador: TMudaCor;
public
{ public declarations }
end;
{ TMudaCor }
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TForm1 }
procedure TForm1.Edit1Enter(Sender: TObject);
begin
Label1.Caption:='entrou no
edit 1';
end;
procedure TForm1.aEdit6Enter(Sender: TObject);
begin
Label1.Caption:='entrou no
edit 6';
end;
procedure TForm1.aEdit6Exit(Sender: TObject);
begin
Label1.Caption:='saiu do edit
6';
end;
procedure TForm1.Edit1Exit(Sender: TObject);
begin
Label1.Caption:='saiu do edit 1';
end;
procedure TForm1.Edit2Enter(Sender: TObject);
begin
Label1.Caption:='entrou no edit 2';
end;
procedure TForm1.Edit2Exit(Sender: TObject);
begin
Label1.Caption:='saiu do edit 2';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
mudador := TMudaCor.Create(self, clYellow);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
mudador.free;
end;
{ TMudaCor }
constructor TMudaCor.Create(frm: Tform; corentra:TColor);
var i: integer;
evtc: TEventContainer;
begin
inherited create;
FlistaEvt := TStringList.Create;
FlistaEvt.Sorted:=true;
FForm := frm;
FCorEntra:=corentra;
for i := 0 to FForm.ComponentCount-1 do
begin
if
(FForm.Components[i] is TEdit) then
begin
evtc := TEventContainer.Create;
evtc.OnEnter := (FForm.Components[i] as TEdit).OnEnter;
evtc.OnExit := (FForm.Components[i] as TEdit).OnExit;
evtc.CorOriginal := (FForm.Components[i] as TEdit).Color;
FlistaEvt.AddObject((FForm.Components[i] as TEdit).Name, evtc);
(FForm.Components[i] as TEdit).OnEnter:= DoEnter;
(FForm.Components[i] as TEdit).OnExit:= DoExit;
end;
end;
FlistaEvt.Sort;
end;
destructor TMudaCor.Destroy;
var i: integer;
begin
for i := 0 to FlistaEvt.Count
-1 do
if FlistaEvt.Objects[i] <> nil then
FlistaEvt.Objects[i].Free;
FlistaEvt.Free;
inherited Destroy;
end;
procedure TMudaCor.DoEnter(sender: tobject);
var evtc: TEventContainer;
idx: integer;
begin
if(sender is TEdit) then
(sender as TEdit).Color := FCorEntra;
idx :=
FlistaEvt.IndexOf((sender as TEdit).Name);
if(idx > -1) then
begin
if (FlistaEvt.Objects[idx] <> nil) then
begin
evtc:= (FlistaEvt.Objects[idx] as TEventContainer);
end;
if ((evtc <> nil) and ( Assigned(evtc.OnEnter))) then
evtc.OnEnter(sender);
end;
end;
procedure TMudaCor.DoExit(sender: tobject);
var evtc: TEventContainer;
idx: integer;
begin
idx :=
FlistaEvt.IndexOf((sender as TEdit).Name);
if(idx > -1) then
begin
if (FlistaEvt.Objects[idx] <> nil) then
begin
evtc:= (FlistaEvt.Objects[idx] as TEventContainer);
end;
if Assigned(evtc) then
begin
if (sender is TEdit) then
(sender as TEdit).Color := evtc.CorOriginal;
if Assigned(evtc.OnExit) then
evtc.OnExit(sender);
end;
end;
end;
end.
object Form1: TForm1
Left = 359
Top = 191
Width = 350
Height = 358
Caption = 'Form1'
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
OldCreateOrder = True
OnCreate = FormCreate
OnDestroy = FormDestroy
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 96
Top = 16
Width = 32
Height = 13
Caption = 'Label1'
Color = clBtnFace
ParentColor = False
end
object Label2: TLabel
Left = 8
Top = 184
Width = 249
Height = 65
Caption =
'Repare que o edit 3
n'#227'o tem evento no onexit'#13#10'onenter, mas mesm' +
'o assim a
mudan'#231'a de cor'#13#10'ocorre. Os outros edits, alem da mudan' +
#231'a de
'#13#10'cor ele continua fazendo o evento de antes,'#13#10'que era mud'
+
'ar o texto do
label1 para entrou, saiu etc'
Color = clBtnFace
ParentColor = False
end
object Edit1: TEdit
Left = 24
Top = 58
Width = 80
Height = 21
Color = clSkyBlue
TabOrder = 0
Text = 'Edit1'
OnEnter = Edit1Enter
OnExit = Edit1Exit
end
object Edit2: TEdit
Left = 24
Top = 98
Width = 80
Height = 21
Color = clMoneyGreen
TabOrder = 1
Text = 'Edit2'
OnEnter = Edit2Enter
OnExit = Edit2Exit
end
object Button1: TButton
Left = 224
Top = 56
Width = 75
Height = 25
Caption = 'Button1'
TabOrder = 2
end
object Button2: TButton
Left = 224
Top = 96
Width = 75
Height = 25
Caption = 'Button2'
TabOrder = 3
end
object Edit3: TEdit
Left = 24
Top = 136
Width = 80
Height = 21
Color = clMedGray
TabOrder = 4
Text = 'Edit3'
end
object aEdit4: TEdit
Left = 120
Top = 58
Width = 80
Height = 21
Color = clFuchsia
TabOrder = 5
Text = 'Edit1'
end
object aEdit5: TEdit
Left = 120
Top = 98
Width = 80
Height = 21
Color = clAqua
TabOrder = 6
Text = 'Edit2'
end
object aEdit6: TEdit
Left = 120
Top = 136
Width = 80
Height = 21
Color = clLime
TabOrder = 7
Text = 'Edit3'
OnEnter = aEdit6Enter
OnExit = aEdit6Exit
end
end
o Pas
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls,
Graphics, Dialogs,
StdCtrls;
type
TEventContainer = class
private
FOnEnter: TNotifyEvent;
FOnExit: TNotifyEvent;
FCorOriginal: TColor;
public
property OnEnter: TNotifyEvent read FOnEnter write FOnEnter;
property OnExit: TNotifyEvent read FOnExit write FOnExit;
property CorOriginal: TColor read FCorOriginal write FCorOriginal;
end;
TMudaCor = class
private
FForm: TForm;
FCorEntra: TColor;
FlistaEvt: TStringList;
public
constructor Create(frm: Tform; corentra:TColor); reintroduce;
destructor Destroy; override;
procedure DoEnter(sender: tobject);
procedure DoExit(sender: tobject);
end;
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
aEdit4: TEdit;
aEdit5: TEdit;
aEdit6: TEdit;
Label1: TLabel;
Label2: TLabel;
procedure aEdit6Enter(Sender: TObject);
procedure aEdit6Exit(Sender: TObject);
procedure Edit1Enter(Sender: TObject);
procedure Edit1Exit(Sender: TObject);
procedure Edit2Enter(Sender: TObject);
procedure Edit2Exit(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ private declarations }
mudador: TMudaCor;
public
{ public declarations }
end;
{ TMudaCor }
var
Form1: TForm1;
implementation
{ TForm1 }
procedure TForm1.Edit1Enter(Sender: TObject);
begin
Label1.Caption:='entrou no
edit 1';
end;
procedure TForm1.aEdit6Enter(Sender: TObject);
begin
Label1.Caption:='entrou no
edit 6';
end;
procedure TForm1.aEdit6Exit(Sender: TObject);
begin
Label1.Caption:='saiu do edit
6';
end;
procedure TForm1.Edit1Exit(Sender: TObject);
begin
Label1.Caption:='saiu do edit 1';
end;
procedure TForm1.Edit2Enter(Sender: TObject);
begin
Label1.Caption:='entrou no edit 2';
end;
procedure TForm1.Edit2Exit(Sender: TObject);
begin
Label1.Caption:='saiu do edit 2';
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
mudador := TMudaCor.Create(self, clYellow);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
mudador.free;
end;
{ TMudaCor }
constructor TMudaCor.Create(frm: Tform; corentra: TColor);
var i: integer;
evtc: TEventContainer;
begin
inherited create;
FlistaEvt := TStringList.Create;
FlistaEvt.Sorted:=true;
FForm := frm;
FCorEntra:=corentra;
for i := 0 to FForm.ComponentCount-1 do
begin
if
(FForm.Components[i] is TEdit) then
begin
evtc := TEventContainer.Create;
evtc.OnEnter := (FForm.Components[i] as TEdit).OnEnter;
evtc.OnExit := (FForm.Components[i] as TEdit).OnExit;
evtc.CorOriginal:= (FForm.Components[i] as TEdit).Color;
FlistaEvt.AddObject((FForm.Components[i] as TEdit).Name, evtc);
(FForm.Components[i] as TEdit).OnEnter:=@DoEnter;
(FForm.Components[i] as TEdit).OnExit:=@DoExit;
end;
end;
FlistaEvt.Sort;
end;
destructor TMudaCor.Destroy;
var i: integer;
begin
for i := 0 to FlistaEvt.Count
-1 do
if FlistaEvt.Objects[i] <> nil then
FlistaEvt.Objects[i].Free;
FlistaEvt.Free;
inherited Destroy;
end;
procedure TMudaCor.DoEnter(sender: tobject);
var evtc: TEventContainer;
idx: integer;
begin
if(sender is TEdit) then
(sender as TEdit).Color := FCorEntra;
idx :=
FlistaEvt.IndexOf((sender as TEdit).Name);
if(idx > -1) then
begin
if (FlistaEvt.Objects[idx] <> nil) then
begin
evtc:= (FlistaEvt.Objects[idx] as TEventContainer);
end;
if ((evtc <> nil) and (evtc.OnEnter <>
nil)) then
evtc.OnEnter(sender);
end;
end;
procedure TMudaCor.DoExit(sender: tobject);
var evtc: TEventContainer;
idx: integer;
begin
idx :=
FlistaEvt.IndexOf((sender as TEdit).Name);
if(idx > -1) then
begin
if (FlistaEvt.Objects[idx] <> nil) then
begin
evtc:= (FlistaEvt.Objects[idx] as TEventContainer);
end;
if (evtc <> nil) then
begin
if (sender is TEdit) then
(sender as TEdit).Color := evtc.CorOriginal;
if (evtc.OnExit <> nil) then
evtc.OnExit(sender);
end;
end;
end;
initialization
{$I unit1.lrs}
end.
object
Form1: TForm1
Left = 359
Height = 331
Top = 191
Width = 342
Caption = 'Form1'
ClientHeight = 331
ClientWidth = 342
OnCreate = FormCreate
OnDestroy = FormDestroy
ParentFont = False
LCLVersion = '0.9.26'
object Label1: TLabel
Left = 96
Height = 14
Top = 16
Width = 32
Caption = 'Label1'
ParentColor = False
end
object Label2: TLabel
Left = 8
Height = 66
Top = 184
Width = 259
Caption = 'Repare que o edit 3
não tem evento no onexit'#13#10'onenter, mas mesmo
assim a mudança de cor'#13#10'ocorre. Os outros edits, alem
da mudança de '#13#10'cor ele continua fazendo o evento de
antes,'#13#10'que era mudar o texto do label1 para entrou, saiu etc'
ParentColor = False
end
object Edit1: TEdit
Left = 24
Height = 23
Top = 58
Width = 80
Color = clSilver
OnEnter = Edit1Enter
OnExit = Edit1Exit
TabOrder = 0
Text = 'Edit1'
end
object Edit2: TEdit
Left = 24
Height = 23
Top = 98
Width = 80
Color = clSkyBlue
OnEnter = Edit2Enter
OnExit = Edit2Exit
TabOrder = 1
Text = 'Edit2'
end
object Button1: TButton
Left = 224
Height = 25
Top = 56
Width = 75
Caption = 'Button1'
TabOrder = 2
end
object Button2: TButton
Left = 224
Height = 25
Top = 96
Width = 75
Caption = 'Button2'
TabOrder = 3
end
object Edit3: TEdit
Left = 24
Height = 23
Top = 136
Width = 80
Color = clMoneyGreen
TabOrder = 4
Text = 'Edit3'
end
object aEdit4: TEdit
Left = 120
Height = 23
Top = 58
Width = 80
Color = clFuchsia
TabOrder = 5
Text = 'Edit1'
end
object aEdit5: TEdit
Left = 120
Height = 23
Top = 98
Width = 80
Color = clAqua
TabOrder = 6
Text = 'Edit2'
end
object aEdit6: TEdit
Left = 120
Height = 23
Top = 136
Width = 80
Color = clLime
OnEnter = aEdit6Enter
OnExit = aEdit6Exit
TabOrder = 7
Text = 'Edit3'
end
end
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo