Files
MycLib/AuraTrader/DynamicFMXControl.pas
T
Michael Schimmel 45ff69fd92 Code-Formatting
2025-07-12 17:10:01 +02:00

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.