mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-04-05 00:48:05 +02:00
2437 lines
95 KiB
ObjectPascal
2437 lines
95 KiB
ObjectPascal
{
|
|
/***************************************************************************
|
|
forms.pp
|
|
--------
|
|
Component Library Code
|
|
|
|
|
|
Initial Revision : Sun Mar 28 23:15:32 CST 1999
|
|
Revised : Sat Jul 15 1999
|
|
|
|
***************************************************************************/
|
|
|
|
*****************************************************************************
|
|
This file is part of the Lazarus Component Library (LCL)
|
|
|
|
See the file COPYING.modifiedLGPL.txt, included in this distribution,
|
|
for details about the license.
|
|
*****************************************************************************
|
|
}
|
|
|
|
unit Forms;
|
|
|
|
{$mode objfpc}{$H+}{$macro on}
|
|
{$I lcl_defines.inc}
|
|
|
|
interface
|
|
|
|
{$ifdef Trace}
|
|
{$ASSERTIONS ON}
|
|
{$endif}
|
|
|
|
{$DEFINE HasDefaultValues}
|
|
|
|
uses
|
|
// RTL + FCL
|
|
Classes, SysUtils, Types, TypInfo, Math, CustApp, System.UITypes,
|
|
// LCL
|
|
LCLStrConsts, LCLType, LCLProc, LCLIntf, LCLVersion, LCLClasses, InterfaceBase,
|
|
LResources, Graphics, Menus, LMessages, CustomTimer, ActnList,
|
|
ClipBrd, HelpIntfs, Controls, ImgList, Themes,
|
|
// LazUtils
|
|
LazFileUtils, LazUTF8, Maps, IntegerList, LazMethodList, LazLoggerBase,
|
|
Laztracer, LazUtilities, GraphType;
|
|
|
|
type
|
|
TProcedure = procedure;
|
|
TProcedureOfObject = procedure of object;
|
|
|
|
// form position policies:
|
|
TPosition = (
|
|
poDesigned, // use bounds from the designer (read from stream)
|
|
poDefault, // LCL decision (normally window manager decides)
|
|
poDefaultPosOnly, // designed size and LCL position
|
|
poDefaultSizeOnly, // designed position and LCL size
|
|
poScreenCenter, // center form on screen (depends on DefaultMonitor)
|
|
poDesktopCenter, // center form on desktop (total of all screens)
|
|
poMainFormCenter, // center form on main form (depends on DefaultMonitor)
|
|
poOwnerFormCenter, // center form on owner form (depends on DefaultMonitor)
|
|
poWorkAreaCenter // center form on working area (depends on DefaultMonitor)
|
|
);
|
|
|
|
TWindowState = (wsNormal, wsMinimized, wsMaximized, wsFullScreen);
|
|
{$IF FPC_FULLVERSION >= 30300}
|
|
TCloseAction = System.UITypes.TCloseAction;
|
|
{$ELSE}
|
|
TCloseAction = (caNone, caHide, caFree, caMinimize);
|
|
{$ENDIF}
|
|
|
|
{$IF FPC_FULLVERSION >= 30300}
|
|
const
|
|
caNone = System.UITypes.caNone;
|
|
caHide = System.UITypes.caHide;
|
|
caFree = System.UITypes.caFree;
|
|
caMinimize = System.UITypes.caMinimize;
|
|
{$ENDIF}
|
|
|
|
type
|
|
// forward class declarations
|
|
TIDesigner = class;
|
|
TMonitor = class;
|
|
TScrollingWinControl = class;
|
|
TCustomForm = class;
|
|
|
|
{ Hint actions }
|
|
|
|
TCustomHintAction = class(TCustomAction)
|
|
published
|
|
property Hint;
|
|
end;
|
|
|
|
|
|
{ TControlScrollBar }
|
|
|
|
TScrollBarKind = (sbHorizontal, sbVertical);
|
|
TScrollBarInc = 1..32768;
|
|
TScrollBarStyle = (ssRegular, ssFlat, ssHotTrack);
|
|
EScrollBar = class(Exception) end;
|
|
|
|
TControlScrollBar = class(TPersistent)
|
|
private
|
|
FAutoRange: Longint; // = Max(0, FRange - ClientSize)
|
|
FIncrement: TScrollBarInc;
|
|
FKind: TScrollBarKind;
|
|
FPage: TScrollBarInc;
|
|
FRange: Integer; // if AutoScroll=true this is the needed size of the child controls
|
|
FSmooth: Boolean;
|
|
FTracking: Boolean;
|
|
FVisible: Boolean;
|
|
FOldScrollInfo: TScrollInfo;
|
|
FOldVisible: Boolean;
|
|
FOldScrollInfoValid: Boolean;
|
|
protected
|
|
FControl: TWinControl;
|
|
FPosition: Integer;
|
|
function ControlHandle: HWnd; virtual;
|
|
function GetAutoScroll: Boolean; virtual;
|
|
function GetIncrement: TScrollBarInc; virtual;
|
|
function GetPage: TScrollBarInc; virtual;
|
|
function GetPosition: Integer; virtual;
|
|
function GetRange: Integer; virtual;
|
|
function GetSize: Integer; virtual;
|
|
function GetSmooth: Boolean; virtual;
|
|
function HandleAllocated: Boolean; virtual;
|
|
function IsRangeStored: Boolean; virtual;
|
|
procedure ControlUpdateScrollBars; virtual;
|
|
procedure InternalSetRange(const AValue: Integer); virtual;
|
|
procedure ScrollHandler(var Message: TLMScroll);
|
|
procedure SetIncrement(const AValue: TScrollBarInc); virtual;
|
|
procedure SetPage(const AValue: TScrollBarInc); virtual;
|
|
procedure SetPosition(const Value: Integer);
|
|
procedure SetRange(const AValue: Integer); virtual;
|
|
procedure SetSmooth(const AValue: Boolean); virtual;
|
|
procedure SetTracking(const AValue: Boolean);
|
|
procedure SetVisible(const AValue: Boolean); virtual;
|
|
procedure UpdateScrollBar; virtual;
|
|
procedure InvalidateScrollInfo;
|
|
{$ifdef VerboseScrollingWinControl}
|
|
function DebugCondition: Boolean;
|
|
{$endif}
|
|
function GetHorzScrollBar: TControlScrollBar; virtual;
|
|
function GetVertScrollBar: TControlScrollBar; virtual;
|
|
protected
|
|
function ScrollBarShouldBeVisible: Boolean; virtual; // should the widget be made visible?
|
|
public
|
|
constructor Create(AControl: TWinControl; AKind: TScrollBarKind);
|
|
procedure Assign(Source: TPersistent); override;
|
|
function IsScrollBarVisible: Boolean; virtual; // returns current widget state
|
|
function ScrollPos: Integer; virtual;
|
|
property Kind: TScrollBarKind read FKind;
|
|
function GetOtherScrollBar: TControlScrollBar;
|
|
property Size: Integer read GetSize stored False;
|
|
function ControlSize: Integer; // return for vertical scrollbar the control width
|
|
function ClientSize: Integer; // return for vertical scrollbar the clientwidth
|
|
function ClientSizeWithBar: Integer; // return for vertical scrollbar the clientwidth with the bar, even if Visible=false
|
|
function ClientSizeWithoutBar: Integer; // return for vertical scrollbar the clientwidth without the bar, even if Visible=true
|
|
published
|
|
property Increment: TScrollBarInc read GetIncrement write SetIncrement default 8;
|
|
property Page: TScrollBarInc read GetPage write SetPage default 80;
|
|
property Smooth: Boolean read GetSmooth write SetSmooth default False;
|
|
property Position: Integer read GetPosition write SetPosition default 0; // 0..Range-Page
|
|
property Range: Integer read GetRange write SetRange stored IsRangeStored default 0; // >=Page
|
|
property Tracking: Boolean read FTracking write SetTracking default False;
|
|
property Visible: Boolean read FVisible write SetVisible default True;
|
|
end;
|
|
|
|
{ TScrollingWinControl }
|
|
|
|
TScrollingWinControl = class(TCustomControl)
|
|
private
|
|
FHorzScrollBar: TControlScrollBar;
|
|
FVertScrollBar: TControlScrollBar;
|
|
FAutoScroll: Boolean;
|
|
FIsUpdating: Boolean;
|
|
procedure SetHorzScrollBar(Value: TControlScrollBar);
|
|
procedure SetVertScrollBar(Value: TControlScrollBar);
|
|
procedure HideScrollbars;
|
|
protected
|
|
class procedure WSRegisterClass; override;
|
|
procedure AlignControls(AControl: TControl; var ARect: TRect); override;
|
|
function AutoScrollEnabled: Boolean; virtual;
|
|
procedure CalculateAutoRanges; virtual;
|
|
procedure CreateWnd; override;
|
|
procedure DestroyWnd; override;
|
|
function GetClientScrollOffset: TPoint; override;
|
|
function GetLogicalClientRect: TRect; override;// logical size of client area
|
|
procedure DoOnResize; override;
|
|
procedure GetPreferredSizeClientFrame(out aWidth, aHeight: Integer); override;
|
|
procedure WMSize(var Message: TLMSize); message LM_Size;
|
|
procedure WMHScroll(var Message : TLMHScroll); message LM_HScroll;
|
|
procedure WMVScroll(var Message : TLMVScroll); message LM_VScroll;
|
|
procedure ComputeScrollbars; virtual;
|
|
procedure SetAutoScroll(Value: Boolean); virtual;
|
|
procedure Loaded; override;
|
|
procedure Resizing(State: TWindowState); virtual;
|
|
property AutoScroll: Boolean read FAutoScroll write SetAutoScroll default False;// auto show/hide scrollbars
|
|
procedure SetAutoSize(Value: Boolean); override;
|
|
public
|
|
constructor Create(TheOwner : TComponent); override;
|
|
destructor Destroy; override;
|
|
function ScreenToClient(const APoint: TPoint): TPoint; override;
|
|
function ClientToScreen(const APoint: TPoint): TPoint; override;
|
|
procedure UpdateScrollbars;
|
|
class function GetControlClassDefaultSize: TSize; override;
|
|
procedure ScrollBy(DeltaX, DeltaY: Integer); override;
|
|
procedure ScrollInView(AControl: TControl);
|
|
published
|
|
property HorzScrollBar: TControlScrollBar read FHorzScrollBar write SetHorzScrollBar;
|
|
property VertScrollBar: TControlScrollBar read FVertScrollBar write SetVertScrollBar;
|
|
end;
|
|
|
|
|
|
{ TScrollBox }
|
|
|
|
TScrollBox = class(TScrollingWinControl)
|
|
protected
|
|
class procedure WSRegisterClass; override;
|
|
|
|
procedure SetParentBackground(const AParentBackground: Boolean); override;
|
|
|
|
procedure CMParentColorChanged(var Message: TLMessage); message CM_PARENTCOLORCHANGED;
|
|
procedure Loaded; override;
|
|
procedure UpdateParentColorChange;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
published
|
|
property Align;
|
|
property Anchors;
|
|
property AutoSize;
|
|
property AutoScroll default True;
|
|
property BorderSpacing;
|
|
property BiDiMode;
|
|
property BorderStyle default bsSingle;
|
|
property ChildSizing;
|
|
property ClientHeight;
|
|
property ClientWidth;
|
|
property Constraints;
|
|
property DockSite;
|
|
property DragCursor;
|
|
property DragKind;
|
|
|
|
property DragMode;
|
|
property Enabled;
|
|
property Color nodefault;
|
|
property Font;
|
|
property ParentBackground default True;
|
|
property ParentBiDiMode;
|
|
property ParentColor;
|
|
property ParentFont;
|
|
property ParentShowHint;
|
|
property PopupMenu;
|
|
property ShowHint;
|
|
property TabOrder;
|
|
property TabStop;
|
|
property Visible;
|
|
//property OnCanResize;
|
|
property OnClick;
|
|
property OnConstrainedResize;
|
|
property OnDblClick;
|
|
property OnDockDrop;
|
|
property OnDockOver;
|
|
property OnDragDrop;
|
|
property OnDragOver;
|
|
property OnEndDock;
|
|
property OnEndDrag;
|
|
property OnEnter;
|
|
property OnExit;
|
|
property OnGetSiteInfo;
|
|
property OnMouseDown;
|
|
property OnMouseEnter;
|
|
property OnMouseLeave;
|
|
property OnMouseMove;
|
|
property OnMouseUp;
|
|
property OnMouseWheel;
|
|
property OnMouseWheelDown;
|
|
property OnMouseWheelUp;
|
|
property OnMouseWheelHorz;
|
|
property OnMouseWheelLeft;
|
|
property OnMouseWheelRight;
|
|
property OnResize;
|
|
property OnStartDock;
|
|
property OnStartDrag;
|
|
property OnUnDock;
|
|
property OnPaint;
|
|
end;
|
|
|
|
TCustomDesignControl = class(TScrollingWinControl)
|
|
private
|
|
FScaled: Boolean;
|
|
FDesignTimePPI: Integer;
|
|
FPixelsPerInch: Integer;
|
|
|
|
function DesignTimePPIIsStored: Boolean;
|
|
procedure SetDesignTimePPI(const ADesignTimePPI: Integer);
|
|
protected
|
|
procedure SetScaled(const AScaled: Boolean); virtual;
|
|
|
|
procedure DoAutoAdjustLayout(const AMode: TLayoutAdjustmentPolicy;
|
|
const AXProportion, AYProportion: Double); override;
|
|
public
|
|
constructor Create(TheOwner: TComponent); override;
|
|
|
|
procedure AutoAdjustLayout(AMode: TLayoutAdjustmentPolicy; const AFromPPI,
|
|
AToPPI, AOldFormWidth, ANewFormWidth: Integer); override;
|
|
public
|
|
property DesignTimePPI: Integer read FDesignTimePPI write SetDesignTimePPI stored DesignTimePPIIsStored;
|
|
property PixelsPerInch: Integer read FPixelsPerInch write FPixelsPerInch stored False;
|
|
property Scaled: Boolean read FScaled write SetScaled default True;
|
|
end;
|
|
|
|
|
|
{ TCustomFrame }
|
|
|
|
TCustomFrame = class(TCustomDesignControl)
|
|
private
|
|
procedure AddActionList(ActionList: TCustomActionList);
|
|
procedure RemoveActionList(ActionList: TCustomActionList);
|
|
procedure ReadDesignLeft(Reader: TReader);
|
|
procedure ReadDesignTop(Reader: TReader);
|
|
procedure WriteDesignLeft(Writer: TWriter);
|
|
procedure WriteDesignTop(Writer: TWriter);
|
|
protected
|
|
class procedure WSRegisterClass; override;
|
|
procedure Notification(AComponent: TComponent;
|
|
Operation: TOperation); override;
|
|
procedure SetColor(Value: TColor); override;
|
|
procedure SetParent(AParent: TWinControl); override;
|
|
procedure SetParentBackground(const AParentBackground: Boolean); override;
|
|
procedure CMParentColorChanged(var Message: TLMessage); message CM_PARENTCOLORCHANGED;
|
|
procedure DefineProperties(Filer: TFiler); override;
|
|
procedure CalculatePreferredSize(var PreferredWidth,
|
|
PreferredHeight: Integer; WithThemeSpace: Boolean); override;
|
|
procedure UpdateOpaque;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
|
|
class function GetControlClassDefaultSize: TSize; override;
|
|
|
|
property ParentBackground default True;
|
|
end;
|
|
|
|
TCustomFrameClass = class of TCustomFrame;
|
|
|
|
|
|
{ TFrame }
|
|
|
|
TFrame = class(TCustomFrame)
|
|
private
|
|
FLCLVersion: string;
|
|
function LCLVersionIsStored: Boolean;
|
|
public
|
|
constructor Create(TheOwner: TComponent); override;
|
|
published
|
|
property Align;
|
|
property Anchors;
|
|
property AutoScroll;
|
|
property AutoSize;
|
|
property BiDiMode;
|
|
property BorderSpacing;
|
|
property ChildSizing;
|
|
property ClientHeight;
|
|
property ClientWidth;
|
|
property Color nodefault;
|
|
property Constraints;
|
|
property DesignTimePPI;
|
|
property DockSite;
|
|
property DragCursor;
|
|
property DragKind;
|
|
property DragMode;
|
|
property Enabled;
|
|
property Font;
|
|
property LCLVersion: string read FLCLVersion write FLCLVersion stored LCLVersionIsStored;
|
|
property ParentBackground;
|
|
property ParentBiDiMode;
|
|
property ParentColor;
|
|
property ParentFont;
|
|
property ParentShowHint;
|
|
property PopupMenu;
|
|
property Scaled;
|
|
property ShowHint;
|
|
property TabOrder;
|
|
property TabStop;
|
|
property Visible;
|
|
|
|
property OnClick;
|
|
property OnConstrainedResize;
|
|
property OnContextPopup;
|
|
property OnDblClick;
|
|
property OnDockDrop;
|
|
property OnDockOver;
|
|
property OnDragDrop;
|
|
property OnDragOver;
|
|
property OnEndDock;
|
|
property OnEndDrag;
|
|
property OnEnter;
|
|
property OnExit;
|
|
property OnGetSiteInfo;
|
|
property OnMouseDown;
|
|
property OnMouseEnter;
|
|
property OnMouseLeave;
|
|
property OnMouseMove;
|
|
property OnMouseUp;
|
|
property OnMouseWheel;
|
|
property OnMouseWheelDown;
|
|
property OnMouseWheelUp;
|
|
property OnMouseWheelHorz;
|
|
property OnMouseWheelLeft;
|
|
property OnMouseWheelRight;
|
|
property OnResize;
|
|
property OnStartDock;
|
|
property OnStartDrag;
|
|
property OnUnDock;
|
|
end;
|
|
|
|
|
|
{ TWindowMagnetOptions }
|
|
|
|
TWindowMagnetOptions = class(TPersistent)
|
|
private
|
|
FSnapMonitor: boolean;
|
|
FSnapForms: boolean;
|
|
FSnapFormTarget: boolean;
|
|
FDistance: integer;
|
|
public
|
|
constructor Create;
|
|
procedure AssignTo(Dest: TPersistent); override;
|
|
published
|
|
property SnapToMonitor: boolean read FSnapMonitor write FSnapMonitor default false;
|
|
property SnapToForms: boolean read FSnapForms write FSnapForms default false;
|
|
property SnapFormTarget: boolean read FSnapFormTarget write FSnapFormTarget default true;
|
|
property Distance: integer read FDistance write FDistance default 10;
|
|
end;
|
|
|
|
{ TWindowMagnetManager }
|
|
|
|
TWindowMagnetManager = class
|
|
private
|
|
FEnabled: boolean;
|
|
FActiveForm: TCustomForm;
|
|
FPreviousSource, FPreviousReturn: TWindowPos;
|
|
FCompositorBorders: TRect;
|
|
protected
|
|
function SnapToSides(var x, cx: integer; px, pcx, pxout, pcxout: integer; dist: integer; leftsides, rightsides: TIntegerDynArray): boolean;
|
|
function SnapToMonitor(Opts: TWindowMagnetOptions; var WindowPos: TWindowPos): boolean;
|
|
function SnapToForms(Opts: TWindowMagnetOptions; var WindowPos: TWindowPos): boolean;
|
|
public
|
|
constructor Create;
|
|
property Enabled: boolean read FEnabled write FEnabled;
|
|
function SnapForm(Form: TCustomForm; var WindowPos: TWindowPos): boolean;
|
|
end;
|
|
|
|
|
|
{ TCustomForm }
|
|
|
|
TBorderIcon = ( // Form title bar items
|
|
biSystemMenu, // system menu
|
|
biMinimize, // minimize button
|
|
biMaximize, // maximize button
|
|
biHelp // help button
|
|
);
|
|
TBorderIcons = set of TBorderIcon;
|
|
|
|
TDefaultMonitor = ( // monitor to place form
|
|
dmDesktop, // use full desktop
|
|
dmPrimary, // use primary monitor
|
|
dmMainForm, // use monitor of main form
|
|
dmActiveForm // use monitor of active form
|
|
);
|
|
|
|
TFormStateType = (
|
|
fsCreating, // initializing (form streaming)
|
|
fsVisible, // form should be shown
|
|
fsShowing, // form handling WM_SHOWWINDOW message
|
|
fsModal, // form is modal
|
|
fsCreatedMDIChild, // todo: not mplemented
|
|
fsBorderStyleChanged,// border style is changed before window handle creation
|
|
fsFormStyleChanged, // form style is changed before window handle creation
|
|
fsFirstShow, // form is shown for the first time
|
|
fsDisableAutoSize // disable autosize
|
|
);
|
|
TFormState = set of TFormStateType;
|
|
|
|
TModalResult = System.UITypes.TModalResult;
|
|
PModalResult = ^System.UITypes.TModalResult;
|
|
|
|
TFormHandlerType = (
|
|
fhtFirstShow,
|
|
fhtClose,
|
|
fhtCreate
|
|
);
|
|
|
|
TShowInTaskbar = (
|
|
stDefault, // use default rules for showing taskbar item
|
|
stAlways, // always show taskbar item for the form
|
|
stNever // never show taskbar item for the form
|
|
);
|
|
|
|
TPopupMode = (
|
|
pmNone, // modal: popup to active form or if not available, to main form; non-modal: no window parent
|
|
pmAuto, // modal & non-modal: popup to active form or if not available, to main form
|
|
pmExplicit // modal & non-modal: popup to PopupParent or if not available, to main form
|
|
);
|
|
|
|
TCloseEvent = procedure(Sender: TObject; var CloseAction: TCloseAction) of object;
|
|
TCloseQueryEvent = procedure(Sender : TObject; var CanClose: Boolean) of object;
|
|
TDropFilesEvent = procedure (Sender: TObject; const FileNames: array of string) of object;
|
|
THelpEvent = function(Command: Word; Data: PtrInt; var CallHelp: Boolean): Boolean of object;
|
|
TShortCutEvent = procedure (var Msg: TLMKey; var Handled: Boolean) of object;
|
|
TModalDialogFinished = procedure (Sender: TObject; AResult: Integer) of object;
|
|
|
|
|
|
TCustomForm = class(TCustomDesignControl)
|
|
private
|
|
FActive: Boolean;
|
|
FActiveControl: TWinControl;
|
|
FActiveDefaultControl: TControl;
|
|
FAllowDropFiles: Boolean;
|
|
FAlphaBlend: Boolean;
|
|
FAlphaBlendValue: Byte;
|
|
FBorderIcons: TBorderIcons;
|
|
FDefaultControl: TControl;
|
|
FCancelControl: TControl;
|
|
FDefaultMonitor: TDefaultMonitor;
|
|
FDesigner: TIDesigner;
|
|
FFormStyle: TFormStyle;
|
|
FFormUpdateCount: Integer;
|
|
FFormHandlers: array[TFormHandlerType] of TMethodList;
|
|
FHelpFile: string;
|
|
FIcon: TIcon;
|
|
FOnShowModalFinished: TModalDialogFinished;
|
|
FPopupMode: TPopupMode;
|
|
FPopupParent: TCustomForm;
|
|
FSmallIconHandle: HICON;
|
|
FBigIconHandle: HICON;
|
|
FKeyPreview: Boolean;
|
|
FMenu: TMainMenu;
|
|
FModalResult: TModalResult;
|
|
FLastActiveControl: TWinControl;
|
|
FLastFocusedControl: TWinControl;
|
|
FOldBorderStyle: TFormBorderStyle;
|
|
FOnActivate: TNotifyEvent;
|
|
FOnClose: TCloseEvent;
|
|
FOnCloseQuery: TCloseQueryEvent;
|
|
FOnCreate: TNotifyEvent;
|
|
FOnDeactivate: TNotifyEvent;
|
|
FOnDestroy: TNotifyEvent;
|
|
FOnDropFiles: TDropFilesEvent;
|
|
FOnHelp: THelpEvent;
|
|
FOnHide: TNotifyEvent;
|
|
FOnShortcut: TShortCutEvent;
|
|
FOnShow: TNotifyEvent;
|
|
FOnWindowStateChange: TNotifyEvent;
|
|
FPosition: TPosition;
|
|
FRestoredLeft: Integer;
|
|
FRestoredTop: Integer;
|
|
FRestoredWidth: Integer;
|
|
FRestoredHeight: Integer;
|
|
FShowInTaskbar: TShowInTaskbar;
|
|
FWindowState: TWindowState;
|
|
FDelayedEventCtr: Integer;
|
|
FDelayedOnChangeBounds, FDelayedOnResize: Boolean;
|
|
FIsFirstOnShow, FIsFirstOnActivate: Boolean;
|
|
FSnapOptions: TWindowMagnetOptions;
|
|
function GetClientHandle: HWND;
|
|
function GetEffectiveShowInTaskBar: TShowInTaskBar;
|
|
function GetMonitor: TMonitor;
|
|
function IsAutoScrollStored: Boolean;
|
|
function IsForm: Boolean;
|
|
function IsIconStored: Boolean;
|
|
procedure CloseModal;
|
|
procedure FreeIconHandles;
|
|
procedure IconChanged(Sender: TObject);
|
|
procedure DelayedEvent(Data: PtrInt);
|
|
procedure SetActive(AValue: Boolean);
|
|
procedure SetActiveControl(AWinControl: TWinControl);
|
|
procedure SetActiveDefaultControl(AControl: TControl);
|
|
procedure SetAllowDropFiles(const AValue: Boolean);
|
|
procedure SetAlphaBlend(const AValue: Boolean);
|
|
procedure SetAlphaBlendValue(const AValue: Byte);
|
|
procedure SetBorderIcons(NewIcons: TBorderIcons);
|
|
procedure SetFormBorderStyle(NewStyle: TFormBorderStyle);
|
|
procedure SetCancelControl(NewControl: TControl);
|
|
procedure SetDefaultControl(NewControl: TControl);
|
|
procedure SetFormStyle(Value : TFormStyle);
|
|
procedure SetIcon(AValue: TIcon);
|
|
procedure SetMenu(Value: TMainMenu);
|
|
procedure SetModalResult(Value: TModalResult);
|
|
procedure SetPopupMode(const AValue: TPopupMode);
|
|
procedure SetPopupParent(const AValue: TCustomForm);
|
|
procedure SetPosition(Value: TPosition);
|
|
procedure SetShowInTaskbar(Value: TShowInTaskbar);
|
|
procedure SetLastFocusedControl(AControl: TWinControl);
|
|
procedure SetWindowFocus;
|
|
procedure SetWindowState(Value : TWindowState);
|
|
procedure AddHandler(HandlerType: TFormHandlerType;
|
|
const Handler: TMethod; AsFirst: Boolean = false);
|
|
procedure RemoveHandler(HandlerType: TFormHandlerType;
|
|
const Handler: TMethod);
|
|
function FindDefaultForActiveControl: TWinControl;
|
|
procedure UpdateMenu;
|
|
procedure UpdateShowInTaskBar;
|
|
function GetScreenSnap: boolean;
|
|
procedure SetScreenSnap(aValue: boolean);
|
|
function GetSnapBuffer: integer;
|
|
procedure SetSnapBuffer(aValue: integer);
|
|
procedure SetSnapOptions(aValue: TWindowMagnetOptions);
|
|
protected
|
|
procedure WMActivate(var Message : TLMActivate); message LM_ACTIVATE;
|
|
procedure WMCloseQuery(var message: TLMessage); message LM_CLOSEQUERY;
|
|
procedure WMHelp(var Message: TLMHelp); message LM_HELP;
|
|
procedure WMShowWindow(var message: TLMShowWindow); message LM_SHOWWINDOW;
|
|
procedure WMSize(var message: TLMSize); message LM_Size;
|
|
procedure WMWindowPosChanging(var Message: TLMWindowPosChanging); message LM_WINDOWPOSCHANGING;
|
|
procedure WMWindowPosChanged(var Message: TLMWindowPosChanged); message LM_WINDOWPOSCHANGED;
|
|
procedure CMBiDiModeChanged(var Message: TLMessage); message CM_BIDIMODECHANGED;
|
|
procedure CMParentBiDiModeChanged(var Message: TLMessage); message CM_PARENTBIDIMODECHANGED;
|
|
procedure CMAppShowBtnGlyphChanged(var Message: TLMessage); message CM_APPSHOWBTNGLYPHCHANGED;
|
|
procedure CMAppShowMenuGlyphChanged(var Message: TLMessage); message CM_APPSHOWMENUGLYPHCHANGED;
|
|
procedure CMIconChanged(var Message: TLMessage); message CM_ICONCHANGED;
|
|
procedure CMRelease(var Message: TLMessage); message CM_RELEASE;
|
|
procedure CMActivate(var Message: TLMessage); message CM_ACTIVATE;
|
|
procedure CMDeactivate(var Message: TLMessage); message CM_DEACTIVATE;
|
|
procedure CMShowingChanged(var Message: TLMessage); message CM_SHOWINGCHANGED;
|
|
procedure WMDPIChanged(var Msg: TLMessage); message LM_DPICHANGED;
|
|
protected
|
|
FActionLists: TList; // keep this TList for Delphi compatibility
|
|
FFormBorderStyle: TFormBorderStyle;
|
|
FFormState: TFormState;
|
|
class procedure WSRegisterClass; override;
|
|
procedure DoShowWindow; virtual;
|
|
procedure Activate; virtual;
|
|
procedure ActiveChanged; virtual;
|
|
procedure AdjustClientRect(var Rect: TRect); override;
|
|
procedure BeginFormUpdate;
|
|
function ColorIsStored: Boolean; override;
|
|
procedure CreateParams(var Params: TCreateParams); override;
|
|
procedure CreateWnd; override;
|
|
procedure Deactivate; virtual;
|
|
procedure DoClose(var CloseAction: TCloseAction); virtual;
|
|
procedure DoCreate; virtual;
|
|
procedure DoDestroy; virtual;
|
|
procedure DoHide; virtual;
|
|
procedure DoShow; virtual;
|
|
procedure EndFormUpdate;
|
|
function HandleCreateException: Boolean; virtual;
|
|
function HandleDestroyException: Boolean; virtual;
|
|
function HandleShowHideException: Boolean; virtual;
|
|
procedure InitializeWnd; override;
|
|
procedure Loaded; override;
|
|
procedure ChildHandlesCreated; override;
|
|
procedure Notification(AComponent: TComponent; Operation : TOperation); override;
|
|
procedure PaintWindow(dc : Hdc); override;
|
|
procedure RequestAlign; override;
|
|
procedure Resizing(State: TWindowState); override;
|
|
procedure CalculatePreferredSize(var PreferredWidth,
|
|
PreferredHeight: Integer; WithThemeSpace: Boolean); override;
|
|
procedure DoOnResize; override;
|
|
procedure DoOnChangeBounds; override;
|
|
procedure SetZOrder(Topmost: Boolean); override;
|
|
procedure SetParent(NewParent: TWinControl); override;
|
|
procedure MoveToDefaultPosition; virtual;
|
|
procedure UpdateShowing; override;
|
|
procedure SetVisible(Value: Boolean); override;
|
|
procedure AllAutoSized; override;
|
|
procedure DoFirstShow; virtual;
|
|
procedure UpdateWindowState;
|
|
procedure VisibleChanging; override;
|
|
procedure VisibleChanged; override;
|
|
procedure WndProc(var TheMessage : TLMessage); override;
|
|
function VisibleIsStored: Boolean;
|
|
procedure DoAutoSize; override;
|
|
procedure SetAutoSize(Value: Boolean); override;
|
|
procedure SetAutoScroll(Value: Boolean); override;
|
|
procedure SetScaled(const AScaled: Boolean); override;
|
|
procedure DoAddActionList(List: TCustomActionList);
|
|
procedure DoRemoveActionList(List: TCustomActionList);
|
|
procedure ProcessResource; virtual;
|
|
protected
|
|
// drag and dock
|
|
procedure BeginAutoDrag; override;
|
|
procedure DoDock(NewDockSite: TWinControl; var ARect: TRect); override;
|
|
function GetFloating: Boolean; override;
|
|
function GetDefaultDockCaption: string; override;
|
|
protected
|
|
// actions
|
|
procedure CMActionExecute(var Message: TLMessage); message CM_ACTIONEXECUTE;
|
|
procedure CMActionUpdate(var Message: TLMessage); message CM_ACTIONUPDATE;
|
|
function DoExecuteAction(ExeAction: TBasicAction): Boolean;
|
|
function DoUpdateAction(TheAction: TBasicAction): Boolean;
|
|
procedure UpdateActions; virtual;
|
|
protected
|
|
{MDI implementation}
|
|
{returns handle of MDIForm client handle (container for mdi children this
|
|
is not Handle of form itself !)}
|
|
property ClientHandle: HWND read GetClientHandle;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
constructor CreateNew(AOwner: TComponent; Num: Integer = 0); virtual;
|
|
destructor Destroy; override;
|
|
procedure AfterConstruction; override;
|
|
procedure BeforeDestruction; override;
|
|
|
|
class function GetControlClassDefaultSize: TSize; override;
|
|
|
|
function BigIconHandle: HICON;
|
|
procedure Close;
|
|
function CloseQuery: Boolean; virtual;
|
|
procedure DefocusControl(Control: TWinControl; Removing: Boolean);
|
|
procedure DestroyWnd; override;
|
|
procedure EnsureVisible(AMoveToTop: Boolean = True);
|
|
procedure FocusControl(WinControl: TWinControl);
|
|
function FormIsUpdating: Boolean; override;
|
|
procedure GetFormImage(ABitmap: TCustomBitmap);
|
|
function GetFormImage: TBitmap;
|
|
function GetRolesForControl(AControl: TControl): TControlRolesForForm;
|
|
function GetRealPopupParent: TCustomForm;
|
|
procedure Hide;
|
|
procedure IntfDropFiles(const FileNames: array of string);
|
|
procedure IntfHelp(AComponent: TComponent);
|
|
function IsShortcut(var Message: TLMKey): Boolean; virtual;
|
|
procedure MakeFullyVisible(AMonitor: TMonitor = nil; UseWorkarea: Boolean = True);
|
|
function AutoSizeDelayedHandle: Boolean; override;
|
|
procedure GetPreferredSize(var PreferredWidth, PreferredHeight: Integer;
|
|
Raw: Boolean = false;
|
|
WithThemeSpace: Boolean = true); override;
|
|
procedure Release;
|
|
function CanFocus: Boolean; override;
|
|
procedure SetFocus; override;
|
|
function SetFocusedControl(Control: TWinControl): Boolean ; virtual;
|
|
procedure SetRestoredBounds(ALeft, ATop, AWidth, AHeight: Integer; const
|
|
ADefaultPosition: Boolean = False);
|
|
procedure Show;
|
|
|
|
function ShowModal: Integer; virtual;
|
|
procedure ShowOnTop;
|
|
function SmallIconHandle: HICON;
|
|
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
|
|
function WantChildKey(Child : TControl;
|
|
var Message : TLMessage): Boolean; virtual;
|
|
|
|
// handlers
|
|
procedure RemoveAllHandlersOfObject(AnObject: TObject); override;
|
|
procedure AddHandlerFirstShow(OnFirstShowHandler: TNotifyEvent;
|
|
AsFirst: Boolean=false);
|
|
procedure RemoveHandlerFirstShow(OnFirstShowHandler: TNotifyEvent);
|
|
procedure AddHandlerClose(OnCloseHandler: TCloseEvent; AsFirst: Boolean=false);
|
|
procedure RemoveHandlerClose(OnCloseHandler: TCloseEvent);
|
|
procedure AddHandlerCreate(OnCreateHandler: TNotifyEvent; AsFirst: Boolean=false);
|
|
procedure RemoveHandlerCreate(OnCreateHandler: TNotifyEvent);
|
|
public
|
|
{MDI implementation}
|
|
function ActiveMDIChild: TCustomForm; virtual;
|
|
function GetMDIChildren(AIndex: Integer): TCustomForm; virtual;
|
|
function MDIChildCount: Integer; virtual;
|
|
public
|
|
procedure AutoScale; // set scaled to True and AutoAdjustLayout to current monitor PPI
|
|
public
|
|
// drag and dock
|
|
procedure Dock(NewDockSite: TWinControl; ARect: TRect); override;
|
|
procedure UpdateDockCaption(Exclude: TControl); override;
|
|
public
|
|
property Active: Boolean read FActive;
|
|
property ActiveControl: TWinControl read FActiveControl write SetActiveControl;
|
|
property ActiveDefaultControl: TControl read FActiveDefaultControl write SetActiveDefaultControl;
|
|
property AllowDropFiles: Boolean read FAllowDropFiles write SetAllowDropFiles default False;
|
|
property AlphaBlend: Boolean read FAlphaBlend write SetAlphaBlend;
|
|
property AlphaBlendValue: Byte read FAlphaBlendValue write SetAlphaBlendValue;
|
|
property AutoScroll stored IsAutoScrollStored;
|
|
property BorderIcons: TBorderIcons read FBorderIcons write SetBorderIcons
|
|
default [biSystemMenu, biMinimize, biMaximize];
|
|
property BorderStyle: TFormBorderStyle
|
|
read FFormBorderStyle write SetFormBorderStyle default bsSizeable;
|
|
property CancelControl: TControl read FCancelControl write SetCancelControl;
|
|
property Caption stored IsForm;
|
|
property Color default {$ifdef UseCLDefault}clDefault{$else}clBtnFace{$endif};
|
|
property DefaultControl: TControl read FDefaultControl write SetDefaultControl;
|
|
property DefaultMonitor: TDefaultMonitor read FDefaultMonitor
|
|
write FDefaultMonitor default dmActiveForm;
|
|
property Designer: TIDesigner read FDesigner write FDesigner;
|
|
property EffectiveShowInTaskBar: TShowInTaskBar read GetEffectiveShowInTaskBar;
|
|
property FormState: TFormState read FFormState;
|
|
property FormStyle: TFormStyle read FFormStyle write SetFormStyle
|
|
default fsNormal;
|
|
property HelpFile: string read FHelpFile write FHelpFile;
|
|
property Icon: TIcon read FIcon write SetIcon stored IsIconStored;
|
|
property KeyPreview: Boolean read FKeyPreview write FKeyPreview default False;
|
|
property MDIChildren[I: Integer]: TCustomForm read GetMDIChildren;
|
|
property Menu : TMainMenu read FMenu write SetMenu;
|
|
property ModalResult : TModalResult read FModalResult write SetModalResult;
|
|
property Monitor: TMonitor read GetMonitor;
|
|
property LastActiveControl: TWinControl read FLastActiveControl;
|
|
property PopupMode: TPopupMode read FPopupMode write SetPopupMode default pmNone;
|
|
property PopupParent: TCustomForm read FPopupParent write SetPopupParent;
|
|
property SnapOptions: TWindowMagnetOptions read FSnapOptions write SetSnapOptions;
|
|
property ScreenSnap: boolean read GetScreenSnap write SetScreenSnap stored false;
|
|
property SnapBuffer: integer read GetSnapBuffer write SetSnapBuffer stored false;
|
|
|
|
property OnActivate: TNotifyEvent read FOnActivate write FOnActivate;
|
|
property OnClose: TCloseEvent read FOnClose write FOnClose stored IsForm;
|
|
property OnCloseQuery : TCloseQueryEvent
|
|
read FOnCloseQuery write FOnCloseQuery stored IsForm;
|
|
property OnCreate: TNotifyEvent read FOnCreate write FOnCreate;
|
|
property OnDeactivate: TNotifyEvent read FOnDeactivate write FOnDeactivate;
|
|
property OnDestroy: TNotifyEvent read FOnDestroy write FOnDestroy;
|
|
property OnDropFiles: TDropFilesEvent read FOnDropFiles write FOnDropFiles;
|
|
property OnHelp: THelpEvent read FOnHelp write FOnHelp;
|
|
property OnHide: TNotifyEvent read FOnHide write FOnHide;
|
|
property OnResize stored IsForm;
|
|
property OnShortcut: TShortcutEvent read FOnShortcut write FOnShortcut;
|
|
property OnShow: TNotifyEvent read FOnShow write FOnShow;
|
|
property OnShowModalFinished: TModalDialogFinished read FOnShowModalFinished write FOnShowModalFinished;
|
|
property OnWindowStateChange: TNotifyEvent
|
|
read FOnWindowStateChange write FOnWindowStateChange;
|
|
property ParentFont default False;
|
|
property Position: TPosition read FPosition write SetPosition default poDesigned;
|
|
property RestoredLeft: Integer read FRestoredLeft;
|
|
property RestoredTop: Integer read FRestoredTop;
|
|
property RestoredWidth: Integer read FRestoredWidth;
|
|
property RestoredHeight: Integer read FRestoredHeight;
|
|
property ShowInTaskBar: TShowInTaskbar read FShowInTaskbar write SetShowInTaskBar
|
|
default stDefault;
|
|
property Visible stored VisibleIsStored default false;
|
|
property WindowState: TWindowState read FWindowState write SetWindowState
|
|
default wsNormal;
|
|
end;
|
|
|
|
TCustomFormClass = class of TCustomForm;
|
|
|
|
|
|
{ TForm }
|
|
|
|
TForm = class(TCustomForm)
|
|
private
|
|
FLCLVersion: string;
|
|
function LCLVersionIsStored: Boolean;
|
|
protected
|
|
class procedure WSRegisterClass; override;
|
|
procedure CreateWnd; override;
|
|
procedure Loaded; override;
|
|
public
|
|
constructor Create(TheOwner: TComponent); override;
|
|
|
|
{ mdi related routine}
|
|
procedure Cascade;
|
|
{ mdi related routine}
|
|
procedure Next;
|
|
{ mdi related routine}
|
|
procedure Previous;
|
|
{ mdi related routine}
|
|
procedure Tile;
|
|
{ mdi related routine}
|
|
procedure ArrangeIcons;
|
|
{ mdi related property}
|
|
property ClientHandle;
|
|
|
|
property DockManager;
|
|
published
|
|
property Action;
|
|
property ActiveControl;
|
|
property Align;
|
|
property AllowDropFiles;
|
|
property AlphaBlend default False;
|
|
property AlphaBlendValue default 255;
|
|
property Anchors;
|
|
property AutoScroll;
|
|
property AutoSize;
|
|
property BiDiMode;
|
|
property BorderIcons;
|
|
property BorderStyle;
|
|
property BorderWidth;
|
|
property Caption;
|
|
property ChildSizing;
|
|
property ClientHeight;
|
|
property ClientWidth;
|
|
property Color;
|
|
property Constraints;
|
|
property DefaultMonitor;
|
|
property DesignTimePPI;
|
|
property DockSite;
|
|
property DoubleBuffered;
|
|
property DragKind;
|
|
property DragMode;
|
|
property Enabled;
|
|
property Font;
|
|
property FormStyle;
|
|
property HelpFile;
|
|
property Icon;
|
|
property KeyPreview;
|
|
property Menu;
|
|
property ParentBiDiMode;
|
|
property ParentDoubleBuffered;
|
|
property ParentFont;
|
|
property PixelsPerInch;
|
|
property PopupMenu;
|
|
property PopupMode;
|
|
property PopupParent;
|
|
property Position;
|
|
property SessionProperties;
|
|
property ScreenSnap;
|
|
property ShowHint;
|
|
property ShowInTaskBar;
|
|
property SnapBuffer;
|
|
property SnapOptions;
|
|
property UseDockManager;
|
|
property LCLVersion: string read FLCLVersion write FLCLVersion stored LCLVersionIsStored;
|
|
property Scaled;
|
|
property Visible;
|
|
property WindowState;
|
|
|
|
property OnActivate;
|
|
property OnChangeBounds;
|
|
property OnClick;
|
|
property OnClose;
|
|
property OnCloseQuery;
|
|
property OnConstrainedResize;
|
|
property OnContextPopup;
|
|
property OnCreate;
|
|
property OnDblClick;
|
|
property OnDeactivate;
|
|
property OnDestroy;
|
|
property OnDockDrop;
|
|
property OnDockOver;
|
|
property OnDragDrop;
|
|
property OnDragOver;
|
|
property OnDropFiles;
|
|
property OnEndDock;
|
|
property OnGetSiteInfo;
|
|
property OnHelp;
|
|
property OnHide;
|
|
property OnKeyDown;
|
|
property OnKeyPress;
|
|
property OnKeyUp;
|
|
property OnMouseDown;
|
|
property OnMouseEnter;
|
|
property OnMouseLeave;
|
|
property OnMouseMove;
|
|
property OnMouseUp;
|
|
property OnMouseWheel;
|
|
property OnMouseWheelDown;
|
|
property OnMouseWheelUp;
|
|
property OnMouseWheelHorz;
|
|
property OnMouseWheelLeft;
|
|
property OnMouseWheelRight;
|
|
property OnPaint;
|
|
property OnResize;
|
|
property OnShortCut;
|
|
property OnShow;
|
|
property OnShowHint;
|
|
property OnStartDock;
|
|
property OnUnDock;
|
|
property OnUTF8KeyPress;
|
|
property OnWindowStateChange;
|
|
end;
|
|
|
|
TFormClass = class of TForm;
|
|
|
|
|
|
{ TCustomDockForm }
|
|
|
|
TCustomDockForm = class(TCustomForm)
|
|
protected
|
|
procedure DoAddDockClient(Client: TControl; const ARect: TRect); override;
|
|
procedure DoRemoveDockClient(Client: TControl); override;
|
|
procedure GetSiteInfo(Client: TControl; var InfluenceRect: TRect;
|
|
MousePos: TPoint; var CanDock: Boolean); override;
|
|
procedure Loaded; override;
|
|
public
|
|
constructor Create(TheOwner: TComponent); override;
|
|
property AutoScroll default False;
|
|
property BorderStyle default bsSizeToolWin;
|
|
property FormStyle default fsStayOnTop;
|
|
published
|
|
property PixelsPerInch;
|
|
end;
|
|
|
|
|
|
{ THintWindow }
|
|
|
|
THintWindow = class(TCustomForm)
|
|
// For simple text hint without child controls.
|
|
private
|
|
FActivating: Boolean;
|
|
FAlignment: TAlignment;
|
|
FHintRect: TRect;
|
|
FHintData: Pointer;
|
|
FAutoHide: Boolean;
|
|
FAutoHideTimer: TCustomTimer;
|
|
FHideInterval: Integer;
|
|
FHintCtrl: TControl;
|
|
procedure AdjustBoundsForMonitor(KeepWidth: Boolean = True;
|
|
KeepHeight: Boolean = True);
|
|
function GetDrawTextFlags: Cardinal;
|
|
procedure SetAutoHide(Value : Boolean);
|
|
procedure AutoHideHint(Sender : TObject);
|
|
procedure SetHideInterval(Value : Integer);
|
|
procedure SetHintRectAdjust(AValue: TRect);
|
|
protected
|
|
class procedure WSRegisterClass; override;
|
|
procedure WMNCHitTest(var Message: TLMessage); message LM_NCHITTEST;
|
|
procedure ActivateSub; virtual;
|
|
procedure DoShowWindow; override;
|
|
procedure UpdateRegion; virtual;
|
|
procedure SetColor(Value: TColor); override;
|
|
function UseBGThemes: Boolean; virtual;
|
|
function UseFGThemes: Boolean; virtual;
|
|
procedure Paint; override;
|
|
private class var
|
|
FSysHintFont: TFont;
|
|
protected
|
|
class function SysHintFont: TFont; virtual;
|
|
public
|
|
class destructor Destroy;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure ActivateHint(const AHint: string);
|
|
procedure ActivateHint(ARect: TRect; const AHint: string); virtual;
|
|
procedure ActivateWithBounds(ARect: TRect; const AHint: string);
|
|
procedure ActivateHintData(ARect: TRect; const AHint: string;
|
|
AData: pointer); virtual;
|
|
function CalcHintRect(MaxWidth: Integer; const AHint: string;
|
|
AData: pointer): TRect; virtual;
|
|
function OffsetHintRect(AOffset: TPoint; dy: Integer = 15;
|
|
KeepWidth: Boolean = True; KeepHeight: Boolean = True): Boolean;
|
|
procedure InitializeWnd; override;
|
|
function IsHintMsg(Msg: TMsg): Boolean; virtual;
|
|
procedure ReleaseHandle;
|
|
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
|
|
class function GetControlClassDefaultSize: TSize; override;
|
|
public
|
|
property OnMouseDown; // Public access may be needed.
|
|
property OnMouseUp;
|
|
property OnMouseMove;
|
|
property OnMouseLeave;
|
|
property Alignment: TAlignment read FAlignment write FAlignment;
|
|
property HintRect: TRect read FHintRect write FHintRect;
|
|
property HintRectAdjust: TRect read FHintRect write SetHintRectAdjust;
|
|
property HintData: Pointer read FHintData write FHintData;
|
|
property HintControl: TControl read FHintCtrl write FHintCtrl; experimental;
|
|
property AutoHide: Boolean read FAutoHide write SetAutoHide;
|
|
property BiDiMode;
|
|
property HideInterval: Integer read FHideInterval write SetHideInterval;
|
|
end;
|
|
|
|
THintWindowClass = class of THintWindow;
|
|
|
|
{ THintWindowRendered }
|
|
|
|
THintWindowRendered = class(THintWindow)
|
|
// For rendered hint with a child control added by an external provider.
|
|
private
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure ActivateRendered;
|
|
end;
|
|
|
|
{ TMonitor }
|
|
|
|
TMonitor = class(TObject)
|
|
private
|
|
FHandle: HMONITOR;
|
|
FMonitorNum: Integer;
|
|
function GetInfo(out Info: TMonitorInfo): Boolean; {inline; fpc bug - compilation error with inline}
|
|
function GetLeft: Integer;
|
|
function GetHeight: Integer;
|
|
function GetPixelsPerInch: Integer;
|
|
function GetTop: Integer;
|
|
function GetWidth: Integer;
|
|
function GetBoundsRect: TRect;
|
|
function GetWorkareaRect: TRect;
|
|
function GetPrimary: Boolean;
|
|
public
|
|
property Handle: HMONITOR read FHandle;
|
|
property MonitorNum: Integer read FMonitorNum;
|
|
property Left: Integer read GetLeft;
|
|
property Height: Integer read GetHeight;
|
|
property Top: Integer read GetTop;
|
|
property Width: Integer read GetWidth;
|
|
property BoundsRect: TRect read GetBoundsRect;
|
|
property WorkareaRect: TRect read GetWorkareaRect;
|
|
property Primary: Boolean read GetPrimary;
|
|
property PixelsPerInch: Integer read GetPixelsPerInch;
|
|
end;
|
|
|
|
{ TMonitorList }
|
|
|
|
TMonitorList = class(TList)
|
|
private
|
|
function GetItem(AIndex: Integer): TMonitor;
|
|
procedure SetItem(AIndex: Integer; const AValue: TMonitor);
|
|
protected
|
|
procedure Notify(Ptr: Pointer; Action: TListNotification); override;
|
|
public
|
|
property Items[AIndex: Integer]: TMonitor read GetItem write SetItem; default;
|
|
end;
|
|
|
|
{ TScreen }
|
|
|
|
PCursorRec = ^TCursorRec;
|
|
TCursorRec = record
|
|
Next: PCursorRec;
|
|
Index: Integer;
|
|
Handle: HCURSOR;
|
|
end;
|
|
|
|
TScreenFormEvent = procedure(Sender: TObject; Form: TCustomForm) of object;
|
|
TScreenControlEvent = procedure(Sender: TObject;
|
|
LastControl: TControl) of object;
|
|
|
|
TScreenNotification = (
|
|
snNewFormCreated,
|
|
snFormAdded,
|
|
snRemoveForm,
|
|
snActiveControlChanged,
|
|
snActiveFormChanged,
|
|
snFormVisibleChanged
|
|
);
|
|
|
|
TMonitorDefaultTo = (mdNearest, mdNull, mdPrimary);
|
|
|
|
{ TScreen }
|
|
|
|
TScreen = class(TLCLComponent)
|
|
private const
|
|
crScreen = Low(TCursor); // use with Screen.BeginTempCursor/EndTempCursor to add Screen.Cursor into the temp list
|
|
private
|
|
FActiveControl: TWinControl;
|
|
FActiveCustomForm: TCustomForm;
|
|
FActiveForm: TForm;
|
|
FCursor: TCursor;
|
|
FTempCursors: array of TCursor;
|
|
FCursorMap: TMap;
|
|
FCustomForms: TFPList;
|
|
FCustomFormsZOrdered: TFPList;
|
|
FDefaultCursor: HCURSOR;
|
|
FHintFont: TFont;
|
|
FFocusedForm: TCustomForm;
|
|
FFonts : TStringList;
|
|
FFormList: TFPList;
|
|
FDataModuleList: TFPList;
|
|
FIconFont: TFont;
|
|
FMenuFont: TFont;
|
|
FScreenHandlers: array[TScreenNotification] of TMethodList;
|
|
FLastActiveControl: TWinControl;
|
|
FLastActiveCustomForm: TCustomForm;
|
|
FMonitors: TMonitorList;
|
|
FOnActiveControlChange: TNotifyEvent;
|
|
FOnActiveFormChange: TNotifyEvent;
|
|
FPixelsPerInch : Integer;
|
|
FSaveFocusedList: TFPList;
|
|
FSystemFont: TFont;
|
|
FMagnetManager: TWindowMagnetManager;
|
|
procedure DeleteCursor(AIndex: Integer);
|
|
procedure DestroyCursors;
|
|
procedure DestroyMonitors;
|
|
function GetCursors(AIndex: Integer): HCURSOR;
|
|
function GetCustomFormCount: Integer;
|
|
function GetCustomFormZOrderCount: Integer;
|
|
function GetCustomForms(Index: Integer): TCustomForm;
|
|
function GetCustomFormsZOrdered(Index: Integer): TCustomForm;
|
|
function GetDataModuleCount: Integer;
|
|
function GetDataModules(AIndex: Integer): TDataModule;
|
|
function GetDesktopLeft: Integer;
|
|
function GetDesktopTop: Integer;
|
|
function GetDesktopHeight: Integer;
|
|
function GetDesktopWidth: Integer;
|
|
function GetDesktopRect: TRect;
|
|
function GetFonts : TStrings;
|
|
function GetFormCount: Integer;
|
|
function GetForms(IIndex: Integer): TForm;
|
|
function GetHeight : Integer;
|
|
function GetMonitor(Index: Integer): TMonitor;
|
|
function GetMonitorCount: Integer;
|
|
function GetPrimaryMonitor: TMonitor;
|
|
function GetRealCursor: TCursor;
|
|
function GetWidth : Integer;
|
|
procedure AddForm(AForm: TCustomForm);
|
|
procedure RemoveForm(AForm: TCustomForm);
|
|
function SetFocusedForm(AForm: TCustomForm): Boolean;
|
|
procedure SetCursor(const AValue: TCursor);
|
|
procedure SetCursors(AIndex: Integer; const AValue: HCURSOR);
|
|
procedure SetHintFont(const AValue: TFont);
|
|
procedure SetIconFont(const AValue: TFont);
|
|
procedure SetMenuFont(const AValue: TFont);
|
|
procedure SetSystemFont(const AValue: TFont);
|
|
function UpdatedMonitor(AHandle: HMONITOR; ADefault: TMonitorDefaultTo;
|
|
AErrorMsg: string): TMonitor;
|
|
procedure UpdateLastActive;
|
|
procedure RestoreLastActive;
|
|
procedure AddHandler(HandlerType: TScreenNotification;
|
|
const Handler: TMethod; AsFirst: Boolean);
|
|
procedure RemoveHandler(HandlerType: TScreenNotification;
|
|
const Handler: TMethod);
|
|
procedure DoAddDataModule(DataModule: TDataModule);
|
|
procedure DoRemoveDataModule(DataModule: TDataModule);
|
|
procedure NotifyScreenFormHandler(HandlerType: TScreenNotification;
|
|
Form: TCustomForm);
|
|
function GetWorkAreaHeight: Integer;
|
|
function GetWorkAreaLeft: Integer;
|
|
function GetWorkAreaRect: TRect;
|
|
function GetWorkAreaTop: Integer;
|
|
function GetWorkAreaWidth: Integer;
|
|
protected
|
|
function GetHintFont: TFont; virtual;
|
|
function GetIconFont: TFont; virtual;
|
|
function GetMenuFont: TFont; virtual;
|
|
function GetSystemFont: TFont; virtual;
|
|
procedure Notification(AComponent: TComponent; Operation: TOperation);
|
|
override;
|
|
property MagnetManager: TWindowMagnetManager read FMagnetManager;
|
|
public
|
|
constructor Create(AOwner : TComponent); override;
|
|
destructor Destroy; override;
|
|
function CustomFormIndex(AForm: TCustomForm): Integer;
|
|
function FormIndex(AForm: TForm): Integer;
|
|
function CustomFormZIndex(AForm: TCustomForm): Integer;
|
|
procedure MoveFormToFocusFront(ACustomForm: TCustomForm);
|
|
procedure MoveFormToZFront(ACustomForm: TCustomForm);
|
|
procedure NewFormWasCreated(AForm: TCustomForm);
|
|
function GetCurrentModalForm: TCustomForm;
|
|
function GetCurrentModalFormZIndex: Integer;
|
|
function CustomFormBelongsToActiveGroup(AForm: TCustomForm): Boolean;
|
|
function FindNonDesignerForm(const FormName: string): TCustomForm;
|
|
function FindForm(const FormName: string): TCustomForm;
|
|
function FindNonDesignerDataModule(const DataModuleName: string): TDataModule;
|
|
function FindDataModule(const DataModuleName: string): TDataModule;
|
|
procedure UpdateMonitors;
|
|
procedure UpdateScreen;
|
|
// handler
|
|
procedure RemoveAllHandlersOfObject(AnObject: TObject); override;
|
|
procedure AddHandlerNewFormCreated(OnNewFormCreated: TScreenFormEvent;
|
|
AsFirst: Boolean=false);
|
|
procedure RemoveHandlerNewFormCreated(OnNewFormCreated: TScreenFormEvent);
|
|
procedure AddHandlerFormAdded(OnFormAdded: TScreenFormEvent;
|
|
AsFirst: Boolean=false);
|
|
procedure RemoveHandlerFormAdded(OnFormAdded: TScreenFormEvent);
|
|
procedure AddHandlerRemoveForm(OnRemoveForm: TScreenFormEvent;
|
|
AsFirst: Boolean=false);
|
|
procedure RemoveHandlerRemoveForm(OnRemoveForm: TScreenFormEvent);
|
|
procedure AddHandlerActiveControlChanged(
|
|
OnActiveControlChanged: TScreenControlEvent;
|
|
AsFirst: Boolean=false);
|
|
procedure RemoveHandlerActiveControlChanged(
|
|
OnActiveControlChanged: TScreenControlEvent);
|
|
procedure AddHandlerActiveFormChanged(OnActiveFormChanged: TScreenFormEvent;
|
|
AsFirst: Boolean=false);
|
|
procedure RemoveHandlerActiveFormChanged(OnActiveFormChanged: TScreenFormEvent);
|
|
procedure AddHandlerFormVisibleChanged(OnFormVisibleChanged: TScreenFormEvent;
|
|
AsFirst: Boolean=false);
|
|
procedure RemoveHandlerFormVisibleChanged(OnFormVisibleChanged: TScreenFormEvent);
|
|
|
|
function DisableForms(SkipForm: TCustomForm; DisabledList: TList = nil): TList;
|
|
procedure EnableForms(var AFormList: TList);
|
|
function MonitorFromPoint(const Point: TPoint;
|
|
MonitorDefault: TMonitorDefaultTo = mdNearest): TMonitor;
|
|
function MonitorFromRect(const Rect: TRect;
|
|
MonitorDefault: TMonitorDefaultTo = mdNearest): TMonitor;
|
|
function MonitorFromWindow(const Handle: TLCLHandle;
|
|
MonitorDefault: TMonitorDefaultTo = mdNearest): TMonitor;
|
|
|
|
procedure BeginTempCursor(const aCursor: TCursor);
|
|
procedure EndTempCursor(const aCursor: TCursor);
|
|
procedure BeginWaitCursor;
|
|
procedure EndWaitCursor;
|
|
procedure BeginScreenCursor;
|
|
procedure EndScreenCursor;
|
|
public
|
|
property ActiveControl: TWinControl read FActiveControl;
|
|
property ActiveCustomForm: TCustomForm read FActiveCustomForm;
|
|
property ActiveForm: TForm read FActiveForm;
|
|
property Cursor: TCursor read FCursor write SetCursor;
|
|
property RealCursor: TCursor read GetRealCursor;
|
|
property Cursors[Index: Integer]: HCURSOR read GetCursors write SetCursors;
|
|
property CustomFormCount: Integer read GetCustomFormCount;
|
|
property CustomForms[Index: Integer]: TCustomForm read GetCustomForms;
|
|
property CustomFormZOrderCount: Integer read GetCustomFormZOrderCount;
|
|
property CustomFormsZOrdered[Index: Integer]: TCustomForm
|
|
read GetCustomFormsZOrdered; // lower index means on top
|
|
|
|
property DesktopLeft: Integer read GetDesktopLeft;
|
|
property DesktopTop: Integer read GetDesktopTop;
|
|
property DesktopHeight: Integer read GetDesktopHeight;
|
|
property DesktopWidth: Integer read GetDesktopWidth;
|
|
property DesktopRect: TRect read GetDesktopRect;
|
|
|
|
property FocusedForm: TCustomForm read FFocusedForm;
|
|
property FormCount: Integer read GetFormCount;
|
|
property Forms[Index: Integer]: TForm read GetForms;
|
|
property DataModuleCount: Integer read GetDataModuleCount;
|
|
property DataModules[Index: Integer]: TDataModule read GetDataModules;
|
|
|
|
property HintFont: TFont read GetHintFont write SetHintFont;
|
|
property IconFont: TFont read GetIconFont write SetIconFont;
|
|
property MenuFont: TFont read GetMenuFont write SetMenuFont;
|
|
property SystemFont: TFont read GetSystemFont write SetSystemFont;
|
|
property Fonts: TStrings read GetFonts;
|
|
|
|
property Height: Integer read Getheight;
|
|
property MonitorCount: Integer read GetMonitorCount;
|
|
property Monitors[Index: Integer]: TMonitor read GetMonitor;
|
|
property PixelsPerInch: Integer read FPixelsPerInch;
|
|
property PrimaryMonitor: TMonitor read GetPrimaryMonitor;
|
|
property Width: Integer read GetWidth;
|
|
property WorkAreaRect: TRect read GetWorkAreaRect;
|
|
property WorkAreaHeight: Integer read GetWorkAreaHeight;
|
|
property WorkAreaLeft: Integer read GetWorkAreaLeft;
|
|
property WorkAreaTop: Integer read GetWorkAreaTop;
|
|
property WorkAreaWidth: Integer read GetWorkAreaWidth;
|
|
property OnActiveControlChange: TNotifyEvent read FOnActiveControlChange
|
|
write FOnActiveControlChange;
|
|
property OnActiveFormChange: TNotifyEvent read FOnActiveFormChange
|
|
write FOnActiveFormChange;
|
|
end;
|
|
|
|
|
|
{ TApplication }
|
|
|
|
TQueryEndSessionEvent = procedure (var Cancel: Boolean) of object;
|
|
TExceptionEvent = procedure (Sender: TObject; E: Exception) of object;
|
|
TGetHandleEvent = procedure(var Handle: HWND) of object;
|
|
TIdleEvent = procedure (Sender: TObject; var Done: Boolean) of object;
|
|
TOnUserInputEvent = procedure(Sender: TObject; Msg: Cardinal) of object;
|
|
TDataEvent = procedure (Data: PtrInt) of object;
|
|
|
|
// application hint stuff
|
|
TCMHintShow = record
|
|
Msg: Cardinal;
|
|
{$ifdef cpu64}
|
|
UnusedMsg: Cardinal;
|
|
{$endif}
|
|
Reserved: WPARAM;
|
|
HintInfo: PHintInfo;
|
|
Result: LRESULT;
|
|
end;
|
|
|
|
TCMHintShowPause = record
|
|
Msg: Cardinal;
|
|
{$ifdef cpu64}
|
|
UnusedMsg: Cardinal;
|
|
{$endif}
|
|
WasActive: PtrInt;
|
|
Pause: PInteger;
|
|
Result: LRESULT;
|
|
end;
|
|
|
|
TAppHintTimerType = (ahttNone, ahttShowHint, ahttHideHint, ahttReshowHint);
|
|
|
|
TShowHintEvent = procedure (var HintStr: string; var CanShow: Boolean;
|
|
var HintInfo: THintInfo) of object;
|
|
|
|
THintInfoAtMouse = record
|
|
MousePos: TPoint;
|
|
Control: TControl;
|
|
ControlHasHint: Boolean;
|
|
end;
|
|
|
|
TApplicationFlag = (
|
|
AppWaiting,
|
|
AppIdleEndSent,
|
|
AppNoExceptionMessages,
|
|
AppActive, // application has focus
|
|
AppDestroying,
|
|
AppDoNotCallAsyncQueue,
|
|
AppInitialized // initialization of application was done
|
|
);
|
|
TApplicationFlags = set of TApplicationFlag;
|
|
|
|
TApplicationNavigationOption = (
|
|
anoTabToSelectNext,
|
|
anoReturnForDefaultControl,
|
|
anoEscapeForCancelControl,
|
|
anoF1ForHelp,
|
|
anoArrowToSelectNextInParent
|
|
);
|
|
TApplicationNavigationOptions = set of TApplicationNavigationOption;
|
|
|
|
TApplicationHandlerType = (
|
|
ahtIdle,
|
|
ahtIdleEnd,
|
|
ahtKeyDownBefore, // before interface and LCL
|
|
ahtKeyDownAfter, // after interface and LCL
|
|
ahtActivate,
|
|
ahtDeactivate,
|
|
ahtUserInput,
|
|
ahtException,
|
|
ahtEndSession,
|
|
ahtQueryEndSession,
|
|
ahtMinimize,
|
|
ahtModalBegin,
|
|
ahtModalEnd,
|
|
ahtRestore,
|
|
ahtDropFiles,
|
|
ahtHelp,
|
|
ahtHint,
|
|
ahtShowHint,
|
|
ahtGetMainFormHandle,
|
|
ahtActionExecute,
|
|
ahtActionUpdate
|
|
);
|
|
|
|
PAsyncCallQueueItem = ^TAsyncCallQueueItem;
|
|
TAsyncCallQueueItem = record
|
|
Method: TDataEvent;
|
|
Data: PtrInt;
|
|
NextItem, PrevItem: PAsyncCallQueueItem;
|
|
end;
|
|
TAsyncCallQueue = record
|
|
Top, Last: PAsyncCallQueueItem;
|
|
end;
|
|
TAsyncCallQueues = record
|
|
CritSec: TRTLCriticalSection;
|
|
Cur: TAsyncCallQueue; // currently processing
|
|
Next: TAsyncCallQueue; // new calls added to this queue
|
|
end;
|
|
|
|
// This identifies the kind of device where the application currently runs on
|
|
// Note that the same application can run in all kinds of devices if it has a
|
|
// user interface flexible enough
|
|
TApplicationType = (
|
|
atDefault, // The widgetset will attempt to auto-detect the device type
|
|
atDesktop, // For common desktops and notebooks
|
|
atPDA, // For smartphones and other devices with touch screen and a small screen
|
|
atKeyPadDevice,// Devices without any pointing device, such as keypad feature phones or kiosk machines
|
|
atTablet, // Similar to a PDA/Smartphone, but with a large screen
|
|
atTV, // The device is a television
|
|
atMobileEmulator// For desktop platforms. It will create a main windows of 240x320
|
|
// and place all forms there to immitate a mobile platform
|
|
);
|
|
|
|
TApplicationExceptionDlg = (
|
|
aedOkCancelDialog, // Exception handler window will be a dialog with Ok/Cancel buttons
|
|
aedOkMessageBox // Exception handler window will be a simple message box
|
|
);
|
|
|
|
TApplicationShowGlyphs = (
|
|
sbgAlways, // show them always (default)
|
|
sbgNever, // show them never
|
|
sbgSystem // show them depending on OS
|
|
);
|
|
|
|
TTaskBarBehavior = (
|
|
tbDefault, // widgetset dependent
|
|
tbMultiButton, // show buttons for Forms with ShowTaskBar = stDefault
|
|
tbSingleButton // hide buttons for Forms with ShowTaskBar = stDefault.
|
|
// Some Linux window managers do not support it. For example Cinnamon.
|
|
);
|
|
|
|
TApplicationDoubleBuffered = ( // what Forms.DoubleBuffered with ParentDoubleBuffered=True will gain when created
|
|
adbDefault, // widgetset dependent (LCLWin32: True unless in remote desktop connection; other WSs: False)
|
|
adbFalse, // False
|
|
adbTrue); // True
|
|
|
|
{ TApplication }
|
|
|
|
TApplication = class(TCustomApplication)
|
|
private
|
|
FApplicationHandlers: array[TApplicationHandlerType] of TMethodList;
|
|
FApplicationType: TApplicationType;
|
|
FCaptureExceptions: Boolean;
|
|
FComponentsToRelease: TFPList;
|
|
FComponentsReleasing: TFPList;
|
|
FComponentsToReleaseSavedByModal: TFPList;
|
|
FComponentsReleasingSavedByModal: TFPList;
|
|
FCreatingForm: TForm;// currently created form (CreateForm), candidate for MainForm
|
|
FDoubleBuffered: TApplicationDoubleBuffered;
|
|
FExceptionDialog: TApplicationExceptionDlg;
|
|
FExtendedKeysSupport: Boolean;
|
|
FFindGlobalComponentEnabled: Boolean;
|
|
FFlags: TApplicationFlags;
|
|
FHint: string;
|
|
FHintColor: TColor;
|
|
FHintControl: TControl;
|
|
FHintHidePause: Integer;
|
|
FHintHidePausePerChar: Integer;
|
|
FHintPause: Integer;
|
|
FHintRect: TRect;
|
|
FHintShortCuts: Boolean;
|
|
FHintShortPause: Integer;
|
|
FHintTimer: TCustomTimer;
|
|
FHintTimerType: TAppHintTimerType;
|
|
FHintWindow: THintWindow;
|
|
FIcon: TIcon;
|
|
FBigIconHandle: HICON;
|
|
FLayoutAdjustmentPolicy: TLayoutAdjustmentPolicy;
|
|
FMainFormOnTaskBar: Boolean;
|
|
FModalLevel: Integer;
|
|
FMoveFormFocusToChildren: Boolean;
|
|
FOnCircularException: TExceptionEvent;
|
|
FOnGetMainFormHandle: TGetHandleEvent;
|
|
FOnMessageDialogFinished: TModalDialogFinished;
|
|
FOnModalBegin: TNotifyEvent;
|
|
FOnModalEnd: TNotifyEvent;
|
|
FScaled: Boolean;
|
|
FShowButtonGlyphs: TApplicationShowGlyphs;
|
|
FShowMenuGlyphs: TApplicationShowGlyphs;
|
|
FSmallIconHandle: HICON;
|
|
FIdleLockCount: Integer;
|
|
FLastKeyDownSender: TWinControl;
|
|
FLastKeyDownKeys: TWordList;
|
|
FLastKeyDownShift: TShiftState;
|
|
FMainForm : TForm;
|
|
FMouseControl: TControl;
|
|
FNavigation: TApplicationNavigationOptions;
|
|
FOldExceptProc: TExceptProc;
|
|
FOnActionExecute: TActionEvent;
|
|
FOnActionUpdate: TActionEvent;
|
|
FOnActivate: TNotifyEvent;
|
|
FOnDeactivate: TNotifyEvent;
|
|
FOnDestroy: TNotifyEvent;
|
|
FOnDropFiles: TDropFilesEvent;
|
|
FOnHelp: THelpEvent;
|
|
FOnHint: TNotifyEvent;
|
|
FOnIdle: TIdleEvent;
|
|
FOnIdleEnd: TNotifyEvent;
|
|
FOnEndSession: TNotifyEvent;
|
|
FOnQueryEndSession: TQueryEndSessionEvent;
|
|
FOnMinimize: TNotifyEvent;
|
|
FOnRestore: TNotifyEvent;
|
|
FOnShortcut: TShortcutEvent;
|
|
FOnShowHint: TShowHintEvent;
|
|
FOnUserInput: TOnUserInputEvent;
|
|
FAsyncCall: TAsyncCallQueues;
|
|
FShowHint: Boolean;
|
|
FShowMainForm: Boolean;
|
|
FLastMousePos: TPoint;
|
|
FLastMouseControl: TControl;
|
|
FLastMouseControlValid: Boolean;
|
|
FBidiMode: TBiDiMode;
|
|
FRestoreStayOnTop: TList;
|
|
FTaskBarBehavior: TTaskBarBehavior;
|
|
FUpdateFormatSettings: Boolean;
|
|
FRemoveStayOnTopCounter: Integer;
|
|
FExceptionCounter: Byte;
|
|
procedure DoOnIdleEnd;
|
|
function GetActive: Boolean;
|
|
function GetActiveFormHandle: HWND;
|
|
function GetCurrentHelpFile: string;
|
|
function GetExename: string;
|
|
function GetHandle: TLCLHandle;
|
|
function GetMainFormHandle: HWND;
|
|
function GetTitle: string;
|
|
procedure FreeIconHandles;
|
|
procedure IconChanged(Sender: TObject);
|
|
procedure SetBidiMode(const AValue: TBiDiMode);
|
|
procedure SetFlags(const AValue: TApplicationFlags);
|
|
procedure SetMainFormOnTaskBar(const AValue: Boolean);
|
|
procedure SetNavigation(const AValue: TApplicationNavigationOptions);
|
|
procedure SetShowButtonGlyphs(const AValue: TApplicationShowGlyphs);
|
|
procedure SetShowMenuGlyphs(const AValue: TApplicationShowGlyphs);
|
|
procedure SetTaskBarBehavior(const AValue: TTaskBarBehavior);
|
|
procedure UpdateMouseControl(NewMouseControl: TControl);
|
|
procedure UpdateMouseHint(CurrentControl: TControl);
|
|
procedure SetCaptureExceptions(const AValue: Boolean);
|
|
procedure SetHandle(const AHandle: TLCLHandle);
|
|
procedure SetHint(const AValue: string);
|
|
procedure SetHintColor(const AValue: TColor);
|
|
procedure SetIcon(AValue: TIcon);
|
|
procedure SetShowHint(const AValue: Boolean);
|
|
procedure StopHintTimer;
|
|
function ValidateHelpSystem: Boolean;
|
|
procedure WndProc(var AMessage : TLMessage);
|
|
function DispatchAction(Msg: Longint; Action: TBasicAction): Boolean;
|
|
procedure AddHandler(HandlerType: TApplicationHandlerType;
|
|
const Handler: TMethod; AsFirst: Boolean);
|
|
procedure RemoveHandler(HandlerType: TApplicationHandlerType;
|
|
const Handler: TMethod);
|
|
procedure RunLoop;
|
|
procedure Activate(Data: PtrInt);
|
|
procedure Deactivate(Data: PtrInt);
|
|
protected
|
|
function GetConsoleApplication: Boolean; override;
|
|
procedure NotifyIdleHandler(var Done: Boolean);
|
|
procedure NotifyIdleEndHandler;
|
|
procedure NotifyActivateHandler;
|
|
procedure NotifyDeactivateHandler;
|
|
procedure NotifyCustomForms(Msg: Word);
|
|
function IsHintMsg(var Msg: TMsg): Boolean;
|
|
function DoOnHelp(Command: Word; Data: PtrInt; var CallHelp: Boolean): Boolean; virtual;
|
|
procedure DoOnMouseMove; virtual;
|
|
procedure ShowHintWindow(const Info: THintInfoAtMouse);
|
|
procedure OnHintTimer(Sender: TObject);
|
|
procedure SetTitle(const AValue: string); override;
|
|
procedure StartHintTimer(Interval: Integer; TimerType: TAppHintTimerType);
|
|
procedure UpdateVisible;
|
|
procedure DoIdleActions;
|
|
procedure MenuPopupHandler(Sender: TObject);
|
|
procedure ProcessAsyncCallQueue;
|
|
procedure DoDecLCLRefcountToZero(Sender: TObject);
|
|
procedure FreeComponent(Data: PtrInt);
|
|
procedure ReleaseComponents;
|
|
procedure DoBeforeFinalization;
|
|
function GetParams(Index: Integer): string; override;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure ActivateHint(CursorPos: TPoint; CheckHintControlChange: Boolean = False);
|
|
function GetControlAtMouse: TControl;
|
|
function GetControlAtPos(P: TPoint): TControl;
|
|
procedure ControlDestroyed(AControl: TControl);
|
|
function BigIconHandle: HIcon;
|
|
function SmallIconHandle: HIcon;
|
|
procedure BringToFront;
|
|
procedure CreateForm(InstanceClass: TComponentClass; out Reference);
|
|
procedure UpdateMainForm(AForm: TForm);
|
|
procedure QueueAsyncCall(const AMethod: TDataEvent; Data: PtrInt);
|
|
procedure RemoveAsyncCalls(const AnObject: TObject);
|
|
procedure ReleaseComponent(AComponent: TComponent);
|
|
function ExecuteAction(ExeAction: TBasicAction): Boolean; override;
|
|
function UpdateAction(TheAction: TBasicAction): Boolean; override;
|
|
procedure HandleException(Sender: TObject); override;
|
|
procedure HandleMessage;
|
|
function HelpCommand(Command: Word; Data: PtrInt): Boolean;
|
|
function HelpContext(Context: THelpContext): Boolean;
|
|
function HelpKeyword(const Keyword: string): Boolean;
|
|
function HelpShowTableOfContents: Boolean;
|
|
procedure ShowHelpForObject(Sender: TObject);
|
|
procedure RemoveStayOnTop(const ASystemTopAlso: Boolean = False);
|
|
procedure RestoreStayOnTop(const ASystemTopAlso: Boolean = False);
|
|
function IsWaiting: Boolean;
|
|
procedure CancelHint;
|
|
procedure HideHint;
|
|
procedure HintMouseMessage(Control : TControl; var AMessage: TLMessage);
|
|
procedure Initialize; override;
|
|
function MessageBox(Text, Caption: PChar; Flags: Longint = MB_OK): Integer;
|
|
procedure Minimize;
|
|
procedure ModalStarted;
|
|
procedure ModalFinished;
|
|
procedure Restore;
|
|
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
|
|
procedure ProcessMessages;
|
|
procedure Idle(Wait: Boolean);
|
|
procedure Run;
|
|
procedure ShowException(E: Exception); override;
|
|
procedure Terminate; override;
|
|
procedure DisableIdleHandler;
|
|
procedure EnableIdleHandler;
|
|
procedure NotifyUserInputHandler(Sender: TObject; Msg: Cardinal);
|
|
procedure NotifyKeyDownBeforeHandler(Sender: TObject;
|
|
var Key: Word; Shift: TShiftState);
|
|
procedure NotifyKeyDownHandler(Sender: TObject;
|
|
var Key: Word; Shift: TShiftState);
|
|
procedure ControlKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
|
|
procedure ControlKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
|
|
procedure AddOnIdleHandler(Handler: TIdleEvent; AsFirst: Boolean=true);
|
|
procedure RemoveOnIdleHandler(Handler: TIdleEvent);
|
|
procedure AddOnIdleEndHandler(Handler: TNotifyEvent; AsFirst: Boolean=true);
|
|
procedure RemoveOnIdleEndHandler(Handler: TNotifyEvent);
|
|
procedure AddOnUserInputHandler(Handler: TOnUserInputEvent;
|
|
AsFirst: Boolean=true);
|
|
procedure RemoveOnUserInputHandler(Handler: TOnUserInputEvent);
|
|
procedure AddOnKeyDownBeforeHandler(Handler: TKeyEvent;
|
|
AsFirst: Boolean=true);
|
|
procedure RemoveOnKeyDownBeforeHandler(Handler: TKeyEvent);
|
|
procedure AddOnKeyDownHandler(Handler: TKeyEvent; AsFirst: Boolean=true);
|
|
procedure RemoveOnKeyDownHandler(Handler: TKeyEvent);
|
|
procedure AddOnActivateHandler(Handler: TNotifyEvent; AsFirst: Boolean=true);
|
|
procedure RemoveOnActivateHandler(Handler: TNotifyEvent);
|
|
procedure AddOnDeactivateHandler(Handler: TNotifyEvent; AsFirst: Boolean=true);
|
|
procedure RemoveOnDeactivateHandler(Handler: TNotifyEvent);
|
|
procedure AddOnExceptionHandler(Handler: TExceptionEvent; AsFirst: Boolean=true);
|
|
procedure RemoveOnExceptionHandler(Handler: TExceptionEvent);
|
|
procedure AddOnEndSessionHandler(Handler: TNotifyEvent; AsFirst: Boolean=true);
|
|
procedure RemoveOnEndSessionHandler(Handler: TNotifyEvent);
|
|
procedure AddOnQueryEndSessionHandler(Handler: TQueryEndSessionEvent; AsFirst: Boolean=true);
|
|
procedure RemoveOnQueryEndSessionHandler(Handler: TQueryEndSessionEvent);
|
|
procedure AddOnMinimizeHandler(Handler: TNotifyEvent; AsFirst: Boolean=true);
|
|
procedure RemoveOnMinimizeHandler(Handler: TNotifyEvent);
|
|
procedure AddOnModalBeginHandler(Handler: TNotifyEvent; AsFirst: Boolean=true);
|
|
procedure RemoveOnModalBeginHandler(Handler: TNotifyEvent);
|
|
procedure AddOnModalEndHandler(Handler: TNotifyEvent; AsFirst: Boolean=true);
|
|
procedure RemoveOnModalEndHandler(Handler: TNotifyEvent);
|
|
procedure AddOnRestoreHandler(Handler: TNotifyEvent; AsFirst: Boolean=true);
|
|
procedure RemoveOnRestoreHandler(Handler: TNotifyEvent);
|
|
procedure AddOnDropFilesHandler(Handler: TDropFilesEvent; AsFirst: Boolean=true);
|
|
procedure RemoveOnDropFilesHandler(Handler: TDropFilesEvent);
|
|
procedure AddOnHelpHandler(Handler: THelpEvent; AsFirst: Boolean=true);
|
|
procedure RemoveOnHelpHandler(Handler: THelpEvent);
|
|
procedure AddOnHintHandler(Handler: TNotifyEvent; AsFirst: Boolean=true);
|
|
procedure RemoveOnHintHandler(Handler: TNotifyEvent);
|
|
procedure AddOnShowHintHandler(Handler: TShowHintEvent; AsFirst: Boolean=true);
|
|
procedure RemoveOnShowHintHandler(Handler: TShowHintEvent);
|
|
procedure AddOnGetMainFormHandleHandler(Handler: TGetHandleEvent; AsFirst: Boolean = True);
|
|
procedure RemoveOnGetMainFormHandleHandler(Handler: TGetHandleEvent);
|
|
procedure AddOnActionExecuteHandler(Handler: TActionEvent; AsFirst: Boolean = True);
|
|
procedure RemoveOnActionExecuteHandler(Handler: TActionEvent);
|
|
procedure AddOnActionUpdateHandler(Handler: TActionEvent; AsFirst: Boolean = True);
|
|
procedure RemoveOnActionUpdateHandler(Handler: TActionEvent);
|
|
|
|
procedure RemoveAllHandlersOfObject(AnObject: TObject); virtual;
|
|
procedure DoBeforeMouseMessage(CurMouseControl: TControl);
|
|
function IsShortcut(var Message: TLMKey): Boolean;
|
|
procedure IntfQueryEndSession(var Cancel: Boolean);
|
|
procedure IntfEndSession;
|
|
procedure IntfAppActivate(const Async: Boolean = False);
|
|
procedure IntfAppDeactivate(const Async: Boolean = False);
|
|
procedure IntfAppMinimize;
|
|
procedure IntfAppRestore;
|
|
procedure IntfDropFiles(const FileNames: array of string);
|
|
procedure IntfSettingsChange;
|
|
procedure IntfThemeOptionChange(AThemeServices: TThemeServices; AOption: TThemeOption);
|
|
|
|
function IsRightToLeft: Boolean;
|
|
function IsRTLLang(const ALang: string): Boolean;
|
|
function Direction(const ALang: string): TBiDiMode;
|
|
public
|
|
// on key down
|
|
procedure DoArrowKey(AControl: TWinControl; var Key: Word; Shift: TShiftState);
|
|
procedure DoTabKey(AControl: TWinControl; var Key: Word; Shift: TShiftState);
|
|
// on key up
|
|
procedure DoEscapeKey(AControl: TWinControl; var Key: Word; Shift: TShiftState);
|
|
procedure DoReturnKey(AControl: TWinControl; var Key: Word; Shift: TShiftState);
|
|
|
|
property Active: Boolean read GetActive;
|
|
property ActiveFormHandle: HWND read GetActiveFormHandle;
|
|
property ApplicationType : TApplicationType read FApplicationType write FApplicationType;
|
|
property BidiMode: TBiDiMode read FBidiMode write SetBidiMode;
|
|
property CaptureExceptions: Boolean read FCaptureExceptions
|
|
write SetCaptureExceptions;
|
|
property DoubleBuffered: TApplicationDoubleBuffered read FDoubleBuffered write FDoubleBuffered default adbDefault; platform;
|
|
property ExtendedKeysSupport: Boolean read FExtendedKeysSupport write FExtendedKeysSupport; // See VK_LSHIFT in LCLType for more details
|
|
property ExceptionDialog: TApplicationExceptionDlg read FExceptionDialog write FExceptionDialog;
|
|
property FindGlobalComponentEnabled: Boolean read FFindGlobalComponentEnabled
|
|
write FFindGlobalComponentEnabled;
|
|
property Flags: TApplicationFlags read FFlags write SetFlags;
|
|
//property HelpSystem : IHelpSystem read FHelpSystem;
|
|
property Handle: TLCLHandle read GetHandle write SetHandle; platform;
|
|
property Hint: string read FHint write SetHint;
|
|
property HintColor: TColor read FHintColor write SetHintColor;
|
|
property HintHidePause: Integer read FHintHidePause write FHintHidePause;
|
|
property HintHidePausePerChar: Integer read FHintHidePausePerChar write FHintHidePausePerChar;
|
|
property HintPause: Integer read FHintPause write FHintPause;
|
|
property HintShortCuts: Boolean read FHintShortCuts write FHintShortCuts;
|
|
property HintShortPause: Integer read FHintShortPause write FHintShortPause;
|
|
property Icon: TIcon read FIcon write SetIcon;
|
|
property LayoutAdjustmentPolicy: TLayoutAdjustmentPolicy read FLayoutAdjustmentPolicy write FLayoutAdjustmentPolicy;
|
|
property Navigation: TApplicationNavigationOptions read FNavigation write SetNavigation;
|
|
property MainForm: TForm read FMainForm;
|
|
property MainFormHandle: HWND read GetMainFormHandle;
|
|
property MainFormOnTaskBar: Boolean read FMainFormOnTaskBar write SetMainFormOnTaskBar; platform;
|
|
property ModalLevel: Integer read FModalLevel;
|
|
property MoveFormFocusToChildren: Boolean read FMoveFormFocusToChildren write FMoveFormFocusToChildren default True;
|
|
property MouseControl: TControl read FMouseControl;
|
|
property TaskBarBehavior: TTaskBarBehavior read FTaskBarBehavior write SetTaskBarBehavior;
|
|
property UpdateFormatSettings: Boolean read FUpdateFormatSettings write FUpdateFormatSettings; platform;
|
|
property OnActionExecute: TActionEvent read FOnActionExecute write FOnActionExecute;
|
|
property OnActionUpdate: TActionEvent read FOnActionUpdate write FOnActionUpdate;
|
|
property OnActivate: TNotifyEvent read FOnActivate write FOnActivate;
|
|
property OnDeactivate: TNotifyEvent read FOnDeactivate write FOnDeactivate;
|
|
property OnGetMainFormHandle: TGetHandleEvent read FOnGetMainFormHandle write FOnGetMainFormHandle;
|
|
property OnIdle: TIdleEvent read FOnIdle write FOnIdle;
|
|
property OnIdleEnd: TNotifyEvent read FOnIdleEnd write FOnIdleEnd;
|
|
property OnEndSession: TNotifyEvent read FOnEndSession write FOnEndSession;
|
|
property OnQueryEndSession: TQueryEndSessionEvent read FOnQueryEndSession write FOnQueryEndSession;
|
|
property OnMinimize: TNotifyEvent read FOnMinimize write FOnMinimize;
|
|
property OnMessageDialogFinished: TModalDialogFinished read FOnMessageDialogFinished write FOnMessageDialogFinished;
|
|
property OnModalBegin: TNotifyEvent read FOnModalBegin write FOnModalBegin;
|
|
property OnModalEnd: TNotifyEvent read FOnModalEnd write FOnModalEnd;
|
|
property OnRestore: TNotifyEvent read FOnRestore write FOnRestore;
|
|
property OnDropFiles: TDropFilesEvent read FOnDropFiles write FOnDropFiles;
|
|
property OnHelp: THelpEvent read FOnHelp write FOnHelp;
|
|
property OnHint: TNotifyEvent read FOnHint write FOnHint;
|
|
property OnShortcut: TShortcutEvent read FOnShortcut write FOnShortcut;
|
|
property OnShowHint: TShowHintEvent read FOnShowHint write FOnShowHint;
|
|
property OnUserInput: TOnUserInputEvent read FOnUserInput write FOnUserInput;
|
|
property OnDestroy: TNotifyEvent read FOnDestroy write FOnDestroy;
|
|
property OnCircularException: TExceptionEvent read FOnCircularException write FOnCircularException;
|
|
property ShowButtonGlyphs: TApplicationShowGlyphs read FShowButtonGlyphs write SetShowButtonGlyphs default sbgAlways;
|
|
property ShowMenuGlyphs: TApplicationShowGlyphs read FShowMenuGlyphs write SetShowMenuGlyphs default sbgAlways;
|
|
property ShowHint: Boolean read FShowHint write SetShowHint;
|
|
property ShowMainForm: Boolean read FShowMainForm write FShowMainForm default True;
|
|
property Title: string read GetTitle write SetTitle;
|
|
property Scaled: Boolean read FScaled write FScaled;
|
|
end;
|
|
|
|
const
|
|
DefaultApplicationBiDiMode: TBiDiMode = bdLeftToRight;
|
|
|
|
DefHintColor = clInfoBk; // default hint window color
|
|
DefHintPause = 500; // default pause before hint window displays (ms)
|
|
DefHintShortPause = 0; // default reshow pause
|
|
DefHintHidePause = 5*DefHintPause; // default pause before hint is hidden (ms)
|
|
DefHintHidePausePerChar = 200; // added to DefHintHidePause (ms)
|
|
|
|
type
|
|
{ TApplicationProperties }
|
|
|
|
TApplicationProperties = class(TLCLComponent)
|
|
private
|
|
FCaptureExceptions: Boolean;
|
|
FExceptionDialogType: TApplicationExceptionDlg;
|
|
FHelpFile: string;
|
|
FHint: string;
|
|
FHintColor: TColor;
|
|
FHintHidePause: Integer;
|
|
FHintPause: Integer;
|
|
FHintShortCuts: Boolean;
|
|
FHintShortPause: Integer;
|
|
FOnActivate: TNotifyEvent;
|
|
FOnDeactivate: TNotifyEvent;
|
|
FOnDropFiles: TDropFilesEvent;
|
|
FOnGetMainFormHandle: TGetHandleEvent;
|
|
FOnModalBegin: TNotifyEvent;
|
|
FOnModalEnd: TNotifyEvent;
|
|
FShowButtonGlyphs: TApplicationShowGlyphs;
|
|
FShowHint: Boolean;
|
|
FShowMainForm: Boolean;
|
|
FShowMenuGlyphs: TApplicationShowGlyphs;
|
|
FTitle: string;
|
|
|
|
FOnException: TExceptionEvent;
|
|
FOnIdle: TIdleEvent;
|
|
FOnIdleEnd: TNotifyEvent;
|
|
FOnHelp: THelpEvent;
|
|
FOnHint: TNotifyEvent;
|
|
FOnShowHint: TShowHintEvent;
|
|
FOnUserInput: TOnUserInputEvent;
|
|
FOnEndSession : TNotifyEvent;
|
|
FOnQueryEndSession : TQueryEndSessionEvent;
|
|
FOnMinimize : TNotifyEvent;
|
|
FOnRestore : TNotifyEvent;
|
|
FOnActionExecute: TActionEvent;
|
|
FOnActionUpdate: TActionEvent;
|
|
procedure SetExceptionDialog(AValue: TApplicationExceptionDlg);
|
|
protected
|
|
procedure SetCaptureExceptions(const AValue : Boolean);
|
|
procedure SetHelpFile(const AValue : string);
|
|
procedure SetHint(const AValue : string);
|
|
procedure SetHintColor(const AValue : TColor);
|
|
procedure SetHintHidePause(const AValue : Integer);
|
|
procedure SetHintPause(const AValue : Integer);
|
|
procedure SetHintShortCuts(const AValue : Boolean);
|
|
procedure SetHintShortPause(const AValue : Integer);
|
|
procedure SetShowButtonGlyphs(const AValue: TApplicationShowGlyphs);
|
|
procedure SetShowMenuGlyphs(const AValue: TApplicationShowGlyphs);
|
|
procedure SetShowHint(const AValue : Boolean);
|
|
procedure SetShowMainForm(const AValue: Boolean);
|
|
procedure SetTitle(const AValue : string);
|
|
|
|
procedure SetOnActivate(AValue: TNotifyEvent);
|
|
procedure SetOnDeactivate(AValue: TNotifyEvent);
|
|
procedure SetOnException(const AValue : TExceptionEvent);
|
|
procedure SetOnGetMainFormHandle(const AValue: TGetHandleEvent);
|
|
procedure SetOnIdle(const AValue : TIdleEvent);
|
|
procedure SetOnIdleEnd(const AValue : TNotifyEvent);
|
|
procedure SetOnEndSession(const AValue : TNotifyEvent);
|
|
procedure SetOnQueryEndSession(const AValue : TQueryEndSessionEvent);
|
|
procedure SetOnMinimize(const AValue : TNotifyEvent);
|
|
procedure SetOnModalBegin(const AValue: TNotifyEvent);
|
|
procedure SetOnModalEnd(const AValue: TNotifyEvent);
|
|
procedure SetOnRestore(const AValue : TNotifyEvent);
|
|
procedure SetOnDropFiles(const AValue: TDropFilesEvent);
|
|
procedure SetOnHelp(const AValue : THelpEvent);
|
|
procedure SetOnHint(const AValue : TNotifyEvent);
|
|
procedure SetOnShowHint(const AValue : TShowHintEvent);
|
|
procedure SetOnUserInput(const AValue : TOnUserInputEvent);
|
|
procedure SetOnActionExecute(const AValue : TActionEvent);
|
|
procedure SetOnActionUpdate(const AValue : TActionEvent);
|
|
public
|
|
constructor Create(AOwner: TComponent); Override;
|
|
destructor Destroy; override;
|
|
published
|
|
property CaptureExceptions: Boolean read FCaptureExceptions
|
|
write SetCaptureExceptions default True;
|
|
property ExceptionDialog: TApplicationExceptionDlg read FExceptionDialogType
|
|
write SetExceptionDialog default aedOkCancelDialog;
|
|
property HelpFile: string read FHelpFile write SetHelpFile;
|
|
property Hint: string read FHint write SetHint;
|
|
property HintColor: TColor read FHintColor write SetHintColor default DefHintColor;
|
|
property HintHidePause: Integer read FHintHidePause write SetHintHidePause default DefHintHidePause;
|
|
property HintPause: Integer read FHintPause write SetHintPause default DefHintPause;
|
|
property HintShortCuts: Boolean read FHintShortCuts write SetHintShortCuts default True;
|
|
property HintShortPause: Integer read FHintShortPause write SetHintShortPause default DefHintShortPause;
|
|
property ShowButtonGlyphs: TApplicationShowGlyphs read FShowButtonGlyphs write SetShowButtonGlyphs default sbgAlways;
|
|
property ShowMenuGlyphs: TApplicationShowGlyphs read FShowMenuGlyphs write SetShowMenuGlyphs default sbgAlways;
|
|
property ShowHint: Boolean read FShowHint write SetShowHint default True;
|
|
property ShowMainForm: Boolean read FShowMainForm write SetShowMainForm default True;
|
|
property Title: string read FTitle write SetTitle;
|
|
|
|
property OnActivate: TNotifyEvent read FOnActivate write SetOnActivate;
|
|
property OnDeactivate: TNotifyEvent read FOnDeactivate write SetOnDeactivate;
|
|
property OnException: TExceptionEvent read FOnException write SetOnException;
|
|
property OnGetMainFormHandle: TGetHandleEvent read FOnGetMainFormHandle write SetOnGetMainFormHandle;
|
|
property OnIdle: TIdleEvent read FOnIdle write SetOnIdle;
|
|
property OnIdleEnd: TNotifyEvent read FOnIdleEnd write SetOnIdleEnd;
|
|
property OnEndSession: TNotifyEvent read FOnEndSession write SetOnEndSession;
|
|
property OnQueryEndSession: TQueryEndSessionEvent read FOnQueryEndSession write SetOnQueryEndSession;
|
|
property OnMinimize: TNotifyEvent read FOnMinimize write SetOnMinimize;
|
|
property OnModalBegin: TNotifyEvent read FOnModalBegin write SetOnModalBegin;
|
|
property OnModalEnd: TNotifyEvent read FOnModalEnd write SetOnModalEnd;
|
|
property OnRestore: TNotifyEvent read FOnRestore write SetOnRestore;
|
|
property OnDropFiles: TDropFilesEvent read FOnDropFiles write SetOnDropFiles;
|
|
property OnHelp: THelpEvent read FOnHelp write SetOnHelp;
|
|
property OnHint: TNotifyEvent read FOnHint write SetOnHint;
|
|
property OnShowHint: TShowHintEvent read FOnShowHint write SetOnShowHint;
|
|
property OnUserInput: TOnUserInputEvent read FOnUserInput write SetOnUserInput;
|
|
property OnActionExecute: TActionEvent read FOnActionExecute write SetOnActionExecute;
|
|
property OnActionUpdate: TActionEvent read FOnActionUpdate write SetOnActionUpdate;
|
|
end;
|
|
|
|
|
|
{ TIDesigner }
|
|
|
|
TIDesigner = class(TObject)
|
|
protected
|
|
FLookupRoot: TComponent;
|
|
FDefaultFormBoundsValid: Boolean;
|
|
public
|
|
function IsDesignMsg(Sender: TControl; var Message: TLMessage): Boolean;
|
|
virtual; abstract;
|
|
procedure UTF8KeyPress(var UTF8Key: TUTF8Char); virtual; abstract;
|
|
procedure Modified; virtual; abstract;
|
|
procedure Notification(AComponent: TComponent;
|
|
Operation: TOperation); virtual; abstract;
|
|
procedure PaintGrid; virtual; abstract;
|
|
procedure ValidateRename(AComponent: TComponent;
|
|
const CurName, NewName: string); virtual; abstract;
|
|
function GetShiftState: TShiftState; virtual; abstract;
|
|
procedure SelectOnlyThisComponent(AComponent: TComponent); virtual; abstract;
|
|
function UniqueName(const BaseName: string): string; virtual; abstract;
|
|
procedure PrepareFreeDesigner(AFreeComponent: Boolean); virtual; abstract;
|
|
public
|
|
property LookupRoot: TComponent read FLookupRoot;
|
|
property DefaultFormBoundsValid: Boolean read FDefaultFormBoundsValid
|
|
write FDefaultFormBoundsValid;
|
|
end;
|
|
|
|
|
|
{ TFormPropertyStorage - abstract base class }
|
|
|
|
TFormPropertyStorage = class(TControlPropertyStorage)
|
|
private
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
|
|
procedure FormDestroy(Sender : TObject);
|
|
public
|
|
constructor Create(TheOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
end;
|
|
|
|
function KeysToShiftState(Keys: PtrUInt): TShiftState;
|
|
function KeyDataToShiftState(KeyData: PtrInt): TShiftState;
|
|
function KeyboardStateToShiftState: TShiftState;
|
|
function ShiftStateToKeys(ShiftState: TShiftState): PtrUInt;
|
|
|
|
function WindowStateToStr(const State: TWindowState): string;
|
|
function StrToWindowState(const Name: string): TWindowState;
|
|
function dbgs(const State: TWindowState): string; overload;
|
|
function dbgs(const Action: TCloseAction): string; overload;
|
|
function dbgs(const Kind: TScrollBarKind): string; overload;
|
|
|
|
type
|
|
TFocusState = Pointer;
|
|
|
|
function SaveFocusState: TFocusState;
|
|
procedure RestoreFocusState(FocusState: TFocusState);
|
|
|
|
type
|
|
TGetDesignerFormEvent = function(APersistent: TPersistent): TCustomForm of object;
|
|
TIsFormDesignFunction = function(AForm: TWinControl): Boolean;
|
|
|
|
var
|
|
OnGetDesignerForm: TGetDesignerFormEvent = nil;
|
|
IsFormDesign: TIsFormDesignFunction = nil;
|
|
|
|
function GetParentForm(Control: TControl; TopForm: Boolean = True): TCustomForm;
|
|
function GetDesignerForm(Control: TControl): TCustomForm;
|
|
function GetFirstParentForm(Control:TControl): TCustomForm;
|
|
function GetTopFormSkipNonDocked(Control: TControl): TCustomForm;
|
|
function ValidParentForm(Control: TControl; TopForm: Boolean = True): TCustomForm;
|
|
function GetDesignerForm(APersistent: TPersistent): TCustomForm;
|
|
function FindRootDesigner(APersistent: TPersistent): TIDesigner;
|
|
function GetParentDesignControl(Control: TControl): TCustomDesignControl;
|
|
function NeedParentDesignControl(Control: TControl): TCustomDesignControl;
|
|
|
|
function IsAccel(VK: word; const Str: string): Boolean;
|
|
procedure NotifyApplicationUserInput(Target: TControl; Msg: Cardinal);
|
|
|
|
|
|
function GetShortHint(const Hint: string): string;
|
|
function GetLongHint(const Hint: string): string;
|
|
|
|
|
|
var
|
|
Application: TApplication = nil;
|
|
Screen: TScreen = nil;
|
|
ExceptionObject: TExceptObject;
|
|
HintWindowClass: THintWindowClass = THintWindow;
|
|
RequireDerivedFormResource: Boolean = False;
|
|
|
|
type
|
|
TMessageBoxFunction = function(Text, Caption : PChar; Flags : Longint) : Integer;
|
|
var
|
|
MessageBoxFunction: TMessageBoxFunction = nil;
|
|
|
|
const
|
|
DefaultBorderIcons : array[TFormBorderStyle] of TBorderIcons =
|
|
([], // bsNone
|
|
[biSystemMenu, biMinimize], // bsSingle
|
|
[biSystemMenu, biMinimize, biMaximize], // bsSizeable
|
|
[biSystemMenu], // bsDialog
|
|
[biSystemMenu, biMinimize], // bsToolWindow
|
|
[biSystemMenu, biMinimize, biMaximize]); // bsSizeToolWin
|
|
|
|
procedure CreateWidgetset(AWidgetsetClass: TWidgetsetClass);
|
|
procedure FreeWidgetSet;
|
|
|
|
procedure Register;
|
|
|
|
|
|
implementation
|
|
|
|
{$R cursors.res}
|
|
|
|
{$ifdef WinCE}
|
|
{$define extdecl := cdecl}
|
|
{$else}
|
|
{$define extdecl := stdcall}
|
|
{$endif}
|
|
|
|
uses
|
|
WSControls, WSForms; // Widgetset uses circle is allowed
|
|
|
|
var
|
|
HandlingException: Boolean = False;
|
|
HaltingProgram: Boolean = False;
|
|
LastFocusedControl: TWinControl = nil;
|
|
|
|
procedure Register;
|
|
begin
|
|
RegisterComponents('Standard',[TFrame]);
|
|
RegisterComponents('Additional',[TScrollBox, TApplicationProperties]);
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
procedure NotifyApplicationUserInput;
|
|
|
|
------------------------------------------------------------------------------}
|
|
procedure NotifyApplicationUserInput(Target: TControl; Msg: Cardinal);
|
|
begin
|
|
if Assigned(Application) then
|
|
Application.NotifyUserInputHandler(Target, Msg);
|
|
end;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
procedure ExceptionOccurred(Sender: TObject; Addr:Pointer; FrameCount: Longint;
|
|
Frames: PPointer);
|
|
Begin
|
|
DebugLn('[FORMS.PP] ExceptionOccurred ');
|
|
if HaltingProgram or HandlingException then Halt;
|
|
HandlingException:=true;
|
|
if Sender<>nil then
|
|
begin
|
|
DebugLn(' Sender=',Sender.ClassName);
|
|
if Sender is Exception then
|
|
begin
|
|
DebugLn(' Exception=',Exception(Sender).Message);
|
|
DumpExceptionBackTrace();
|
|
end;
|
|
end else
|
|
DebugLn(' Sender=nil');
|
|
if Application<>nil then
|
|
Application.HandleException(Sender);
|
|
HandlingException:=false;
|
|
end;
|
|
|
|
procedure BeforeFinalization;
|
|
// This is our ExitProc handler.
|
|
begin
|
|
Application.DoBeforeFinalization;
|
|
end;
|
|
|
|
function SaveFocusState: TFocusState;
|
|
begin
|
|
Result := LastFocusedControl;
|
|
end;
|
|
|
|
procedure RestoreFocusState(FocusState: TFocusState);
|
|
begin
|
|
LastFocusedControl := TWinControl(FocusState);
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
function KeysToShiftState(Keys: PtrUInt): TShiftState;
|
|
begin
|
|
Result := [];
|
|
if Keys and MK_Shift <> 0 then Include(Result, ssShift);
|
|
if Keys and MK_Control <> 0 then Include(Result, ssCtrl);
|
|
if Keys and MK_LButton <> 0 then Include(Result, ssLeft);
|
|
if Keys and MK_RButton <> 0 then Include(Result, ssRight);
|
|
if Keys and MK_MButton <> 0 then Include(Result, ssMiddle);
|
|
if Keys and MK_XBUTTON1 <> 0 then Include(Result, ssExtra1);
|
|
if Keys and MK_XBUTTON2 <> 0 then Include(Result, ssExtra2);
|
|
if Keys and MK_DOUBLECLICK <> 0 then Include(Result, ssDouble);
|
|
if Keys and MK_TRIPLECLICK <> 0 then Include(Result, ssTriple);
|
|
if Keys and MK_QUADCLICK <> 0 then Include(Result, ssQuad);
|
|
|
|
if GetKeyState(VK_MENU) < 0 then Include(Result, ssAlt);
|
|
if (GetKeyState(VK_LWIN) < 0) or (GetKeyState(VK_RWIN) < 0) then Include(Result, ssMeta);
|
|
end;
|
|
|
|
function KeyboardStateToShiftState: TShiftState;
|
|
begin
|
|
Result := [];
|
|
if GetKeyState(VK_SHIFT) < 0 then Include(Result, ssShift);
|
|
if GetKeyState(VK_CONTROL) < 0 then Include(Result, ssCtrl);
|
|
if GetKeyState(VK_MENU) < 0 then Include(Result, ssAlt);
|
|
if (GetKeyState(VK_LWIN) < 0) or
|
|
(GetKeyState(VK_RWIN) < 0) then Include(Result, ssMeta);
|
|
end;
|
|
|
|
function KeyDataToShiftState(KeyData: PtrInt): TShiftState;
|
|
begin
|
|
Result := MsgKeyDataToShiftState(KeyData);
|
|
end;
|
|
|
|
function ShiftStateToKeys(ShiftState: TShiftState): PtrUInt;
|
|
begin
|
|
Result := 0;
|
|
if ssShift in ShiftState then Result := Result or MK_SHIFT;
|
|
if ssCtrl in ShiftState then Result := Result or MK_CONTROL;
|
|
if ssLeft in ShiftState then Result := Result or MK_LBUTTON;
|
|
if ssRight in ShiftState then Result := Result or MK_RBUTTON;
|
|
if ssMiddle in ShiftState then Result := Result or MK_MBUTTON;
|
|
if ssExtra1 in ShiftState then Result := Result or MK_XBUTTON1;
|
|
if ssExtra2 in ShiftState then Result := Result or MK_XBUTTON2;
|
|
if ssDouble in ShiftState then Result := Result or MK_DOUBLECLICK;
|
|
if ssTriple in ShiftState then Result := Result or MK_TRIPLECLICK;
|
|
if ssQuad in ShiftState then Result := Result or MK_QUADCLICK;
|
|
end;
|
|
|
|
function WindowStateToStr(const State: TWindowState): string;
|
|
begin
|
|
Result:=GetEnumName(TypeInfo(TWindowState),ord(State));
|
|
end;
|
|
|
|
function StrToWindowState(const Name: string): TWindowState;
|
|
begin
|
|
Result:=TWindowState(GetEnumValueDef(TypeInfo(TWindowState),Name,
|
|
ord(wsNormal)));
|
|
end;
|
|
|
|
function dbgs(const State: TWindowState): string; overload;
|
|
begin
|
|
Result:=GetEnumName(TypeInfo(TWindowState),ord(State));
|
|
end;
|
|
|
|
function dbgs(const Action: TCloseAction): string; overload;
|
|
begin
|
|
Result:=GetEnumName(TypeInfo(TCloseAction),ord(Action));
|
|
end;
|
|
|
|
function dbgs(const Kind: TScrollBarKind): string;
|
|
begin
|
|
if Kind=sbVertical then
|
|
Result:='sbVertical'
|
|
else
|
|
Result:='sbHorizontal';
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
function GetParentForm(Control: TControl; TopForm: Boolean): TCustomForm;
|
|
begin
|
|
//For Delphi compatibility if Control is a TCustomForm with no parent, the function returns the TCustomForm itself
|
|
while (Control <> nil) and (Control.Parent <> nil) do
|
|
begin
|
|
if (not TopForm) and (Control is TCustomForm) then
|
|
Break;
|
|
Control := Control.Parent;
|
|
end;
|
|
if Control is TCustomForm then
|
|
Result := TCustomForm(Control)
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
function GetParentDesignControl(Control: TControl): TCustomDesignControl;
|
|
begin
|
|
while (Control <> nil) and (Control.Parent <> nil) do
|
|
Control := Control.Parent;
|
|
|
|
if Control is TCustomDesignControl then
|
|
Result := TCustomDesignControl(Control)
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
function NeedParentDesignControl(Control: TControl): TCustomDesignControl;
|
|
begin
|
|
Result := GetParentDesignControl(Control);
|
|
if Result=nil then
|
|
raise EInvalidOperation.CreateFmt(rsControlHasNoParentFormOrFrame, [Control.Name]);
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
function GetDesignerForm(Control: TControl): TCustomForm;
|
|
begin
|
|
// find the topmost parent form with designer
|
|
|
|
Result := nil;
|
|
while Control<>nil do
|
|
begin
|
|
if (Control is TCustomForm) and (TCustomForm(Control).Designer<>nil) then
|
|
Result := TCustomForm(Control);
|
|
Control := Control.Parent;
|
|
end;
|
|
end;
|
|
|
|
function GetTopFormSkipNonDocked(Control: TControl): TCustomForm;
|
|
var
|
|
aForm: TCustomForm;
|
|
begin
|
|
Result:=GetParentForm(Control, False);
|
|
if Result=nil then exit;
|
|
if Result.DockSite or Result.UseDockManager then exit;
|
|
repeat
|
|
aForm:=GetParentForm(Result.Parent,false);
|
|
if (aForm=nil) or aForm.DockSite or aForm.UseDockManager then exit;
|
|
Result:=aForm;
|
|
until false;
|
|
end;
|
|
|
|
//------------------------------------------------------------------------------
|
|
function ValidParentForm(Control: TControl; TopForm: Boolean): TCustomForm;
|
|
begin
|
|
Result := GetParentForm(Control, TopForm);
|
|
if Result = nil then
|
|
raise EInvalidOperation.CreateFmt(sParentRequired, [Control.Name]);
|
|
end;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
function IsAccel(VK: word; const Str: string): Boolean;
|
|
const
|
|
AmpersandChar = '&';
|
|
var
|
|
position: Integer;
|
|
ACaption, FoundChar: string;
|
|
begin
|
|
ACaption := Str;
|
|
Result := false;
|
|
repeat
|
|
position := UTF8Pos(AmpersandChar, ACaption);
|
|
// Not found or found at the end of string. Nothing to underscore.
|
|
if (position <= 0) or (position >= UTF8Length(ACaption)) then break;
|
|
FoundChar := UTF8Copy(ACaption, position+1, 1);
|
|
// two AmpersandChar characters together are not valid hot key
|
|
if FoundChar = AmpersandChar then
|
|
UTF8Delete(ACaption, 1, position+1)
|
|
else
|
|
Exit(UTF8UpperCase(UTF16ToUTF8(WideString(WideChar(VK)))) = UTF8UpperCase(FoundChar));
|
|
until false;
|
|
end;
|
|
|
|
//==============================================================================
|
|
|
|
function FindRootDesigner(APersistent: TPersistent): TIDesigner;
|
|
var
|
|
Form: TCustomForm;
|
|
begin
|
|
Result:=nil;
|
|
Form:=GetDesignerForm(APersistent);
|
|
if Form<>nil then
|
|
Result:=Form.Designer;
|
|
end;
|
|
|
|
function GetFirstParentForm(Control: TControl): TCustomForm;
|
|
begin
|
|
if (Control = nil) then
|
|
Result:= nil
|
|
else
|
|
Result := GetParentForm(Control, False);
|
|
end;
|
|
|
|
function GetDesignerForm(APersistent: TPersistent): TCustomForm;
|
|
begin
|
|
if APersistent = nil then Exit(nil);
|
|
if Assigned(OnGetDesignerForm) then
|
|
Result := OnGetDesignerForm(APersistent)
|
|
else
|
|
begin
|
|
Result := nil;
|
|
repeat
|
|
if (APersistent is TComponent) then begin
|
|
if TComponent(APersistent).Owner=nil then
|
|
exit;
|
|
APersistent:=TComponent(APersistent).Owner;
|
|
end else if APersistent is TCollection then begin
|
|
if TCollection(APersistent).Owner=nil then
|
|
exit;
|
|
APersistent:=TCollection(APersistent).Owner;
|
|
end else if APersistent is TCollectionItem then begin
|
|
if TCollectionItem(APersistent).Collection=nil then
|
|
exit;
|
|
APersistent:=TCollectionItem(APersistent).Collection;
|
|
end else if APersistent is TCustomForm then begin
|
|
Result := TCustomForm(APersistent);
|
|
exit;
|
|
end else
|
|
exit;
|
|
until false;
|
|
end;
|
|
end;
|
|
|
|
function SendApplicationMsg(Msg: Cardinal; WParam: WParam; LParam: LParam): Longint;
|
|
var
|
|
AMessage: TLMessage;
|
|
begin
|
|
if Application<>nil then begin
|
|
AMessage.Msg := Msg;
|
|
AMessage.WParam := WParam;
|
|
AMessage.LParam := LParam;
|
|
{ Can't simply use SendMessage, as the Application does not necessarily have a handle }
|
|
Application.WndProc(AMessage);
|
|
Result := AMessage.Result;
|
|
end else
|
|
Result := 0;
|
|
end;
|
|
|
|
procedure IfOwnerIsFormThenDesignerModified(AComponent: TComponent);
|
|
begin
|
|
if (AComponent<>nil) and (AComponent.Owner<>nil)
|
|
and ([csDesigning,csLoading]*AComponent.ComponentState=[csDesigning])
|
|
and (AComponent.Owner is TForm)
|
|
and (TForm(AComponent.Owner).Designer <> nil) then
|
|
TForm(AComponent.Owner).Designer.Modified;
|
|
end;
|
|
|
|
function GetShortHint(const Hint: string): string;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
I := Pos('|', Hint);
|
|
if I = 0 then
|
|
Result := Hint else
|
|
Result := Copy(Hint, 1, I - 1);
|
|
end;
|
|
|
|
function GetLongHint(const Hint: string): string;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
I := Pos('|', Hint);
|
|
if I = 0 then
|
|
Result := Hint else
|
|
Result := Copy(Hint, I + 1, Maxint);
|
|
end;
|
|
|
|
procedure CreateWidgetset(AWidgetsetClass: TWidgetsetClass);
|
|
begin
|
|
//debugln('CreateWidgetset');
|
|
CallInterfaceInitializationHandlers;
|
|
WidgetSet := AWidgetsetClass.Create;
|
|
end;
|
|
|
|
procedure FreeWidgetSet;
|
|
begin
|
|
//debugln('FreeWidgetSet');
|
|
if Screen <> nil then
|
|
begin
|
|
Screen.DestroyCursors;
|
|
Screen.DestroyMonitors;
|
|
end;
|
|
Application.Free;
|
|
Application:=nil;
|
|
CustomApplication:=nil;
|
|
FreeAllClipBoards;
|
|
CallInterfaceFinalizationHandlers;
|
|
WidgetSet.Free;
|
|
WidgetSet:=nil;
|
|
end;
|
|
|
|
|
|
//==============================================================================
|
|
|
|
{$I controlscrollbar.inc}
|
|
{$I scrollingwincontrol.inc}
|
|
{$I scrollbox.inc}
|
|
{$I customdesigncontrol.inc}
|
|
{$I customframe.inc}
|
|
{$I customform.inc}
|
|
{$I customdockform.inc}
|
|
{$I monitor.inc}
|
|
{$I screen.inc}
|
|
{$I application.inc}
|
|
{$I applicationproperties.inc}
|
|
{$I hintwindow.inc}
|
|
{$I windowmagnet.inc}
|
|
|
|
|
|
//==============================================================================
|
|
|
|
procedure ImageDrawEvent(AImageList: TPersistent; ACanvas: TPersistent;
|
|
AX, AY, AIndex: Integer; ADrawEffect: TGraphicsDrawEffect;
|
|
AImageWidth: Integer; ARefControl: TPersistent);
|
|
var
|
|
ImageList: TCustomImageList absolute AImageList;
|
|
Canvas: TCanvas absolute ACanvas;
|
|
RefControl: TControl absolute ARefControl;
|
|
begin
|
|
if (RefControl<>nil) and ImageList.Scaled then
|
|
ImageList.DrawForControl(Canvas,AX,AY,AIndex,AImageWidth,RefControl,ADrawEffect)
|
|
else
|
|
ImageList.Draw(Canvas,AX,AY,AIndex,ADrawEffect)
|
|
end;
|
|
|
|
function IsFormDesignFunction(AForm: TWinControl): Boolean;
|
|
var
|
|
LForm: TCustomForm absolute AForm;
|
|
begin
|
|
if (AForm = nil) or not (AForm is TCustomForm) then
|
|
Exit(False);
|
|
Result := (csDesignInstance in LForm.ComponentState)
|
|
or ((csDesigning in LForm.ComponentState) and (LForm.Designer <> nil));
|
|
end;
|
|
|
|
initialization
|
|
LCLProc.OwnerFormDesignerModifiedProc:=@IfOwnerIsFormThenDesignerModified;
|
|
ThemesImageDrawEvent:=@ImageDrawEvent;
|
|
IsFormDesign:=@IsFormDesignFunction;
|
|
Screen:=TScreen.Create(nil);
|
|
Application:=TApplication.Create(nil);
|
|
Assert(CustomApplication=Nil, 'CustomApplication is assigned in Forms initialization.');
|
|
CustomApplication:=Application;
|
|
|
|
finalization
|
|
//DebugLn('forms.pp - finalization section');
|
|
LCLProc.OwnerFormDesignerModifiedProc:=nil;
|
|
HintWindowClass:=nil;
|
|
FreeThenNil(Application);
|
|
CustomApplication:=nil;
|
|
FreeThenNil(Screen);
|
|
|
|
end.
|