No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 

566 líneas
22 KiB

  1. unit uutlEventManager;
  2. { Package: Utils
  3. Prefix: utl - UTiLs
  4. Beschreibung: diese Unit verwaltet Events und verteilt diese an registrierte Programm-Teile }
  5. {$mode objfpc}{$H+}
  6. interface
  7. uses
  8. Classes, SysUtils, Controls,
  9. uutlEvent;
  10. type
  11. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  12. TutlMouseButtons = set of TMouseButton;
  13. TutlWinControlEvent = class(TutlEvent)
  14. private
  15. fSender: TControl;
  16. public
  17. property Sender: TControl read fSender;
  18. constructor Create(
  19. const aEventType: TutlEventType;
  20. const aSender: TControl);
  21. end;
  22. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  23. TutlMouseEvent = class(TutlWinControlEvent)
  24. private
  25. fButtons: TutlMouseButtons;
  26. fClientPos: TPoint;
  27. fScreenPos: TPoint;
  28. public
  29. property Buttons: TutlMouseButtons read fButtons;
  30. property ClientPos: TPoint read fClientPos;
  31. property ScreenPos: TPoint read fScreenPos;
  32. constructor Create(
  33. const aEventType: TutlEventType;
  34. const aSender: TControl;
  35. const aButtons: TutlMouseButtons;
  36. const aClientPos: TPoint);
  37. end;
  38. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  39. TutlMouseWheelEvent = class(TutlWinControlEvent)
  40. private
  41. fWheelDelta: Integer;
  42. fClientPos: TPoint;
  43. fScreenPos: TPoint;
  44. public
  45. property WheelDelta: Integer read fWheelDelta;
  46. property ClientPos: TPoint read fClientPos;
  47. property ScreenPos: TPoint read fScreenPos;
  48. constructor Create(
  49. const aSender: TControl;
  50. const aWheelDelta: Integer;
  51. const aClientPos: TPoint);
  52. end;
  53. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  54. TutlKeyEvent = class(TutlWinControlEvent)
  55. private
  56. fCharCode: WideChar;
  57. fKeyCode: Word;
  58. public
  59. property CharCode: WideChar read fCharCode;
  60. property KeyCode: Word read fKeyCode;
  61. constructor Create(
  62. const aEventType: TutlEventType;
  63. const aSender: TControl;
  64. const aCharCode: WideChar;
  65. const aKeyCode: Word);
  66. end;
  67. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  68. TutlWindowEvent = class(TutlWinControlEvent)
  69. private
  70. fScreenRect: TRect;
  71. fClientWidth: Cardinal;
  72. fClientHeight: Cardinal;
  73. public
  74. property ScreenRect: TRect read fScreenRect;
  75. property ClientWidth: Cardinal read fClientWidth;
  76. property ClientHeight: Cardinal read fClientHeight;
  77. constructor Create(
  78. const aEventType: TutlEventType;
  79. const aSender: TControl;
  80. const aScreenRect: TRect;
  81. const aClientWidth: Cardinal;
  82. const aClientHeight: Cardinal);
  83. end;
  84. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  85. TutlWinControlEventManager = class(TutlEventListenerSet)
  86. public const
  87. EVENT_MOUSE_DOWN = 0;
  88. EVENT_MOUSE_UP = 1;
  89. EVENT_MOUSE_WHEEL_UP = 2;
  90. EVENT_MOUSE_WHEEL_DOWN = 3;
  91. EVENT_MOUSE_MOVE = 4;
  92. EVENT_MOUSE_ENTER = 5;
  93. EVENT_MOUSE_LEAVE = 6;
  94. EVENT_MOUSE_CLICK = 7;
  95. EVENT_MOUSE_DBL_CLICK = 8;
  96. EVENT_KEY_DOWN = 10;
  97. EVENT_KEY_REPEAT = 11;
  98. EVENT_KEY_UP = 12;
  99. EVENT_WINDOW_RESIZE = 15;
  100. EVENT_WINDOW_ACTIVATE = 16;
  101. EVENT_WINDOW_DEACTIVATE = 17;
  102. EVENTS_MOUSE: TutlEventTypes = [
  103. EVENT_MOUSE_DOWN,
  104. EVENT_MOUSE_UP,
  105. EVENT_MOUSE_WHEEL_UP,
  106. EVENT_MOUSE_WHEEL_DOWN,
  107. EVENT_MOUSE_MOVE,
  108. EVENT_MOUSE_ENTER,
  109. EVENT_MOUSE_LEAVE,
  110. EVENT_MOUSE_CLICK,
  111. EVENT_MOUSE_DBL_CLICK
  112. ];
  113. EVENTS_KEYBOARD: TutlEventTypes = [
  114. EVENT_KEY_DOWN,
  115. EVENT_KEY_REPEAT,
  116. EVENT_KEY_UP
  117. ];
  118. EVENTS_WINDOW: TutlEventTypes = [
  119. EVENT_WINDOW_RESIZE,
  120. EVENT_WINDOW_ACTIVATE,
  121. EVENT_WINDOW_DEACTIVATE
  122. ];
  123. private type
  124. TKeyboardState = record
  125. Modifiers: TShiftState;
  126. KeyState: array[Byte] of Boolean;
  127. end;
  128. TMouseState = record
  129. ScreenPos: TPoint;
  130. ClientPos: TPoint;
  131. Buttons: TutlMouseButtons;
  132. end;
  133. TWindowState = record
  134. Active: Boolean;
  135. ScreenRect: TRect;
  136. ClientWidth: Integer;
  137. ClientHeight: Integer;
  138. end;
  139. private
  140. fKeyboard: TKeyboardState;
  141. fMouse: TMouseState;
  142. fWindow: TWindowState;
  143. procedure HandlerMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  144. procedure HandlerMouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  145. procedure HandlerMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);
  146. procedure HandlerMouseEnter (Sender: TObject);
  147. procedure HandlerMouseLeave (Sender: TObject);
  148. procedure HandlerClick (Sender: TObject);
  149. procedure HandlerDblClick (Sender: TObject);
  150. procedure HandlerMouseWheel (Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  151. procedure HandlerKeyDown (Sender: TObject; var Key: Word; Shift: TShiftState);
  152. procedure HandlerKeyUp (Sender: TObject; var Key: Word; Shift: TShiftState);
  153. procedure HandlerResize (Sender: TObject);
  154. procedure HandlerActivate (Sender: TObject);
  155. procedure HandlerDeactivate (Sender: TObject);
  156. protected
  157. procedure RecordEvent(const aEvent: IutlEvent); virtual;
  158. function CreateMouseEvent(
  159. aSender: TObject;
  160. aType: TutlEventType;
  161. aButtons: TutlMouseButtons;
  162. aClientPos: TPoint): TutlMouseEvent; virtual;
  163. function CreateMouseWheelEvent(
  164. aSender: TObject;
  165. aDelta: Integer;
  166. aClientPos: TPoint): TutlMouseWheelEvent; virtual;
  167. function CreateKeyEvent(
  168. aSender: TObject; aType: TutlEventType;
  169. aKey: Word): TutlKeyEvent; virtual;
  170. function CreateWindowEvent(
  171. aSender: TObject;
  172. aType: TutlEventType): TutlWindowEvent; virtual;
  173. public
  174. property Keyboard: TKeyboardState read fKeyboard;
  175. property Mouse: TMouseState read fMouse;
  176. property Window: TWindowState read fWindow;
  177. procedure DispatchEvent(const aEvent: IutlEvent); override;
  178. procedure AttachEvents(const aControl: TWinControl; const aTypes: TutlEventTypes);
  179. end;
  180. implementation
  181. uses
  182. LCLIntf, Forms,
  183. uutlKeyCodes;
  184. type
  185. TWinControlVisibilityClass = class(TWinControl)
  186. published
  187. property OnMouseDown;
  188. property OnMouseMove;
  189. property OnMouseUp;
  190. property OnMouseWheel;
  191. property OnMouseEnter;
  192. property OnMouseLeave;
  193. property OnClick;
  194. property OnDblClick;
  195. end;
  196. TCustomFormVisibilityClass = class(TCustomForm)
  197. published
  198. property OnActivate;
  199. property OnDeactivate;
  200. end;
  201. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  202. //TutlWinControlEvent////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  203. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  204. constructor TutlWinControlEvent.Create(const aEventType: TutlEventType; const aSender: TControl);
  205. begin
  206. inherited Create(aEventType);
  207. fSender := aSender;
  208. end;
  209. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  210. //TutlMouseEvent/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  211. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  212. constructor TutlMouseEvent.Create(
  213. const aEventType: TutlEventType;
  214. const aSender: TControl;
  215. const aButtons: TutlMouseButtons;
  216. const aClientPos: TPoint);
  217. begin
  218. inherited Create(aEventType, aSender);
  219. fButtons := aButtons;
  220. fClientPos := aClientPos;
  221. fScreenPos := fSender.ClientToScreen(fClientPos);
  222. end;
  223. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  224. //TutlMouseWheelEvent////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  225. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  226. constructor TutlMouseWheelEvent.Create(
  227. const aSender: TControl;
  228. const aWheelDelta: Integer;
  229. const aClientPos: TPoint);
  230. begin
  231. if (aWheelDelta < 0)
  232. then inherited Create(TutlWinControlEventManager.EVENT_MOUSE_WHEEL_DOWN, aSender)
  233. else inherited Create(TutlWinControlEventManager.EVENT_MOUSE_WHEEL_UP, aSender);
  234. fWheelDelta := aWheelDelta;
  235. fClientPos := aClientPos;
  236. fScreenPos := fSender.ClientToScreen(fClientPos);
  237. end;
  238. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  239. //TutlKeyEvent///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  240. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  241. constructor TutlKeyEvent.Create(
  242. const aEventType: TutlEventType;
  243. const aSender: TControl;
  244. const aCharCode: WideChar;
  245. const aKeyCode: Word);
  246. begin
  247. inherited Create(aEventType, aSender);
  248. fCharCode := aCharCode;
  249. fKeyCode := aKeyCode;
  250. end;
  251. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  252. //TutlWindowEvent////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  253. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  254. constructor TutlWindowEvent.Create(
  255. const aEventType: TutlEventType;
  256. const aSender: TControl;
  257. const aScreenRect: TRect;
  258. const aClientWidth: Cardinal;
  259. const aClientHeight: Cardinal);
  260. begin
  261. inherited Create(aEventType, aSender);
  262. fScreenRect := aScreenRect;
  263. fClientWidth := aClientWidth;
  264. fClientHeight := aClientHeight;
  265. end;
  266. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  267. //TutlWinControlEventManager/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  268. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  269. procedure TutlWinControlEventManager.HandlerMouseDown(Sender: TObject; Button: TMouseButton;
  270. Shift: TShiftState; X, Y: Integer);
  271. begin
  272. DispatchEvent(CreateMouseEvent(Sender, EVENT_MOUSE_DOWN, [ Button ], Point(X, Y)));
  273. end;
  274. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  275. procedure TutlWinControlEventManager.HandlerMouseUp(Sender: TObject; Button: TMouseButton;
  276. Shift: TShiftState; X, Y: Integer);
  277. begin
  278. DispatchEvent(CreateMouseEvent(Sender, EVENT_MOUSE_UP, [Button], Point(X, Y)));
  279. end;
  280. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  281. procedure TutlWinControlEventManager.HandlerMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
  282. begin
  283. DispatchEvent(CreateMouseEvent(Sender, EVENT_MOUSE_MOVE, [], Point(X, Y)));
  284. end;
  285. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  286. procedure TutlWinControlEventManager.HandlerMouseEnter(Sender: TObject);
  287. begin
  288. DispatchEvent(CreateMouseEvent(Sender, EVENT_MOUSE_ENTER, [], TControl(Sender).ScreenToClient(Controls.Mouse.CursorPos)));
  289. end;
  290. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  291. procedure TutlWinControlEventManager.HandlerMouseLeave(Sender: TObject);
  292. begin
  293. DispatchEvent(CreateMouseEvent(Sender, EVENT_MOUSE_LEAVE, [], TControl(Sender).ScreenToClient(Controls.Mouse.CursorPos)));
  294. end;
  295. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  296. procedure TutlWinControlEventManager.HandlerClick(Sender: TObject);
  297. begin
  298. DispatchEvent(CreateMouseEvent(Sender, EVENT_MOUSE_CLICK, [], TControl(Sender).ScreenToClient(Controls.Mouse.CursorPos)));
  299. end;
  300. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  301. procedure TutlWinControlEventManager.HandlerDblClick(Sender: TObject);
  302. begin
  303. DispatchEvent(CreateMouseEvent(Sender, EVENT_MOUSE_DBL_CLICK, [], TControl(Sender).ScreenToClient(Controls.Mouse.CursorPos)));
  304. end;
  305. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  306. procedure TutlWinControlEventManager.HandlerMouseWheel(Sender: TObject; Shift: TShiftState;
  307. WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
  308. begin
  309. DispatchEvent(CreateMouseWheelEvent(Sender, WheelDelta, MousePos));
  310. Handled := false;
  311. end;
  312. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  313. procedure TutlWinControlEventManager.HandlerKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  314. begin
  315. DispatchEvent(CreateKeyEvent(Sender, EVENT_KEY_DOWN, Key));
  316. end;
  317. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  318. procedure TutlWinControlEventManager.HandlerKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
  319. begin
  320. DispatchEvent(CreateKeyEvent(Sender, EVENT_KEY_UP, Key));
  321. end;
  322. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  323. procedure TutlWinControlEventManager.HandlerResize(Sender: TObject);
  324. begin
  325. DispatchEvent(CreateWindowEvent(Sender, EVENT_WINDOW_RESIZE));
  326. end;
  327. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  328. procedure TutlWinControlEventManager.HandlerActivate(Sender: TObject);
  329. begin
  330. DispatchEvent(CreateWindowEvent(Sender, EVENT_WINDOW_ACTIVATE));
  331. end;
  332. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  333. procedure TutlWinControlEventManager.HandlerDeactivate(Sender: TObject);
  334. begin
  335. DispatchEvent(CreateWindowEvent(Sender, EVENT_WINDOW_DEACTIVATE));
  336. end;
  337. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  338. procedure TutlWinControlEventManager.RecordEvent(const aEvent: IutlEvent);
  339. var
  340. me: TutlMouseEvent;
  341. ke: TutlKeyEvent;
  342. we: TutlWindowEvent;
  343. function GetPressedButtons: TutlMouseButtons;
  344. begin
  345. result := [];
  346. if (GetKeyState(VK_LBUTTON) < 0) then
  347. result := result + [mbLeft];
  348. if (GetKeyState(VK_RBUTTON) < 0) then
  349. result := result + [mbRight];
  350. if (GetKeyState(VK_MBUTTON) < 0) then
  351. result := result + [mbMiddle];
  352. if (GetKeyState(VK_XBUTTON1) < 0) then
  353. result := result + [mbExtra1];
  354. if (GetKeyState(VK_XBUTTON2) < 0) then
  355. result := result + [mbExtra2];
  356. end;
  357. begin
  358. if Supports(aEvent, TutlMouseEvent, me) then begin
  359. fMouse.ClientPos := me.ClientPos;
  360. fMouse.ScreenPos := me.ScreenPos;
  361. case me.EventType of
  362. EVENT_MOUSE_DOWN:
  363. fMouse.Buttons := fMouse.Buttons + me.Buttons;
  364. EVENT_MOUSE_UP:
  365. fMouse.Buttons := fMouse.Buttons - me.Buttons;
  366. EVENT_MOUSE_LEAVE:
  367. fMouse.Buttons := [];
  368. EVENT_MOUSE_ENTER:
  369. fMouse.Buttons := GetPressedButtons;
  370. end;
  371. end else if Supports(aEvent, TutlKeyEvent, ke) then begin
  372. case ke.EventType of
  373. EVENT_KEY_DOWN,
  374. EVENT_KEY_REPEAT: begin
  375. fKeyboard.KeyState[ke.KeyCode and $FF] := true;
  376. case ke.KeyCode of
  377. VK_SHIFT: Include(fKeyboard.Modifiers, ssShift);
  378. VK_MENU: Include(fKeyboard.Modifiers, ssAlt);
  379. VK_CONTROL: Include(fKeyboard.Modifiers, ssCtrl);
  380. end;
  381. end;
  382. EVENT_KEY_UP: begin
  383. fKeyboard.KeyState[ke.KeyCode and $FF] := false;
  384. case ke.KeyCode of
  385. VK_SHIFT: Exclude(fKeyboard.Modifiers, ssShift);
  386. VK_MENU: Exclude(fKeyboard.Modifiers, ssAlt);
  387. VK_CONTROL: Exclude(fKeyboard.Modifiers, ssCtrl);
  388. end;
  389. end;
  390. end;
  391. if ([ssCtrl, ssAlt] - fKeyboard.Modifiers = [])
  392. then include(fKeyboard.Modifiers, ssAltGr)
  393. else exclude(fKeyboard.Modifiers, ssAltGr);
  394. end else if Supports(aEvent, TutlWindowEvent, we) then begin
  395. case we.EventType of
  396. EVENT_WINDOW_ACTIVATE:
  397. fWindow.Active := true;
  398. EVENT_WINDOW_DEACTIVATE:
  399. fWindow.Active := false;
  400. EVENT_WINDOW_RESIZE: begin
  401. fWindow.ScreenRect := we.ScreenRect;
  402. fWindow.ClientWidth := we.ClientWidth;
  403. fWindow.ClientHeight := we.ClientHeight;
  404. end;
  405. end;
  406. end;
  407. end;
  408. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  409. function TutlWinControlEventManager.CreateMouseEvent(aSender: TObject; aType: TutlEventType;
  410. aButtons: TutlMouseButtons; aClientPos: TPoint): TutlMouseEvent;
  411. begin
  412. result := TutlMouseEvent.Create(
  413. aType,
  414. (aSender as TControl),
  415. aButtons,
  416. aClientPos);
  417. end;
  418. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  419. function TutlWinControlEventManager.CreateMouseWheelEvent(aSender: TObject; aDelta: Integer;
  420. aClientPos: TPoint): TutlMouseWheelEvent;
  421. begin
  422. result := TutlMouseWheelEvent.Create(
  423. (aSender as TControl),
  424. aDelta,
  425. aClientPos);
  426. end;
  427. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  428. function TutlWinControlEventManager.CreateKeyEvent(aSender: TObject; aType: TutlEventType; aKey: Word): TutlKeyEvent;
  429. begin
  430. if (aType = EVENT_KEY_DOWN) and fKeyboard.KeyState[aKey and $FF] then
  431. aType := EVENT_KEY_REPEAT;
  432. result := TutlKeyEvent.Create(
  433. aType,
  434. (aSender as TControl),
  435. VKCodeToCharCode(aKey, fKeyboard.Modifiers),
  436. aKey);
  437. end;
  438. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  439. function TutlWinControlEventManager.CreateWindowEvent(aSender: TObject; aType: TutlEventType): TutlWindowEvent;
  440. var
  441. p0, p1: TPoint;
  442. begin
  443. with TControl(aSender) do begin
  444. p0 := ClientToScreen(Point(0, 0));
  445. p1 := ClientToScreen(Point(Width, Height));
  446. end;
  447. result := TutlWindowEvent.Create(
  448. aType,
  449. (aSender as TControl),
  450. Rect(p0.x, p0.y, p1.x, p1.y),
  451. (aSender as TWinControl).ClientWidth,
  452. (aSender as TWinControl).ClientHeight);
  453. end;
  454. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  455. procedure TutlWinControlEventManager.DispatchEvent(const aEvent: IutlEvent);
  456. begin
  457. RecordEvent(aEvent);
  458. inherited DispatchEvent(aEvent);
  459. end;
  460. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  461. procedure TutlWinControlEventManager.AttachEvents(const aControl: TWinControl; const aTypes: TutlEventTypes);
  462. var
  463. ctl: TWinControlVisibilityClass;
  464. frm: TCustomFormVisibilityClass;
  465. begin
  466. ctl := TWinControlVisibilityClass(aControl);
  467. // mouse events
  468. if (EVENT_MOUSE_DOWN in aTypes) then ctl.OnMouseDown := @HandlerMouseDown;
  469. if (EVENT_MOUSE_UP in aTypes) then ctl.OnMouseUp := @HandlerMouseUp;
  470. if (EVENT_MOUSE_MOVE in aTypes) then ctl.OnMouseMove := @HandlerMouseMove;
  471. if (EVENT_MOUSE_ENTER in aTypes) then ctl.OnMouseEnter := @HandlerMouseEnter;
  472. if (EVENT_MOUSE_LEAVE in aTypes) then ctl.OnMouseLeave := @HandlerMouseLeave;
  473. if (EVENT_MOUSE_CLICK in aTypes) then ctl.OnClick := @HandlerClick;
  474. if (EVENT_MOUSE_DBL_CLICK in aTypes) then ctl.OnDblClick := @HandlerDblClick;
  475. if (EVENT_MOUSE_WHEEL_DOWN in aTypes) or
  476. (EVENT_MOUSE_WHEEL_UP in aTypes) then ctl.OnMouseWheel := @HandlerMouseWheel;
  477. // key events
  478. if (EVENT_KEY_DOWN in aTypes) then ctl.OnKeyDown := @HandlerKeyDown;
  479. if (EVENT_KEY_UP in aTypes) then ctl.OnKeyUp := @HandlerKeyUp;
  480. // window events
  481. if (EVENT_WINDOW_RESIZE in aTypes) then begin
  482. ctl.OnResize := @HandlerResize;
  483. fWindow.ClientWidth := ctl.ClientWidth;
  484. fWindow.ClientHeight := ctl.ClientHeight;
  485. end;
  486. if (aControl is TCustomForm) then begin
  487. frm := TCustomFormVisibilityClass(aControl);
  488. frm.KeyPreview := true;
  489. if (EVENT_WINDOW_ACTIVATE in aTypes) then frm.OnActivate := @HandlerActivate;
  490. if (EVENT_WINDOW_DEACTIVATE in aTypes) then frm.OnDeactivate := @HandlerDeactivate;
  491. end;
  492. end;
  493. end.