domingo, 7 de junho de 2009

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

Nenhum comentário:

Postar um comentário

Postagens populares

Marcadores

delphi (60) C# (31) poo (21) Lazarus (19) Site aos Pedaços (15) sql (13) Reflexões (10) .Net (9) Humor (9) javascript (9) ASp.Net (8) api (8) Básico (6) Programação (6) ms sql server (5) Web (4) banco de dados (4) HTML (3) PHP (3) Python (3) design patterns (3) jQuery (3) livros (3) metaprogramação (3) Ajax (2) Debug (2) Dicas Básicas Windows (2) Pascal (2) games (2) linguagem (2) música (2) singleton (2) tecnologia (2) Anime (1) Api do Windows (1) Assembly (1) Eventos (1) Experts (1) GNU (1) Inglês (1) JSON (1) SO (1) datas (1) developers (1) dicas (1) easter egg (1) firebird (1) interfaces (1) introspecção (1) memo (1) oracle (1) reflexão (1)