mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-15 18:39:09 +02:00
LCL: started MDI support. Added needed routines and properties.
git-svn-id: trunk@33323 -
This commit is contained in:
parent
9874a2fe96
commit
4628bd06d0
29
lcl/forms.pp
29
lcl/forms.pp
@ -404,6 +404,7 @@ type
|
|||||||
THelpEvent = function(Command: Word; Data: PtrInt; var CallHelp: Boolean): Boolean of object;
|
THelpEvent = function(Command: Word; Data: PtrInt; var CallHelp: Boolean): Boolean of object;
|
||||||
TShortCutEvent = procedure (var Msg: TLMKey; var Handled: Boolean) of object;
|
TShortCutEvent = procedure (var Msg: TLMKey; var Handled: Boolean) of object;
|
||||||
|
|
||||||
|
|
||||||
TCustomForm = class(TScrollingWinControl)
|
TCustomForm = class(TScrollingWinControl)
|
||||||
private
|
private
|
||||||
FActive: Boolean;
|
FActive: Boolean;
|
||||||
@ -452,6 +453,7 @@ type
|
|||||||
FRestoredHeight: integer;
|
FRestoredHeight: integer;
|
||||||
FShowInTaskbar: TShowInTaskbar;
|
FShowInTaskbar: TShowInTaskbar;
|
||||||
FWindowState: TWindowState;
|
FWindowState: TWindowState;
|
||||||
|
function GetClientHandle: HWND;
|
||||||
function GetEffectiveShowInTaskBar: TShowInTaskBar;
|
function GetEffectiveShowInTaskBar: TShowInTaskBar;
|
||||||
function GetMonitor: TMonitor;
|
function GetMonitor: TMonitor;
|
||||||
function GetPixelsPerInch: Longint;
|
function GetPixelsPerInch: Longint;
|
||||||
@ -570,6 +572,11 @@ type
|
|||||||
function DoExecuteAction(ExeAction: TBasicAction): boolean;
|
function DoExecuteAction(ExeAction: TBasicAction): boolean;
|
||||||
function DoUpdateAction(TheAction: TBasicAction): boolean;
|
function DoUpdateAction(TheAction: TBasicAction): boolean;
|
||||||
procedure UpdateActions; virtual;
|
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
|
public
|
||||||
constructor Create(AOwner: TComponent); override;
|
constructor Create(AOwner: TComponent); override;
|
||||||
constructor CreateNew(AOwner: TComponent; Num: Integer = 0); virtual;
|
constructor CreateNew(AOwner: TComponent; Num: Integer = 0); virtual;
|
||||||
@ -604,6 +611,7 @@ type
|
|||||||
function SetFocusedControl(Control: TWinControl): Boolean ; virtual;
|
function SetFocusedControl(Control: TWinControl): Boolean ; virtual;
|
||||||
procedure SetRestoredBounds(ALeft, ATop, AWidth, AHeight: integer);
|
procedure SetRestoredBounds(ALeft, ATop, AWidth, AHeight: integer);
|
||||||
procedure Show;
|
procedure Show;
|
||||||
|
|
||||||
function ShowModal: Integer; virtual;
|
function ShowModal: Integer; virtual;
|
||||||
procedure ShowOnTop;
|
procedure ShowOnTop;
|
||||||
function SmallIconHandle: HICON;
|
function SmallIconHandle: HICON;
|
||||||
@ -619,6 +627,12 @@ type
|
|||||||
procedure RemoveHandlerClose(OnCloseHandler: TCloseEvent);
|
procedure RemoveHandlerClose(OnCloseHandler: TCloseEvent);
|
||||||
procedure AddHandlerCreate(OnCreateHandler: TNotifyEvent; AsFirst: Boolean=true);
|
procedure AddHandlerCreate(OnCreateHandler: TNotifyEvent; AsFirst: Boolean=true);
|
||||||
procedure RemoveHandlerCreate(OnCreateHandler: TNotifyEvent);
|
procedure RemoveHandlerCreate(OnCreateHandler: TNotifyEvent);
|
||||||
|
public
|
||||||
|
{MDI implementation}
|
||||||
|
function ActiveMDIChild: TCustomForm; virtual;
|
||||||
|
function GetMDIChildren(AIndex: Integer): TCustomForm; virtual;
|
||||||
|
function MDIChildCount: Integer; virtual;
|
||||||
|
|
||||||
public
|
public
|
||||||
// drag and dock
|
// drag and dock
|
||||||
procedure Dock(NewDockSite: TWinControl; ARect: TRect); override;
|
procedure Dock(NewDockSite: TWinControl; ARect: TRect); override;
|
||||||
@ -648,6 +662,7 @@ type
|
|||||||
property HelpFile: string read FHelpFile write FHelpFile;
|
property HelpFile: string read FHelpFile write FHelpFile;
|
||||||
property Icon: TIcon read FIcon write SetIcon stored IsIconStored;
|
property Icon: TIcon read FIcon write SetIcon stored IsIconStored;
|
||||||
property KeyPreview: Boolean read FKeyPreview write FKeyPreview default False;
|
property KeyPreview: Boolean read FKeyPreview write FKeyPreview default False;
|
||||||
|
property MDIChildren[I: Integer]: TCustomForm read GetMDIChildren;
|
||||||
property Menu : TMainMenu read FMenu write SetMenu;
|
property Menu : TMainMenu read FMenu write SetMenu;
|
||||||
property ModalResult : TModalResult read FModalResult write FModalResult;
|
property ModalResult : TModalResult read FModalResult write FModalResult;
|
||||||
property Monitor: TMonitor read GetMonitor;
|
property Monitor: TMonitor read GetMonitor;
|
||||||
@ -690,7 +705,6 @@ type
|
|||||||
|
|
||||||
TForm = class(TCustomForm)
|
TForm = class(TCustomForm)
|
||||||
private
|
private
|
||||||
FClientHandle: HWND;
|
|
||||||
FLCLVersion: string;
|
FLCLVersion: string;
|
||||||
function LCLVersionIsStored: boolean;
|
function LCLVersionIsStored: boolean;
|
||||||
protected
|
protected
|
||||||
@ -698,7 +712,18 @@ type
|
|||||||
procedure Loaded; override;
|
procedure Loaded; override;
|
||||||
public
|
public
|
||||||
constructor Create(TheOwner: TComponent); override;
|
constructor Create(TheOwner: TComponent); override;
|
||||||
property ClientHandle: HWND read FClientHandle;
|
|
||||||
|
{ mdi related routine}
|
||||||
|
procedure Cascade;
|
||||||
|
{ mdi related routine}
|
||||||
|
procedure Next;
|
||||||
|
{ mdi related routine}
|
||||||
|
procedure Previous;
|
||||||
|
{ mdi related routine}
|
||||||
|
procedure Tile;
|
||||||
|
{ mdi related property}
|
||||||
|
property ClientHandle;
|
||||||
|
|
||||||
property DockManager;
|
property DockManager;
|
||||||
published
|
published
|
||||||
property Action;
|
property Action;
|
||||||
|
@ -2611,6 +2611,81 @@ begin
|
|||||||
FFormHandlers[fhtFirstShow].CallNotifyEvents(Self);
|
FFormHandlers[fhtFirstShow].CallNotifyEvents(Self);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{------------------------------------------------------------------------------
|
||||||
|
Method: TCustomForm.GetClientHandle
|
||||||
|
Params: None
|
||||||
|
Returns: Nothing
|
||||||
|
|
||||||
|
Returns handle of fsMdiForm container for mdi children.
|
||||||
|
This is not same as Handle of form.
|
||||||
|
Result is valid only if form FormStyle = fsMDIForm or FormStyle = fsMDIChild.
|
||||||
|
In case when FormStyle = fsMDIChild it'll return handle of it's container
|
||||||
|
(fsMDIForm).
|
||||||
|
------------------------------------------------------------------------------}
|
||||||
|
function TCustomForm.GetClientHandle: HWND;
|
||||||
|
begin
|
||||||
|
Result := 0;
|
||||||
|
if not (FormStyle in [fsMDIForm, fsMDIChild]) then
|
||||||
|
exit;
|
||||||
|
if HandleAllocated and not (csDesigning in ComponentState) then
|
||||||
|
Result := TWSCustomFormClass(WidgetSetClass).GetClientHandle(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{------------------------------------------------------------------------------
|
||||||
|
Method: TCustomForm.ActiveMDIChild
|
||||||
|
Params: None
|
||||||
|
Returns: Nothing
|
||||||
|
|
||||||
|
Returns currently active MDI child form of self.
|
||||||
|
Valid result is returned only when Self FormStyle = fsMDIForm or fsMDIChild,
|
||||||
|
otherwise Result is nil.
|
||||||
|
------------------------------------------------------------------------------}
|
||||||
|
function TCustomForm.ActiveMDIChild: TCustomForm;
|
||||||
|
begin
|
||||||
|
Result := nil;
|
||||||
|
if not (FormStyle in [fsMDIForm, fsMDIChild]) then
|
||||||
|
exit;
|
||||||
|
if HandleAllocated and not (csDesigning in ComponentState) then
|
||||||
|
Result := TWSCustomFormClass(WidgetSetClass).ActiveMDIChild(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{------------------------------------------------------------------------------
|
||||||
|
Method: TCustomForm.MDIChildCount
|
||||||
|
Params: None
|
||||||
|
Returns: Nothing
|
||||||
|
|
||||||
|
Returns count of MDIChild forms.
|
||||||
|
Result is returned only when Self FormStyle = fsMDIForm or fsMDIChild (can
|
||||||
|
be 0 ... number of mdichild forms).
|
||||||
|
If Result is -1 then caller isn't mdi or handle is not allocated.
|
||||||
|
------------------------------------------------------------------------------}
|
||||||
|
function TCustomForm.MDIChildCount: Integer;
|
||||||
|
begin
|
||||||
|
Result := -1;
|
||||||
|
if not (FormStyle in [fsMDIForm, fsMDIChild]) then
|
||||||
|
exit;
|
||||||
|
if HandleAllocated and not (csDesigning in ComponentState) then
|
||||||
|
Result := TWSCustomFormClass(WidgetSetClass).MDIChildCount(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{------------------------------------------------------------------------------
|
||||||
|
Method: TCustomForm.MDIChildCount
|
||||||
|
Params: AIndex: Integer;
|
||||||
|
Returns: TCustomForm with FormStyle = fsMDIChild
|
||||||
|
|
||||||
|
Returns MDI child (fsMDIChild) of parent mdi form (fsMDIForm) at index
|
||||||
|
AIndex in list of mdi children.
|
||||||
|
Result can be nil if caller isn't an mdi type or handle isn't allocated.
|
||||||
|
------------------------------------------------------------------------------}
|
||||||
|
function TCustomForm.GetMDIChildren(AIndex: Integer): TCustomForm;
|
||||||
|
begin
|
||||||
|
Result := nil;
|
||||||
|
if not (FormStyle in [fsMDIForm, fsMDIChild]) then
|
||||||
|
exit;
|
||||||
|
if HandleAllocated and not (csDesigning in ComponentState) then
|
||||||
|
Result := TWSCustomFormClass(WidgetSetClass).GetMDIChildren(Self, AIndex);
|
||||||
|
end;
|
||||||
|
|
||||||
{------------------------------------------------------------------------------
|
{------------------------------------------------------------------------------
|
||||||
TCustomForm ShowModal
|
TCustomForm ShowModal
|
||||||
------------------------------------------------------------------------------}
|
------------------------------------------------------------------------------}
|
||||||
@ -2866,6 +2941,78 @@ begin
|
|||||||
inherited Create(TheOwner);
|
inherited Create(TheOwner);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{------------------------------------------------------------------------------
|
||||||
|
Method: TForm.Cascade
|
||||||
|
Params: None
|
||||||
|
Returns: Nothing
|
||||||
|
|
||||||
|
Arranges MDI child forms so they overlap.
|
||||||
|
Use Cascade to arrange MDI child forms so they overlap.
|
||||||
|
Cascade works only if the form is an MDI parent form (FormStyle=fsMDIForm).
|
||||||
|
------------------------------------------------------------------------------}
|
||||||
|
procedure TForm.Cascade;
|
||||||
|
begin
|
||||||
|
if (FormStyle <> fsMDIForm) then
|
||||||
|
exit;
|
||||||
|
if HandleAllocated and not (csDesigning in ComponentState) then
|
||||||
|
TWSCustomFormClass(WidgetSetClass).Cascade(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{------------------------------------------------------------------------------
|
||||||
|
Method: TForm.Next
|
||||||
|
Params: None
|
||||||
|
Returns: Nothing
|
||||||
|
|
||||||
|
Activates the next child MDI form (fsMDIChild) in the form sequence.
|
||||||
|
Use Next to change the active child form of an MDI parent.
|
||||||
|
If calling of Next comes to the end of count it restarts and activates
|
||||||
|
first dsMDIChild in sequence.
|
||||||
|
The Next method applies only to forms with FormStyle = fsMDIForm.
|
||||||
|
------------------------------------------------------------------------------}
|
||||||
|
procedure TForm.Next;
|
||||||
|
begin
|
||||||
|
if (FormStyle <> fsMDIForm) then
|
||||||
|
exit;
|
||||||
|
if HandleAllocated and not (csDesigning in ComponentState) then
|
||||||
|
TWSCustomFormClass(WidgetSetClass).Next(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{------------------------------------------------------------------------------
|
||||||
|
Method: TForm.Previous
|
||||||
|
Params: None
|
||||||
|
Returns: Nothing
|
||||||
|
Activates the previous MDI child form in the form sequence.
|
||||||
|
Behaviour is vice-versa of TForm.Next.
|
||||||
|
The Previous method can be called only for forms with FormStyle = fsMDIForm
|
||||||
|
------------------------------------------------------------------------------}
|
||||||
|
procedure TForm.Previous;
|
||||||
|
begin
|
||||||
|
if (FormStyle <> fsMDIForm) then
|
||||||
|
exit;
|
||||||
|
if HandleAllocated and not (csDesigning in ComponentState) then
|
||||||
|
TWSCustomFormClass(WidgetSetClass).Previous(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{------------------------------------------------------------------------------
|
||||||
|
Method: TForm.Tile
|
||||||
|
Params: None
|
||||||
|
Returns: Nothing
|
||||||
|
|
||||||
|
Arranges MDI child forms so that they are all the same size.
|
||||||
|
Use Tile to arrange MDI child forms so that they are all the same size.
|
||||||
|
Tiled forms completely fill up the client area of the parent form.
|
||||||
|
How the forms arrange themselves depends upon the values of
|
||||||
|
their TileMode properties, and it depends on widgetset.
|
||||||
|
Tile works only if the form FormStyle = fsMDIForm.
|
||||||
|
------------------------------------------------------------------------------}
|
||||||
|
procedure TForm.Tile;
|
||||||
|
begin
|
||||||
|
if (FormStyle <> fsMDIForm) then
|
||||||
|
exit;
|
||||||
|
if HandleAllocated and not (csDesigning in ComponentState) then
|
||||||
|
TWSCustomFormClass(WidgetSetClass).Tile(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
|
||||||
{ TFormPropertyStorage }
|
{ TFormPropertyStorage }
|
||||||
|
@ -96,6 +96,16 @@ type
|
|||||||
class procedure SetShowInTaskbar(const AForm: TCustomForm; const AValue: TShowInTaskbar); virtual;
|
class procedure SetShowInTaskbar(const AForm: TCustomForm; const AValue: TShowInTaskbar); virtual;
|
||||||
class procedure SetZPosition(const AWinControl: TWinControl; const APosition: TWSZPosition); virtual;
|
class procedure SetZPosition(const AWinControl: TWinControl; const APosition: TWSZPosition); virtual;
|
||||||
class function GetDefaultColor(const AControl: TControl; const ADefaultColorType: TDefaultColorType): TColor; override;
|
class function GetDefaultColor(const AControl: TControl; const ADefaultColorType: TDefaultColorType): TColor; override;
|
||||||
|
|
||||||
|
{mdi support}
|
||||||
|
class function ActiveMDIChild(const AForm: TCustomForm): TCustomForm; virtual;
|
||||||
|
class function Cascade(const AForm: TCustomForm): Boolean; virtual;
|
||||||
|
class function GetClientHandle(const AForm: TCustomForm): HWND; virtual;
|
||||||
|
class function GetMDIChildren(const AForm: TCustomForm; AIndex: Integer): TCustomForm; virtual;
|
||||||
|
class function Next(const AForm: TCustomForm): Boolean; virtual;
|
||||||
|
class function Previous(const AForm: TCustomForm): Boolean; virtual;
|
||||||
|
class function Tile(const AForm: TCustomForm): Boolean; virtual;
|
||||||
|
class function MDIChildCount(const AForm: TCustomForm): Integer; virtual;
|
||||||
end;
|
end;
|
||||||
TWSCustomFormClass = class of TWSCustomForm;
|
TWSCustomFormClass = class of TWSCustomForm;
|
||||||
|
|
||||||
@ -189,7 +199,7 @@ const
|
|||||||
begin
|
begin
|
||||||
Result := DefColors[ADefaultColorType];
|
Result := DefColors[ADefaultColorType];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
class procedure TWSCustomForm.ShowModal(const ACustomForm: TCustomForm);
|
class procedure TWSCustomForm.ShowModal(const ACustomForm: TCustomForm);
|
||||||
begin
|
begin
|
||||||
end;
|
end;
|
||||||
@ -204,6 +214,51 @@ class procedure TWSCustomForm.SetAlphaBlend(const ACustomForm: TCustomForm;
|
|||||||
begin
|
begin
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{ mdi support }
|
||||||
|
|
||||||
|
class function TWSCustomForm.ActiveMDIChild(const AForm: TCustomForm
|
||||||
|
): TCustomForm;
|
||||||
|
begin
|
||||||
|
Result := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
class function TWSCustomForm.Cascade(const AForm: TCustomForm): Boolean;
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
end;
|
||||||
|
|
||||||
|
class function TWSCustomForm.GetClientHandle(const AForm: TCustomForm): HWND;
|
||||||
|
begin
|
||||||
|
Result := 0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
class function TWSCustomForm.GetMDIChildren(const AForm: TCustomForm;
|
||||||
|
AIndex: Integer): TCustomForm;
|
||||||
|
begin
|
||||||
|
Result := nil;
|
||||||
|
end;
|
||||||
|
|
||||||
|
class function TWSCustomForm.MDIChildCount(const AForm: TCustomForm): Integer;
|
||||||
|
begin
|
||||||
|
Result := 0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
class function TWSCustomForm.Next(const AForm: TCustomForm): Boolean;
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
end;
|
||||||
|
|
||||||
|
class function TWSCustomForm.Previous(const AForm: TCustomForm): Boolean;
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
end;
|
||||||
|
|
||||||
|
class function TWSCustomForm.Tile(const AForm: TCustomForm): Boolean;
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{ WidgetSetRegistration }
|
{ WidgetSetRegistration }
|
||||||
|
|
||||||
procedure RegisterScrollingWinControl;
|
procedure RegisterScrollingWinControl;
|
||||||
|
Loading…
Reference in New Issue
Block a user