Fórum Destacar o Edit em foco: Mesma classe em 4 linguagens! #371078
07/06/2009
0
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:
[url]http://cid-a3e4fd1c20f4d546.skydrive.live.com/self.aspx/.Public/EditHighlight¬7C_MesmoExemploXLinguagens.zip[/url]
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
em C#:
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;
}
}
}
}
}
Agora a mesma coisa em delphi:
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.
o DFM:
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´1310´onenter, mas mesm´ + ´o assim a mudan´231´a de cor´1310´ocorre. Os outros edits, alem da mudan´ + 231´a de ´1310´cor ele continua fazendo o evento de antes,´1310´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
A mesma coisa em Lazarus: 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.
o LFM
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´#1310´onenter, mas mesmo assim a mudança de cor´1310´ocorre. Os outros edits, alem da mudança de ´1310´cor ele continua fazendo o evento de antes,´1310´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
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:
[url]http://cid-a3e4fd1c20f4d546.skydrive.live.com/self.aspx/.Public/EditHighlight¬7C_MesmoExemploXLinguagens.zip[/url]
Vitor Rubio
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)