Trap the OnEnter and OnLeave events (Views: 27)
Problem/Question/Abstract: This code shows how to get the OnEnter and OnLeave event from components without changing the component. Answer: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Label1: TLabel; Button1: TButton; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } FFocusControl: TControl; procedure ApplicationIdle(Sender: TObject; var Done: Boolean); public { Public declarations } procedure OnEnter(Sender: TObject); procedure OnExit(Sender: TObject); end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin FFocusControl := nil; Application.OnIdle := ApplicationIdle; end; procedure TForm1.FormDestroy(Sender: TObject); begin Application.OnIdle := nil; end; procedure TForm1.ApplicationIdle(Sender: TObject; var Done: Boolean); var CurControl: TControl; P: TPoint; begin GetCursorPos(P); CurControl := FindDragTarget(P, True); if FFocusControl <> CurControl then begin if FFocusControl <> nil then OnExit(FFocusControl); FFocusControl := CurControl; if FFocusControl <> nil then OnEnter(FFocusControl); end; end; procedure TForm1.OnEnter(Sender: TObject); begin //OnEnter code if sender = Button1 then begin Label1.caption := 'Hello'; Button1.Caption := 'Exit'; end; end; procedure TForm1.OnExit(Sender: TObject); begin //OnExit code if sender = Button1 then begin Label1.caption := 'Godbye'; Button1.Caption := 'Enter'; end; end; end. |