388 lines
14 KiB
ObjectPascal
388 lines
14 KiB
ObjectPascal
unit DynamicFMXControl;
|
|
|
|
interface
|
|
|
|
uses
|
|
System.SysUtils,
|
|
System.Types,
|
|
System.UITypes,
|
|
System.Classes,
|
|
FMX.Controls,
|
|
FMX.Graphics,
|
|
FMX.Forms,
|
|
FMX.StdCtrls,
|
|
FMX.Types;
|
|
|
|
type
|
|
// Dezidierte Event-Typen für virtuelle Methoden von TControl
|
|
TControlPaintEvent = reference to procedure;
|
|
TControlMouseEvent = reference to procedure(Button: TMouseButton; Shift: TShiftState; X, Y: Single);
|
|
TControlMouseMoveEvent = reference to procedure(Shift: TShiftState; X, Y: Single);
|
|
TControlMouseWheelEvent = reference to procedure(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
|
|
TControlKeyEvent = reference to procedure(var Key: Word; var KeyChar: WideChar; Shift: TShiftState);
|
|
TControlDragEvent = reference to procedure(const Data: TDragObject; const Point: TPointF);
|
|
TControlDragOverEvent = reference to procedure(const Data: TDragObject; const Point: TPointF; var Operation: TDragOperation);
|
|
TControlNotifyEvent = reference to procedure;
|
|
TControlCanFocusEvent = reference to function: Boolean;
|
|
TControlShowContextMenuEvent = reference to function(const ScreenPosition: TPointF): Boolean;
|
|
TControlSetHintEvent = reference to procedure(const AHint: string);
|
|
TControlGetHintStringEvent = reference to function: string;
|
|
TControlHasHintEvent = reference to function: Boolean;
|
|
TControlCanShowHintEvent = reference to function: Boolean;
|
|
TControlGetDefaultSizeEvent = reference to function: TSizeF;
|
|
TControlSetVisibleEvent = reference to procedure(const Value: Boolean);
|
|
TControlSetEnabledEvent = reference to procedure(const Value: Boolean);
|
|
TControlDoAbsoluteChangedEvent = reference to procedure;
|
|
|
|
TDynamicControl = class(TControl)
|
|
private
|
|
// Private Felder für die Event-Handler
|
|
FPaintEvent: TControlPaintEvent;
|
|
FMouseDownEvent: TControlMouseEvent;
|
|
FMouseUpEvent: TControlMouseEvent;
|
|
FMouseMoveEvent: TControlMouseMoveEvent;
|
|
FMouseWheelEvent: TControlMouseWheelEvent;
|
|
FKeyDownEvent: TControlKeyEvent;
|
|
FKeyUpEvent: TControlKeyEvent;
|
|
FClickEvent: TControlNotifyEvent;
|
|
FDblClickEvent: TControlNotifyEvent;
|
|
FDragEnterEvent: TControlDragEvent;
|
|
FDragOverEvent: TControlDragOverEvent;
|
|
FDragDropEvent: TControlDragEvent;
|
|
FDragLeaveEvent: TControlNotifyEvent;
|
|
FDragEndEvent: TControlNotifyEvent;
|
|
FEnterEvent: TControlNotifyEvent;
|
|
FExitEvent: TControlNotifyEvent;
|
|
FMouseEnterEvent: TControlNotifyEvent;
|
|
FMouseLeaveEvent: TControlNotifyEvent;
|
|
FResizeEvent: TControlNotifyEvent;
|
|
FResizedEvent: TControlNotifyEvent;
|
|
FCanFocusEvent: TControlCanFocusEvent;
|
|
FShowContextMenuEvent: TControlShowContextMenuEvent;
|
|
FSetHintEvent: TControlSetHintEvent;
|
|
FGetHintStringEvent: TControlGetHintStringEvent;
|
|
FHasHintEvent: TControlHasHintEvent;
|
|
FCanShowHintEvent: TControlCanShowHintEvent;
|
|
FGetDefaultSizeEvent: TControlGetDefaultSizeEvent;
|
|
FRecalculateAbsoluteMatricesEvent: TControlNotifyEvent;
|
|
FSetVisibleEvent: TControlSetVisibleEvent;
|
|
FSetEnabledEvent: TControlSetEnabledEvent;
|
|
FDoAbsoluteChangedEvent: TControlDoAbsoluteChangedEvent;
|
|
|
|
protected
|
|
// Überschriebene virtuelle Methoden, die die Events auslösen
|
|
procedure Paint; override;
|
|
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Single); override;
|
|
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Single); override;
|
|
procedure MouseMove(Shift: TShiftState; X, Y: Single); override;
|
|
procedure MouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean); override;
|
|
procedure Click; override;
|
|
procedure DblClick; override;
|
|
procedure KeyDown(var Key: Word; var KeyChar: WideChar; Shift: TShiftState); override;
|
|
procedure KeyUp(var Key: Word; var KeyChar: WideChar; Shift: TShiftState); override;
|
|
procedure DragEnter(const Data: TDragObject; const Point: TPointF); override;
|
|
procedure DragOver(const Data: TDragObject; const Point: TPointF; var Operation: TDragOperation); override;
|
|
procedure DragDrop(const Data: TDragObject; const Point: TPointF); override;
|
|
procedure DragLeave; override;
|
|
procedure DragEnd; override;
|
|
procedure DoEnter; override;
|
|
procedure DoExit; override;
|
|
procedure DoMouseEnter; override;
|
|
procedure DoMouseLeave; override;
|
|
procedure Resize; override;
|
|
procedure DoResized; override;
|
|
function GetCanFocus: Boolean; override;
|
|
function ShowContextMenu(const ScreenPosition: TPointF): Boolean; override;
|
|
procedure SetHint(const AHint: string); override;
|
|
function GetHintString: string; override;
|
|
function HasHint: Boolean; override;
|
|
function CanShowHint: Boolean; override;
|
|
function GetDefaultSize: TSizeF; override;
|
|
procedure RecalculateAbsoluteMatrices; override;
|
|
procedure SetVisible(const Value: Boolean); override;
|
|
procedure SetEnabled(const Value: Boolean); override;
|
|
procedure DoAbsoluteChanged; override;
|
|
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
|
|
// Public Properties, die die Events exponieren
|
|
property OnPaint: TControlPaintEvent read FPaintEvent write FPaintEvent;
|
|
property OnMouseDown: TControlMouseEvent read FMouseDownEvent write FMouseDownEvent;
|
|
property OnMouseUp: TControlMouseEvent read FMouseUpEvent write FMouseUpEvent;
|
|
property OnMouseMove: TControlMouseMoveEvent read FMouseMoveEvent write FMouseMoveEvent;
|
|
property OnMouseWheel: TControlMouseWheelEvent read FMouseWheelEvent write FMouseWheelEvent;
|
|
property OnClick: TControlNotifyEvent read FClickEvent write FClickEvent;
|
|
property OnDblClick: TControlNotifyEvent read FDblClickEvent write FDblClickEvent;
|
|
property OnKeyDown: TControlKeyEvent read FKeyDownEvent write FKeyDownEvent;
|
|
property OnKeyUp: TControlKeyEvent read FKeyUpEvent write FKeyUpEvent;
|
|
property OnDragEnter: TControlDragEvent read FDragEnterEvent write FDragEnterEvent;
|
|
property OnDragOver: TControlDragOverEvent read FDragOverEvent write FDragOverEvent;
|
|
property OnDragDrop: TControlDragEvent read FDragDropEvent write FDragDropEvent;
|
|
property OnDragLeave: TControlNotifyEvent read FDragLeaveEvent write FDragLeaveEvent;
|
|
property OnDragEnd: TControlNotifyEvent read FDragEndEvent write FDragEndEvent;
|
|
property OnEnter: TControlNotifyEvent read FEnterEvent write FEnterEvent;
|
|
property OnExit: TControlNotifyEvent read FExitEvent write FExitEvent;
|
|
property OnMouseEnter: TControlNotifyEvent read FMouseEnterEvent write FMouseEnterEvent;
|
|
property OnMouseLeave: TControlNotifyEvent read FMouseLeaveEvent write FMouseLeaveEvent;
|
|
property OnResize: TControlNotifyEvent read FResizeEvent write FResizeEvent;
|
|
property OnResized: TControlNotifyEvent read FResizedEvent write FResizedEvent;
|
|
property OnCanFocus: TControlCanFocusEvent read FCanFocusEvent write FCanFocusEvent;
|
|
property OnShowContextMenu: TControlShowContextMenuEvent read FShowContextMenuEvent write FShowContextMenuEvent;
|
|
property OnSetHint: TControlSetHintEvent read FSetHintEvent write FSetHintEvent;
|
|
property OnGetHintString: TControlGetHintStringEvent read FGetHintStringEvent write FGetHintStringEvent;
|
|
property OnHasHint: TControlHasHintEvent read FHasHintEvent write FHasHintEvent;
|
|
property OnCanShowHint: TControlCanShowHintEvent read FCanShowHintEvent write FCanShowHintEvent;
|
|
property OnGetDefaultSize: TControlGetDefaultSizeEvent read FGetDefaultSizeEvent write FGetDefaultSizeEvent;
|
|
property OnRecalculateAbsoluteMatrices: TControlNotifyEvent
|
|
read FRecalculateAbsoluteMatricesEvent write FRecalculateAbsoluteMatricesEvent;
|
|
property OnSetVisible: TControlSetVisibleEvent read FSetVisibleEvent write FSetVisibleEvent;
|
|
property OnSetEnabled: TControlSetEnabledEvent read FSetEnabledEvent write FSetEnabledEvent;
|
|
property OnDoAbsoluteChanged: TControlDoAbsoluteChangedEvent read FDoAbsoluteChangedEvent write FDoAbsoluteChangedEvent;
|
|
end;
|
|
|
|
implementation
|
|
|
|
{ TDynamicControl }
|
|
|
|
constructor TDynamicControl.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
Width := 150;
|
|
Height := 100;
|
|
HitTest := True;
|
|
end;
|
|
|
|
function TDynamicControl.CanShowHint: Boolean;
|
|
begin
|
|
if Assigned(FCanShowHintEvent) then
|
|
Result := FCanShowHintEvent
|
|
else
|
|
Result := inherited CanShowHint;
|
|
end;
|
|
|
|
procedure TDynamicControl.Click;
|
|
begin
|
|
inherited Click;
|
|
if Assigned(FClickEvent) then
|
|
FClickEvent;
|
|
end;
|
|
|
|
procedure TDynamicControl.DblClick;
|
|
begin
|
|
inherited DblClick;
|
|
if Assigned(FDblClickEvent) then
|
|
FDblClickEvent;
|
|
end;
|
|
|
|
procedure TDynamicControl.DoAbsoluteChanged;
|
|
begin
|
|
inherited DoAbsoluteChanged;
|
|
if Assigned(FDoAbsoluteChangedEvent) then
|
|
FDoAbsoluteChangedEvent;
|
|
end;
|
|
|
|
procedure TDynamicControl.DragDrop(const Data: TDragObject; const Point: TPointF);
|
|
begin
|
|
inherited DragDrop(Data, Point);
|
|
if Assigned(FDragDropEvent) then
|
|
FDragDropEvent(Data, Point);
|
|
end;
|
|
|
|
procedure TDynamicControl.DragEnd;
|
|
begin
|
|
inherited DragEnd;
|
|
if Assigned(FDragEndEvent) then
|
|
FDragEndEvent;
|
|
end;
|
|
|
|
procedure TDynamicControl.DragEnter(const Data: TDragObject; const Point: TPointF);
|
|
begin
|
|
inherited DragEnter(Data, Point);
|
|
if Assigned(FDragEnterEvent) then
|
|
FDragEnterEvent(Data, Point);
|
|
end;
|
|
|
|
procedure TDynamicControl.DragLeave;
|
|
begin
|
|
inherited DragLeave;
|
|
if Assigned(FDragLeaveEvent) then
|
|
FDragLeaveEvent;
|
|
end;
|
|
|
|
procedure TDynamicControl.DragOver(const Data: TDragObject; const Point: TPointF; var Operation: TDragOperation);
|
|
begin
|
|
inherited DragOver(Data, Point, Operation);
|
|
if Assigned(FDragOverEvent) then
|
|
FDragOverEvent(Data, Point, Operation);
|
|
end;
|
|
|
|
procedure TDynamicControl.DoEnter;
|
|
begin
|
|
inherited DoEnter;
|
|
if Assigned(FEnterEvent) then
|
|
FEnterEvent;
|
|
end;
|
|
|
|
procedure TDynamicControl.DoExit;
|
|
begin
|
|
inherited DoExit;
|
|
if Assigned(FExitEvent) then
|
|
FExitEvent;
|
|
end;
|
|
|
|
procedure TDynamicControl.DoMouseEnter;
|
|
begin
|
|
inherited DoMouseEnter;
|
|
if Assigned(FMouseEnterEvent) then
|
|
FMouseEnterEvent;
|
|
end;
|
|
|
|
procedure TDynamicControl.DoMouseLeave;
|
|
begin
|
|
inherited DoMouseLeave;
|
|
if Assigned(FMouseLeaveEvent) then
|
|
FMouseLeaveEvent;
|
|
end;
|
|
|
|
procedure TDynamicControl.DoResized;
|
|
begin
|
|
inherited DoResized;
|
|
if Assigned(FResizedEvent) then
|
|
FResizedEvent;
|
|
end;
|
|
|
|
function TDynamicControl.GetCanFocus: Boolean;
|
|
begin
|
|
if Assigned(FCanFocusEvent) then
|
|
Result := FCanFocusEvent
|
|
else
|
|
Result := inherited GetCanFocus;
|
|
end;
|
|
|
|
function TDynamicControl.GetDefaultSize: TSizeF;
|
|
begin
|
|
if Assigned(FGetDefaultSizeEvent) then
|
|
Result := FGetDefaultSizeEvent
|
|
else
|
|
Result := inherited GetDefaultSize;
|
|
end;
|
|
|
|
function TDynamicControl.GetHintString: string;
|
|
begin
|
|
if Assigned(FGetHintStringEvent) then
|
|
Result := FGetHintStringEvent
|
|
else
|
|
Result := inherited GetHintString;
|
|
end;
|
|
|
|
function TDynamicControl.HasHint: Boolean;
|
|
begin
|
|
if Assigned(FHasHintEvent) then
|
|
Result := FHasHintEvent
|
|
else
|
|
Result := inherited HasHint;
|
|
end;
|
|
|
|
procedure TDynamicControl.KeyDown(var Key: Word; var KeyChar: WideChar; Shift: TShiftState);
|
|
begin
|
|
inherited KeyDown(Key, KeyChar, Shift);
|
|
if Assigned(FKeyDownEvent) then
|
|
FKeyDownEvent(Key, KeyChar, Shift);
|
|
end;
|
|
|
|
procedure TDynamicControl.KeyUp(var Key: Word; var KeyChar: WideChar; Shift: TShiftState);
|
|
begin
|
|
inherited KeyUp(Key, KeyChar, Shift);
|
|
if Assigned(FKeyUpEvent) then
|
|
FKeyUpEvent(Key, KeyChar, Shift);
|
|
end;
|
|
|
|
procedure TDynamicControl.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Single);
|
|
begin
|
|
inherited MouseDown(Button, Shift, X, Y);
|
|
if Assigned(FMouseDownEvent) then
|
|
FMouseDownEvent(Button, Shift, X, Y);
|
|
end;
|
|
|
|
procedure TDynamicControl.MouseMove(Shift: TShiftState; X, Y: Single);
|
|
begin
|
|
inherited MouseMove(Shift, X, Y);
|
|
if Assigned(FMouseMoveEvent) then
|
|
FMouseMoveEvent(Shift, X, Y);
|
|
end;
|
|
|
|
procedure TDynamicControl.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Single);
|
|
begin
|
|
inherited MouseUp(Button, Shift, X, Y);
|
|
if Assigned(FMouseUpEvent) then
|
|
FMouseUpEvent(Button, Shift, X, Y);
|
|
end;
|
|
|
|
procedure TDynamicControl.MouseWheel(Shift: TShiftState; WheelDelta: Integer; var Handled: Boolean);
|
|
begin
|
|
inherited MouseWheel(Shift, WheelDelta, Handled);
|
|
if Assigned(FMouseWheelEvent) then
|
|
FMouseWheelEvent(Shift, WheelDelta, Handled);
|
|
end;
|
|
|
|
procedure TDynamicControl.Paint;
|
|
begin
|
|
inherited Paint;
|
|
if Assigned(FPaintEvent) then
|
|
FPaintEvent
|
|
else
|
|
begin
|
|
Canvas.Fill.Color := TAlphaColors.LightSteelBlue;
|
|
Canvas.FillRect(LocalRect, 0, 0, [], 1);
|
|
Canvas.Stroke.Color := TAlphaColors.Gray;
|
|
Canvas.Stroke.Thickness := 1;
|
|
Canvas.DrawRect(LocalRect, 0, 0, [], 1);
|
|
end;
|
|
end;
|
|
|
|
procedure TDynamicControl.RecalculateAbsoluteMatrices;
|
|
begin
|
|
inherited RecalculateAbsoluteMatrices;
|
|
if Assigned(FRecalculateAbsoluteMatricesEvent) then
|
|
FRecalculateAbsoluteMatricesEvent;
|
|
end;
|
|
|
|
procedure TDynamicControl.Resize;
|
|
begin
|
|
inherited Resize;
|
|
if Assigned(FResizeEvent) then
|
|
FResizeEvent;
|
|
end;
|
|
|
|
procedure TDynamicControl.SetEnabled(const Value: Boolean);
|
|
begin
|
|
inherited SetEnabled(Value);
|
|
if Assigned(FSetEnabledEvent) then
|
|
FSetEnabledEvent(Value);
|
|
end;
|
|
|
|
procedure TDynamicControl.SetHint(const AHint: string);
|
|
begin
|
|
inherited SetHint(AHint);
|
|
if Assigned(FSetHintEvent) then
|
|
FSetHintEvent(AHint);
|
|
end;
|
|
|
|
procedure TDynamicControl.SetVisible(const Value: Boolean);
|
|
begin
|
|
inherited SetVisible(Value);
|
|
if Assigned(FSetVisibleEvent) then
|
|
FSetVisibleEvent(Value);
|
|
end;
|
|
|
|
function TDynamicControl.ShowContextMenu(const ScreenPosition: TPointF): Boolean;
|
|
begin
|
|
if Assigned(FShowContextMenuEvent) then
|
|
Result := FShowContextMenuEvent(ScreenPosition)
|
|
else
|
|
Result := inherited ShowContextMenu(ScreenPosition);
|
|
end;
|
|
|
|
end.
|