{******************************************************************************} { } { Tulip - User Interface Library } { } { Copyright(c) 2012 - 2013 Marcos Gomes. All rights Reserved. } { } { -------------------------------------------------------------------------- } { } { This product is based on Asphyre Sphinx (c) 2000 - 2012 Yuriy Kotsarenko. } { All rights reserved. Official web site: http://www.afterwarp.net } { } {******************************************************************************} { } { Important Notice: } { } { If you modify/use this code or one of its parts either in original or } { modified form, you must comply with Mozilla Public License Version 2.0, } { including section 3, "Responsibilities". Failure to do so will result in } { the license breach, which will be resolved in the court. Remember that } { violating author's rights either accidentally or intentionally is } { considered a serious crime in many countries. Thank you! } { } { !! Please *read* Mozilla Public License 2.0 document located at: } { http://www.mozilla.org/MPL/ } { } { -------------------------------------------------------------------------- } { } { The contents of this file are subject to the Mozilla Public License } { Version 2.0 (the "License"); you may not use this file except in } { compliance with the License. You may obtain a copy of the License at } { http://www.mozilla.org/MPL/ } { } { Software distributed under the License is distributed on an "AS IS" } { basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the } { License for the specific language governing rights and limitations } { under the License. } { } { The Original Code is Tulip.UI.pas. } { } { The Initial Developer of the Original Code is Marcos Gomes. } { Portions created by Marcos Gomes are Copyright (C) 2012, Marcos Gomes. } { All Rights Reserved. } { } {******************************************************************************} { } { Tulip.UI.pas Modified: 23-Mar-2013 } { -------------------------------------------------------------------------- } { } { User Controls and ControlManager } { } { Version 1.03 } { } {******************************************************************************} unit Tulip.UI; interface uses Winapi.Messages, System.Types, System.Classes, Vcl.Controls, Vcl.Forms, Vcl.Clipbrd, // Asphyre Units AbstractDevices, AbstractCanvas, // Tulip UI Units Tulip.UI.Controls, Tulip.UI.Forms, Tulip.UI.Images, Tulip.UI.Labels, Tulip.UI.Panels, Tulip.UI.Buttons, Tulip.UI.EditBoxes, Tulip.UI.CheckBoxes, Tulip.UI.RadioButtons, Tulip.UI.ProgressBars, Tulip.UI.PaintBoxes, Tulip.UI.TrackBars, Tulip.UI.ListBoxes; type {$REGION 'TAButton'} TAButton = class(TCustomAButton) published property Antialiased; property Border; property Caption; property Color; property ColorHover; property ColorPressed; property FocusRect; property Font; property Image; property ImageHover; property ImagePressed; property Margin; property Shadow; property Transparent; end; TAButtonClass = class of TAButton; {$ENDREGION} {$REGION 'TACheckBox'} TACheckBox = class(TCustomACheckBox) published property Antialiased; property Border; property Box; property Caption; property Checked; property Color; property FocusRect; property Font; property Image; property Margin; property ReadOnly; property Transparent; end; TACheckBoxClass = class of TACheckBox; {$ENDREGION} {$REGION 'TAEditBox'} TAEditBox = class(TCustomAEditBox) published property Antialiased; property AutoSelect; property Border; property Color; property FocusRect; property Font; property Image; property Margin; property MaxLength; property ReadOnly; property Text; end; TAEditboxClass = class of TAEditBox; {$ENDREGION} {$REGION 'TAForm'} TAForm = class(TCustomAForm) published property Antialiased; property Border; property BoundToScreen; property Caption; property CanMove; property Color; property Font; property Image; property Margin; property Shadow; property WordWrap; end; TAFormClass = class of TAForm; {$ENDREGION} {$REGION 'TAImage'} TAImage = class(TCustomAImage) published property Antialiased; property Border; property CanMoveHandle; property Color; property Image; end; TAImageClass = class of TAImage; {$ENDREGION} {$REGION 'TALabel'} TALabel = class(TCustomALabel) published property Antialiased; property Border; property CanMoveHandle; property Caption; property Color; property FocusControl; property Font; property Image; property Margin; property Transparent; property WordWrap; end; TALabelClass = class of TALabel; {$ENDREGION} {$REGION 'TAListBox'} TAListBox = class(TCustomAListBox) published property Antialiased; property Border; property Color; property DownButton; property FocusRect; property Font; property Image; property ItemIndex; property LineHeight; property Lines; property Margin; property ScrollButton; property Transparent; property UpButton; end; TAListBoxClass = class of TAListBox; {$ENDREGION} {$REGION 'TAPaintBox'} TAPaintBox = class(TCustomAPaintBox) published property Antialiased; property CanMoveHandle; end; TAPaintBoxClass = class of TAPaintBox; {$ENDREGION} {$REGION 'TAPanel'} TAPanel = class(TCustomAPanel) published property Antialiased; property Border; property CanMoveHandle; property Caption; property Color; property Font; property Image; property Margin; property Transparent; end; TAPanelClass = class of TAPanel; {$ENDREGION} {$REGION 'TAProgressBar'} TAProgressBar = class(TCustomAProgressBar) published property Antialiased; property Border; property CanMoveHandle; property Caption; property Color; property Display; property Font; property Image; property Margin; property Max; property Min; property Position; property ProgressColor; property Transparent; end; TAProgressBarClass = class of TAProgressBar; {$ENDREGION} {$REGION 'TARadioButton'} TARadioButton = class(TCustomARadioButton) published property Antialiased; property Border; property Box; property Caption; property Checked; property Color; property FocusRect; property Font; property Image; property Margin; property ReadOnly; property Transparent; end; TARadioButtonClass = class of TARadioButton; {$ENDREGION} {$REGION 'TATrackBar'} TATrackBar = class(TCustomATrackBar) published property Antialiased; property Border; property Button; property Color; property FocusRect; property Image; property Increment; property Margin; property Max; property Min; property Position; property Transparent; end; TATrackBarClass = class of TATrackBar; {$ENDREGION} {$REGION 'TAControlManager'} TAControlManager = class(TCustomManager) private procedure AcquireEvents; procedure RestoreEvents; procedure ShortCut(var Msg: TWMKey; var Handled: Boolean); protected procedure Click(Sender: TObject); virtual; procedure DblClick(Sender: TObject); virtual; procedure KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); virtual; procedure KeyPress(Sender: TObject; var Key: Char); virtual; procedure KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); virtual; procedure MouseEnter(Sender: TObject); virtual; procedure MouseLeave(Sender: TObject); virtual; procedure MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); virtual; procedure MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); virtual; procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); virtual; procedure MouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); virtual; procedure MouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); virtual; procedure MouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); virtual; procedure SetParent(const AParent: TComponent); override; public destructor Destroy; override; function GetClipboard: TClipboard; function GetParentAsControl: TControl; function AButton(const Parent, Name: String): TAButton; function ACheckBox(const Parent, Name: String): TACheckBox; function AEditBox(const Parent, Name: String): TAEditBox; function AForm(const Name: String): TAForm; function AImage(const Parent, Name: String): TAImage; function ALabel(const Parent, Name: String): TALabel; function AListBox(const Parent, Name: String): TAListBox; function APaintBox(const Parent, Name: String): TAPaintBox; function APanel(const Parent, Name: String): TAPanel; function AProgressBar(const Parent, Name: String): TAProgressBar; function ARadioButton(const Parent, Name: String): TARadioButton; function ATrackBar(const Parent, Name: String): TATrackBar; end; {$ENDREGION} implementation {$REGION 'TAControlManager'} { TAControlManager } function TAControlManager.AButton(const Parent, Name: String): TAButton; var AControl: TAControl; begin Result := nil; AControl := Self.Root.FindChildControl(Parent, False); if AControl <> nil then if AControl is TAForm then AControl := TAForm(AControl).FindChildControl(Name, True); if AControl <> nil then if AControl is TAButton then Result := TAButton(AControl); end; function TAControlManager.ACheckBox(const Parent, Name: String): TACheckBox; var AControl: TAControl; begin Result := nil; AControl := Self.Root.FindChildControl(Parent, False); if AControl <> nil then if AControl is TAForm then AControl := TAForm(AControl).FindChildControl(Name, True); if AControl <> nil then if AControl is TACheckBox then Result := TACheckBox(AControl); end; procedure TAControlManager.AcquireEvents; begin if Parent is TForm then begin Self.OwnerMouseEnter := TForm(Parent).OnMouseEnter; Self.OwnerMouseLeave := TForm(Parent).OnMouseLeave; Self.OwnerMouseDown := TForm(Parent).OnMouseDown; Self.OwnerMouseUp := TForm(Parent).OnMouseUp; Self.OwnerMouseMove := TForm(Parent).OnMouseMove; Self.OwnerMouseWheel := TForm(Parent).OnMouseWheel; Self.OwnerMouseWheelDown := TForm(Parent).OnMouseWheelDown; Self.OwnerMouseWheelUp := TForm(Parent).OnMouseWheelUp; Self.OwnerKeyDown := TForm(Parent).OnKeyDown; Self.OwnerKeyUp := TForm(Parent).OnKeyUp; Self.OwnerKeyPress := TForm(Parent).OnKeyPress; Self.OwnerShortCut := TForm(Parent).OnShortCut; Self.OwnerClick := TForm(Parent).OnClick; Self.OwnerDblClick := TForm(Parent).OnDblClick; TForm(Parent).OnMouseDown := MouseDown; TForm(Parent).OnMouseUp := MouseUp; TForm(Parent).OnMouseMove := MouseMove; TForm(Parent).OnMouseEnter := MouseEnter; TForm(Parent).OnMouseLeave := MouseLeave; TForm(Parent).OnMouseWheel := MouseWheel; TForm(Parent).OnMouseWheelDown := MouseWheelDown; TForm(Parent).OnMouseWheelUp := MouseWheelUp; TForm(Parent).OnKeyDown := KeyDown; TForm(Parent).OnKeyUp := KeyUp; TForm(Parent).OnKeyPress := KeyPress; TForm(Parent).OnClick := Click; TForm(Parent).OnDblClick := DblClick; TForm(Parent).OnShortCut := ShortCut; end; end; function TAControlManager.AEditBox(const Parent, Name: String): TAEditBox; var AControl: TAControl; begin Result := nil; AControl := Self.Root.FindChildControl(Parent, False); if AControl <> nil then if AControl is TAForm then AControl := TAForm(AControl).FindChildControl(Name, True); if AControl <> nil then if AControl is TAEditBox then Result := TAEditBox(AControl); end; function TAControlManager.AForm(const Name: String): TAForm; var AControl: TAControl; begin Result := nil; AControl := Self.Root.FindChildControl(Name, False); if AControl <> nil then if AControl is TAForm then Result := TAForm(AControl); end; function TAControlManager.AImage(const Parent, Name: String): TAImage; var AControl: TAControl; begin Result := nil; AControl := Self.Root.FindChildControl(Parent, False); if AControl <> nil then if AControl is TAForm then AControl := TAForm(AControl).FindChildControl(Name, True); if AControl <> nil then if AControl is TAImage then Result := TAImage(AControl); end; function TAControlManager.ALabel(const Parent, Name: String): TALabel; var AControl: TAControl; begin Result := nil; AControl := Self.Root.FindChildControl(Parent, False); if AControl <> nil then if AControl is TAForm then AControl := TAForm(AControl).FindChildControl(Name, True); if AControl <> nil then if AControl is TALabel then Result := TALabel(AControl); end; function TAControlManager.AListBox(const Parent, Name: String): TAListBox; var AControl: TAControl; begin Result := nil; AControl := Self.Root.FindChildControl(Parent, False); if AControl <> nil then if AControl is TAForm then AControl := TAForm(AControl).FindChildControl(Name, True); if AControl <> nil then if AControl is TAListBox then Result := TAListBox(AControl); end; function TAControlManager.APaintBox(const Parent, Name: String): TAPaintBox; var AControl: TAControl; begin Result := nil; AControl := Self.Root.FindChildControl(Parent, False); if AControl <> nil then if AControl is TAForm then AControl := TAForm(AControl).FindChildControl(Name, True); if AControl <> nil then if AControl is TAPaintBox then Result := TAPaintBox(AControl); end; function TAControlManager.APanel(const Parent, Name: String): TAPanel; var AControl: TAControl; begin Result := nil; AControl := Self.Root.FindChildControl(Parent, False); if AControl <> nil then if AControl is TAForm then AControl := TAForm(AControl).FindChildControl(Name, True); if AControl <> nil then if AControl is TAPanel then Result := TAPanel(AControl); end; function TAControlManager.AProgressBar(const Parent, Name: String) : TAProgressBar; var AControl: TAControl; begin Result := nil; AControl := Self.Root.FindChildControl(Parent, False); if AControl <> nil then if AControl is TAForm then AControl := TAForm(AControl).FindChildControl(Name, True); if AControl <> nil then if AControl is TAProgressBar then Result := TAProgressBar(AControl); end; function TAControlManager.ARadioButton(const Parent, Name: String) : TARadioButton; var AControl: TAControl; begin Result := nil; AControl := Self.Root.FindChildControl(Parent, False); if AControl <> nil then if AControl is TAForm then AControl := TAForm(AControl).FindChildControl(Name, True); if AControl <> nil then if AControl is TARadioButton then Result := TARadioButton(AControl); end; function TAControlManager.ATrackBar(const Parent, Name: String): TATrackBar; var AControl: TAControl; begin Result := nil; AControl := Self.Root.FindChildControl(Parent, False); if AControl <> nil then if AControl is TAForm then AControl := TAForm(AControl).FindChildControl(Name, True); if AControl <> nil then if AControl is TATrackBar then Result := TATrackBar(AControl); end; procedure TAControlManager.Click(Sender: TObject); var Control: TAControl; begin if (Assigned(OwnerClick)) then OwnerClick(Sender); if (Active) then begin Control := PreviousControl; if (Control <> nil) then if (Control.Enabled) and (Control.Visible) then Control.Click; end; end; procedure TAControlManager.DblClick(Sender: TObject); var Control: TAControl; begin if (Assigned(OwnerDblClick)) then OwnerDblClick(Sender); if (Active) then begin Control := PreviousControl; if (Control <> nil) then if (Control.Enabled) and (Control.Visible) then Control.DblClick; end; end; destructor TAControlManager.Destroy; begin RestoreEvents; inherited; end; procedure TAControlManager.ShortCut(var Msg: TWMKey; var Handled: Boolean); var Key: Word; Shift: TShiftState; begin if Msg.CharCode = 9 then begin Key := Msg.CharCode; Shift := KeyDataToShiftState(Msg.KeyData); Self.KeyDown(Parent, Key, Shift); Handled := True; end; end; function TAControlManager.GetClipboard: TClipboard; begin Result := Clipboard; end; function TAControlManager.GetParentAsControl: TControl; begin if Parent is TControl then Result := Parent as TControl else Result := nil; end; procedure TAControlManager.KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); var Control: TWControl; begin if (Assigned(OwnerKeyDown)) then OwnerKeyDown(Sender, Key, Shift); if (Active) then begin Control := ActiveControl; if Control <> nil then begin if (Control.Enabled) and (Control.Visible) then Control.KeyDown(Key, Shift); end else if Root.GetWControls <> nil then TWControl(Root.GetWControls[Root.GetWControls.Count - 1]) .KeyDown(Key, Shift) else Root.KeyDown(Key, Shift); end; end; procedure TAControlManager.KeyPress(Sender: TObject; var Key: Char); var Control: TWControl; begin if (Assigned(OwnerKeyPress)) then OwnerKeyPress(Sender, Key); if (Active) then begin Control := ActiveControl; if Control <> nil then begin if (Control.Enabled) and (Control.Visible) then Control.KeyPress(Key); end else if Root.GetWControls <> nil then TWControl(Root.GetWControls[Root.GetWControls.Count - 1]).KeyPress(Key) else Root.KeyPress(Key); end; end; procedure TAControlManager.KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); var Control: TWControl; begin if (Assigned(OwnerKeyUp)) then OwnerKeyUp(Sender, Key, Shift); if (Active) then begin Control := ActiveControl; if Control <> nil then begin if (Control.Enabled) and (Control.Visible) then Control.KeyUp(Key, Shift); end else if Root.GetWControls <> nil then TWControl(Root.GetWControls[Root.GetWControls.Count - 1]) .KeyUp(Key, Shift) else Root.KeyUp(Key, Shift); end; end; procedure TAControlManager.MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Control: TAControl; begin // fixes coordinates when scaled if (Self.Parent is TControl) then begin if Self.Device.SwapChains.Items[0].Width <> TControl(Self.Parent).ClientWidth then X := Trunc(X * (Self.Device.SwapChains.Items[0].Width / TControl(Self.Parent).ClientWidth)); if Self.Device.SwapChains.Items[0].Height <> TControl(Self.Parent).ClientHeight then Y := Trunc(Y * (Self.Device.SwapChains.Items[0].Height / TControl(Self.Parent).ClientHeight)); end; if (Assigned(OwnerMouseDown)) then OwnerMouseDown(Sender, Button, Shift, X, Y); if (Active) then begin Control := Root.ControlAtPos(Point(X, Y), True, True, True); // Check if is Modal if ActiveControl <> nil then begin if ActiveControl.Handle <> nil then begin if ActiveControl.Handle is TAForm then begin if (TAForm(ActiveControl.Handle).IsModal) and (ActiveControl.Handle <> Control) then begin if (Control <> nil) then begin if ActiveControl.Handle.FindChildControl(Control.Name, True) = nil then Exit; end else begin Exit; end; end; end; end; end; if (Control <> nil) then begin if (Control.Enabled = True) then Control.MouseDown(Button, Shift, X, Y); PreviousControl := Control; end; end; end; procedure TAControlManager.MouseEnter(Sender: TObject); var Control: TAControl; begin if (Assigned(OwnerMouseEnter)) then OwnerMouseEnter(Sender); if (Active) then begin Root.MouseEnter; Control := PreviousControl; if (Control <> nil) then if (Control.Enabled) and (Control.Visible) then Control.MouseEnter; end; end; procedure TAControlManager.MouseLeave(Sender: TObject); var Control: TAControl; begin if (Assigned(OwnerMouseLeave)) then OwnerMouseLeave(Sender); if (Active) then begin Root.MouseLeave; Control := PreviousControl; if (Control <> nil) then if (Control.Enabled) and (Control.Visible) then Control.MouseLeave; end; end; procedure TAControlManager.MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var Control: TAControl; begin // fixes coordinates when scaled if (Self.Parent is TControl) then begin if Self.Device.SwapChains.Items[0].Width <> TControl(Self.Parent).ClientWidth then X := Trunc(X * (Self.Device.SwapChains.Items[0].Width / TControl(Self.Parent).ClientWidth)); if Self.Device.SwapChains.Items[0].Height <> TControl(Self.Parent).ClientHeight then Y := Trunc(Y * (Self.Device.SwapChains.Items[0].Height / TControl(Self.Parent).ClientHeight)); end; if (Assigned(OwnerMouseMove)) then OwnerMouseMove(Sender, Shift, X, Y); if (Active) then begin if Shift = [ssLeft] then Control := PreviousControl else Control := Root.ControlAtPos(Point(X, Y), True, True, True); // Check if is Modal if ActiveControl <> nil then begin if ActiveControl.Handle <> nil then begin if ActiveControl.Handle is TAForm then begin if (TAForm(ActiveControl.Handle).IsModal) and (ActiveControl.Handle <> Control) then begin if (Control <> nil) then begin if ActiveControl.Handle.FindChildControl(Control.Name, True) = nil then Exit; end else begin Exit; end; end; end; end; end; if (PreviousControl <> Control) then begin if (PreviousControl <> nil) then begin if (PreviousControl.Enabled) and (PreviousControl.Visible) then if PreviousControl is TWControl then begin if Control <> nil then begin if TWControl(PreviousControl).FindChildControl(Control.Name) = nil then PreviousControl.MouseLeave; end else PreviousControl.MouseLeave; end else PreviousControl.MouseLeave; end; if (Control <> nil) then begin if (Control.Enabled) and (Control.Visible) then Control.MouseEnter; end; PreviousControl := Control; end; if (Control <> nil) then begin if (Control.Enabled) and (Control.Visible) then Control.MouseMove(Shift, X, Y); end; // used for tests only { if Control <> nil then TForm(Parent).caption := '(' + Inttostr(X) + ',' + Inttostr(Y) + ') - ' + Control.Name else TForm(Parent).caption := '(' + Inttostr(X) + ',' + Inttostr(Y) + ')'; } end; end; procedure TAControlManager.MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Control: TAControl; begin // fixes coordinates when scaled if (Self.Parent is TControl) then begin if Self.Device.SwapChains.Items[0].Width <> TControl(Self.Parent).ClientWidth then X := Trunc(X * (Self.Device.SwapChains.Items[0].Width / TControl(Self.Parent).ClientWidth)); if Self.Device.SwapChains.Items[0].Height <> TControl(Self.Parent).ClientHeight then Y := Trunc(Y * (Self.Device.SwapChains.Items[0].Height / TControl(Self.Parent).ClientHeight)); end; if (Assigned(OwnerMouseUp)) then OwnerMouseUp(Sender, Button, Shift, X, Y); if (Active) then begin if Button = mbLeft then begin Control := PreviousControl; // if (FPrevControl is TADropPanel) then // begin // Control := FRoot.ControlAtPos(Point(X, Y), True, True, True); // // if not(Control is TADropPanel) then // begin // Control := FPrevControl; // end; // end; end else Control := Root.ControlAtPos(Point(X, Y), True, True, True); if (Control <> nil) then begin if (Control.Enabled) and (Control.Visible) then Control.MouseUp(Button, Shift, X, Y); // if (FPrevControl <> Control) and (FPrevControl is TADropPanel) then // TADropPanel(FPrevControl).DragItem := False; PreviousControl := Control; end; end; end; procedure TAControlManager.MouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean); var Control: TAControl; begin if (Assigned(OwnerMouseWheel)) then OwnerMouseWheel(Sender, Shift, WheelDelta, MousePos, Handled); if (Active) then begin Control := PreviousControl; if (Control <> nil) then if (Control.Enabled) and (Control.Visible) then Control.MouseWheel(Shift, WheelDelta, MousePos); end; end; procedure TAControlManager.MouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); var Control: TAControl; begin if (Assigned(OwnerMouseWheelDown)) then OwnerMouseWheelDown(Sender, Shift, MousePos, Handled); if (Active) then begin Control := PreviousControl; if (Control <> nil) then if (Control.Enabled) and (Control.Visible) then Control.MouseWheelDown(Shift, MousePos); end; end; procedure TAControlManager.MouseWheelUp(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean); var Control: TAControl; begin if (Assigned(OwnerMouseWheelUp)) then OwnerMouseWheelUp(Sender, Shift, MousePos, Handled); if (Active) then begin Control := PreviousControl; if (Control <> nil) then if (Control.Enabled) and (Control.Visible) then Control.MouseWheelUp(Shift, MousePos); end; end; procedure TAControlManager.RestoreEvents; begin if Parent is TForm then begin TForm(Parent).OnMouseDown := Self.OwnerMouseDown; TForm(Parent).OnMouseUp := Self.OwnerMouseUp; TForm(Parent).OnMouseMove := Self.OwnerMouseMove; TForm(Parent).OnMouseEnter := Self.OwnerMouseEnter; TForm(Parent).OnMouseLeave := Self.OwnerMouseLeave; TForm(Parent).OnMouseWheel := Self.OwnerMouseWheel; TForm(Parent).OnMouseWheelDown := Self.OwnerMouseWheelDown; TForm(Parent).OnMouseWheelUp := Self.OwnerMouseWheelUp; TForm(Parent).OnKeyDown := Self.OwnerKeyDown; TForm(Parent).OnKeyUp := Self.OwnerKeyUp; TForm(Parent).OnKeyPress := Self.OwnerKeyPress; TForm(Parent).OnShortCut := Self.OwnerShortCut; TForm(Parent).OnClick := Self.OwnerClick; TForm(Parent).OnDblClick := Self.OwnerDblClick; end; end; procedure TAControlManager.SetParent(const AParent: TComponent); begin if FParent <> AParent then begin if FParent <> nil then RestoreEvents; FParent := AParent; if Device <> nil then AcquireEvents; end; end; {$ENDREGION} initialization RegisterClasses([TAForm, TAImage, TALabel, TAPanel, TAButton, TAEditBox, TACheckBox, TARadioButton, TAProgressBar, TAPaintBox, TATrackBar, TAListBox]); finalization UnRegisterClasses([TAForm, TAImage, TALabel, TAPanel, TAButton, TAEditBox, TACheckBox, TARadioButton, TAProgressBar, TAPaintBox, TATrackBar, TAListBox]); end.