Destacar o Edit em foco: Mesma classe em 4 linguagens!


  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)



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'#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




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'#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



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

Comentários

Postagens mais visitadas deste blog

Detectar o encoding de um arquivo para não corromper ao transformá-lo

erro "ora-12154: tns: não foi possível resolver o identificador de conexão especificado"

Quebras de linha no Delphi 2010