sparta: don't use fake design instances for TForm, TDataModule and TFrame. A little clean-up is needed but functionality should be ok. Fix for issues #29615, #29582, #30525, #31127, #31414, #31620

git-svn-id: trunk@55524 -
This commit is contained in:
hnb 2017-07-17 21:46:55 +00:00
parent 8e31460dbb
commit dce9f97030
10 changed files with 264 additions and 152 deletions

View File

@ -27,7 +27,7 @@ uses
type
{ TDesignedFormImpl }
TDesignedFormImpl = class(TFormImpl, IDesignedRealFormHelper, IDesignedForm, IDesignedFormIDE)
TDesignedFormImpl = class(TFormImpl, IDesignedRealForm, IDesignedRealFormHelper, IDesignedForm, IDesignedFormIDE)
private
FLastActiveSourceWindow: TSourceEditorWindowInterface;
protected
@ -181,7 +181,7 @@ var
LMediator: TDesignerMediator;
LLookupRoot: TComponent;
begin
LLookupRoot := (FOwner as TNonFormProxyDesignerForm).LookupRoot;
LLookupRoot := (FForm as TNonFormProxyDesignerForm).LookupRoot;
if LLookupRoot is TDataModule then
with TDataModule(LLookupRoot) do
case AIndex of
@ -192,7 +192,7 @@ begin
end
else
begin
LMediator := (FOwner as TNonControlProxyDesignerForm).Mediator;
LMediator := (FForm as TNonControlProxyDesignerForm).Mediator;
if (LLookupRoot <> nil) and (LMediator <> nil) then
begin
LMediator.GetFormBounds(LLookupRoot, LBounds, LClientRect);
@ -217,7 +217,7 @@ var
LMediator: TDesignerMediator;
LLookupRoot: TComponent;
begin
LLookupRoot := (FOwner as TNonFormProxyDesignerForm).LookupRoot;
LLookupRoot := (FForm as TNonFormProxyDesignerForm).LookupRoot;
if LLookupRoot is TDataModule then
with TDataModule(LLookupRoot) do
case AIndex of
@ -228,7 +228,7 @@ begin
end
else
begin
LMediator := (FOwner as TNonControlProxyDesignerForm).Mediator;
LMediator := (FForm as TNonControlProxyDesignerForm).Mediator;
if (LLookupRoot <> nil) and (LMediator <> nil) then
begin
LMediator.GetFormBounds(LLookupRoot, LBounds, LClientRect);
@ -254,8 +254,8 @@ end;
function TDesignedFrameFormImpl.GetPublishedBounds(AIndex: Integer): Integer;
begin
if (FOwner as TNonFormProxyDesignerForm).LookupRoot <> nil then
with (TNonFormProxyDesignerForm(FOwner).LookupRoot as TFrame) do
if (FForm as TNonFormProxyDesignerForm).LookupRoot <> nil then
with (TNonFormProxyDesignerForm(FForm).LookupRoot as TFrame) do
case AIndex of
0: Result := Left;
1: Result := Top;
@ -269,8 +269,8 @@ end;
procedure TDesignedFrameFormImpl.SetPublishedBounds(AIndex: Integer;
AValue: Integer);
begin
if (FOwner as TNonFormProxyDesignerForm).LookupRoot <> nil then
with (TNonFormProxyDesignerForm(FOwner).LookupRoot as TControl) do
if (FForm as TNonFormProxyDesignerForm).LookupRoot <> nil then
with (TNonFormProxyDesignerForm(FForm).LookupRoot as TControl) do
case AIndex of
0: Left := AValue;
1: Top := AValue;
@ -287,7 +287,7 @@ end;
function TFakeCustomFrame.GetDesignedForm: TDesignedFormImpl;
begin
if not Assigned(FDesignedForm) then
FDesignedForm := TDesignedFrameFormImpl.Create(Self);
FDesignedForm := TDesignedFrameFormImpl.Create(Self,Self);
Result := FDesignedForm;
end;
@ -314,7 +314,16 @@ end;
procedure TFakeCustomFrame.SetPublishedBounds(AIndex: Integer; AValue: Integer);
begin
DesignedForm.SetPublishedBounds(AIndex, AValue);
//DesignedForm.SetPublishedBounds(AIndex, AValue);
if LookupRoot <> nil then
with LookupRoot as TControl do
case AIndex of
0: Left := AValue;
1: Top := AValue;
2: Width := AValue;
3: Height := AValue;
end;
end;
constructor TFakeCustomFrame.Create(AOwner: TComponent;
@ -417,7 +426,7 @@ end;
function TFakeCustomNonControl.GetDesignedForm: TDesignedFormImpl;
begin
if not Assigned(FDesignedForm) then
FDesignedForm := TDesignedNonControlFormImpl.Create(Self);
FDesignedForm := TDesignedNonControlFormImpl.Create(Self,Self);
Result := FDesignedForm;
end;
@ -582,7 +591,7 @@ end;
function TFakeCustomForm.GetDesignedForm: TDesignedFormImpl;
begin
if not Assigned(FDesignedForm) then
FDesignedForm := TDesignedFormImpl.Create(Self);
FDesignedForm := TDesignedFormImpl.Create(Self,Self);
Result := FDesignedForm;
end;
@ -713,7 +722,7 @@ end;
procedure TDesignedFormImpl.BeginUpdate;
begin
TFormAccess(FOwner).SetDesigning(False, False);
TFormAccess(FForm).SetDesigning(False, False);
inherited BeginUpdate;
end;
@ -721,10 +730,10 @@ procedure TDesignedFormImpl.EndUpdate(AModified: Boolean);
var
OI: TObjectInspectorDlg;
begin
TFormAccess(FOwner).SetDesigning(True, False);
TFormAccess(FForm).SetDesigning(True, False);
inherited EndUpdate(AModified);
if AModified and (FormEditingHook <> nil)
and (FormEditingHook.GetCurrentDesigner = FOwner.Designer) then
and (FormEditingHook.GetCurrentDesigner = FForm.Designer) then
begin
OI := FormEditingHook.GetCurrentObjectInspector;
if Assigned(OI) then

View File

@ -25,7 +25,8 @@ uses
{$ELSE}
ghashmap, sparta_HashUtils, gvector,
{$ENDIF}
TypInfo, LCLIntf, LCLType, LMessages, sparta_FakeForm, sparta_FakeFrame, SpartaAPI, sparta_strconsts;
TypInfo, LCLIntf, LCLType, LMessages, sparta_FakeForm, sparta_FakeFrame,
SpartaAPI, sparta_strconsts, sparta_FakeCustom;
const
WM_SETNOFRAME = WM_USER;
@ -52,6 +53,7 @@ type
procedure SetPopupParent(AVal: TSourceEditorWindowInterface);
procedure DoAddForm;
procedure FormChangeBounds(Sender: TObject);
public
{$IFDEF USE_GENERICS_COLLECTIONS}
class var AddFormEvents: TList<TNotifyEvent>;
@ -120,6 +122,7 @@ type
constructor Create(AForm: TSourceEditorWindowInterface);
destructor Destroy; override;
property ActiveDesignFormData: TDesignFormData read FActiveDesignFormData write SetActiveDesignFormData;
procedure BoundToDesignTabSheet;
end;
{ TDTXTabMaster }
@ -472,7 +475,7 @@ begin
// during docking, form position was in wrong place... we need to delay changing position :)
if TheMessage.msg = WM_BoundToDesignTabSheet then
if Form.LastActiveSourceWindow <> nil then
SourceEditorWindows[Form.LastActiveSourceWindow].OnChangeBounds(nil);
SourceEditorWindows[Form.LastActiveSourceWindow].BoundToDesignTabSheet;
// we need to correct ActiveEditor to right form
// this code works correctly on Windows platform
@ -554,9 +557,17 @@ begin
end;
procedure TDesignFormData.FormChangeBounds(Sender: TObject);
begin
if not FForm.Update then
PostMessage(FForm.Form.Handle, WM_BoundToDesignTabSheet, 0, 0);
end;
constructor TDesignFormData.Create(AForm: TCustomForm);
begin
FForm := AForm as IDesignedFormIDE;
FForm := TDesignedFormImpl.Create(Self, AForm);
AForm.AddHandlerOnChangeBounds(FormChangeBounds);
FLastScreenshot := TBitmap.Create;
FWndMethod := FForm.Form.WindowProc;
@ -670,14 +681,14 @@ begin
if (AValue <> nil) then
begin
with AValue as IDesignedForm do
if not AValue.FHiding and (RealBorderStyle <> bsNone) then
{if not AValue.FHiding and (RealBorderStyle <> bsNone) then
begin
BeginUpdate;
//BeginUpdate;
//RealBorderIcons := [];
//RealBorderStyle := bsNone;
Form.Show;
EndUpdate;
end;
//Form.Show;
//EndUpdate;
end;}
// important when we want back to tab where was oppened form :<
LazarusIDE.DoShowDesignerFormOfSrc(FForm.ActiveEditor);
end;
@ -715,13 +726,22 @@ begin
inherited Destroy;
end;
procedure TSourceEditorWindowData.OnChangeBounds(Sender: TObject);
procedure TSourceEditorWindowData.BoundToDesignTabSheet;
var
LPageCtrl: TModulePageControl;
begin
LPageCtrl := FindModulePageControl(FForm);
if LPageCtrl <> nil then
//LPageCtrl.BoundToDesignTabSheet;
LPageCtrl.BoundToDesignTabSheet;
end;
procedure TSourceEditorWindowData.OnChangeBounds(Sender: TObject);
//var
// LPageCtrl: TModulePageControl;
begin
// LPageCtrl := FindModulePageControl(FForm);
// if LPageCtrl <> nil then
// LPageCtrl.BoundToDesignTabSheet;
end;
procedure TSourceEditorWindowData.AddPageCtrl(ASrcEditor: TSourceEditorInterface; APage: TModulePageControl);
@ -1205,13 +1225,13 @@ begin
// for lfm edition...
with LDesignFormData as IDesignedForm do
if not LDesignFormData.FHiding and (RealBorderStyle <> bsNone) then
if not LDesignFormData.FHiding {and (RealBorderStyle <> bsNone)} then
begin
BeginUpdate;
//BeginUpdate;
//RealBorderIcons := [];
//RealBorderStyle := bsNone;
Form.Show;
EndUpdate;
//Form.Show;
//EndUpdate;
LPageCtrl.BoundToDesignTabSheet;
PostMessage(Form.Handle, WM_BoundToDesignTabSheet, 0, 0);
@ -1484,7 +1504,7 @@ begin
//PostMessage(LWindow.Handle, WM_BoundToDesignTabSheet, 0, 0);
if LDesignForm <> nil then
begin
LDesignForm.Form.Form.Parent := FindModulePageControl(LWindow).Resizer.ActiveResizeFrame.ClientPanel;
LDesignForm.Form.Form.Parent := FindModulePageControl(LWindow).Resizer.ActiveResizeFrame.FormHandler;
PostMessage(LDesignForm.Form.Form.Handle, WM_BoundToDesignTabSheet, 0, 0);
end;
end;

View File

@ -28,11 +28,11 @@ implementation
procedure Register;
begin
FormEditingHook.StandardDesignerBaseClasses[DesignerBaseClassId_TForm] := TFakeForm;
FormEditingHook.StandardDesignerBaseClasses[DesignerBaseClassId_TFrame] := THookFrame;
//FormEditingHook.StandardDesignerBaseClasses[DesignerBaseClassId_TForm] := TFakeForm;
//FormEditingHook.StandardDesignerBaseClasses[DesignerBaseClassId_TFrame] := THookFrame;
FormEditingHook.NonFormProxyDesignerForm[NonControlProxyDesignerFormId] := TFakeNonControl;
FormEditingHook.NonFormProxyDesignerForm[FrameProxyDesignerFormId] := TFakeFrame;
//FormEditingHook.NonFormProxyDesignerForm[NonControlProxyDesignerFormId] := TFakeNonControl;
//FormEditingHook.NonFormProxyDesignerForm[FrameProxyDesignerFormId] := TFakeFrame;
Screen.AddHandlerFormAdded(TSpartaMainIDE.Screen_FormAdded);
Screen.AddHandlerRemoveForm(TSpartaMainIDE.Screen_FormDel);

View File

@ -210,7 +210,7 @@ var
LForm: IDesignedForm;
LFrame: IResizeFrame;
procedure Positioning;
(*procedure Positioning;
var
LHiddenHeight, LNewHeight: Integer;
LHiddenWidth, LNewWidth: Integer;
@ -225,7 +225,7 @@ var
// TODO - better handling of min width - same in TDesignedFormImpl.SetPublishedBounds (sparta_FakeCustom.pas)
LNewWidth := LFrame.ClientPanel.Width + LHiddenWidth;
LNewWidth := LFrame.NewSize.X + LHiddenWidth;
LForm.Width := LNewWidth;
LForm.RealWidth := LNewWidth;
@ -244,7 +244,7 @@ var
if LHiddenHeight > LFrame.DesignedHeightToScroll then
LHiddenHeight := LFrame.DesignedHeightToScroll;
LNewHeight := LFrame.ClientPanel.Height + LHiddenHeight;
LNewHeight := LFrame.NewSize.Y+ LHiddenHeight;
LForm.Height := LNewHeight;
LForm.RealHeight := LNewHeight;
@ -258,11 +258,27 @@ var
end;
LForm.EndUpdate;
end;
end;*)
procedure PositioningEnd;
var
LHiddenHeight, LNewHeight: Integer;
LHiddenWidth, LNewWidth: Integer;
begin
TryBoundSizerToDesignedForm(nil);
LHiddenWidth := sbH.Position;
if LHiddenWidth > LFrame.DesignedWidthToScroll then
LHiddenWidth := LFrame.DesignedWidthToScroll;
LNewWidth := LFrame.NewSize.X + LHiddenWidth;
LHiddenHeight := sbV.Position;
if LHiddenHeight > LFrame.DesignedHeightToScroll then
LHiddenHeight := LFrame.DesignedHeightToScroll;
LNewHeight := LFrame.NewSize.Y + LHiddenHeight;
LForm.Form.Width := LNewWidth;
LForm.Form.Height := LNewHeight;
end;
begin
@ -271,7 +287,7 @@ begin
case PositioningCode of
pcPositioningEnd: PositioningEnd;
pcPositioning: Positioning;
//pcPositioning: Positioning;
end;
end;

View File

@ -9,6 +9,9 @@ uses
LCLType, sparta_FormBackgroundForMDI;
type
{ TFormImpl }
TFormImpl = class(TComponent, IDesignedRealFormHelper, IDesignedForm)
private
FDesignedRealForm: IDesignedRealForm;
@ -24,7 +27,7 @@ type
function GetOnChangeHackedBounds: TNotifyEvent;
function PositionDelta: TPoint;
protected
FOwner: TCustomForm;
FForm: TCustomForm;
FUpdate: boolean;
protected
function GetRealBounds(AIndex: Integer): Integer; virtual;
@ -66,7 +69,7 @@ type
property RealBorderIcons: TBorderIcons read GetRealBorderIcons write SetRealBorderIcons;
property RealFormStyle: TFormStyle read GetRealFormStyle write SetRealFormStyle;
constructor Create(AOwner: TCustomForm); virtual;
constructor Create(AOwner: TComponent; AForm: TCustomForm); virtual; reintroduce;
destructor Destroy; override;
procedure BeginUpdate; virtual;
@ -141,11 +144,17 @@ type
function TFormImpl.GetPublishedBounds(AIndex: Integer): Integer;
begin
case AIndex of
0: Result := FHackLeft;
1: Result := FHackTop;
2: Result := FHackWidth;
3: Result := FHackHeight;
0: Result := FForm.Left;
1: Result := FForm.Top;
2: Result := FForm.Width;
3: Result := FForm.Height;
end;
//case AIndex of
// 0: Result := FHackLeft;
// 1: Result := FHackTop;
// 2: Result := FHackWidth;
// 3: Result := FHackHeight;
//end;
end;
procedure TFormImpl.SetPublishedBounds(AIndex: Integer; AValue: Integer);
@ -177,7 +186,15 @@ end;
function TFormImpl.GetRealBounds(AIndex: Integer): Integer;
begin
Result := FDesignedRealForm.GetRealBounds(AIndex);
case AIndex of
0: Result := FForm.Left;
1: Result := FForm.Top;
2: Result := FForm.Width;
3: Result := FForm.Height;
end;
//FForm.;
//Result := 0;// FDesignedRealForm.GetRealBounds(AIndex);
end;
procedure TFormImpl.SetRealBounds(AIndex: Integer; AValue: Integer);
@ -206,67 +223,67 @@ procedure TFormImpl.SetRealBounds(AIndex: Integer; AValue: Integer);
end;
begin
FDesignedRealForm.SetRealBounds(AIndex, AValue);
{FDesignedRealForm.SetRealBounds(AIndex, AValue);
if AIndex = 2 then
AdjustSize;
AdjustSize;}
end;
procedure TFormImpl.SetRealBorderStyle(AVal: TFormBorderStyle);
begin
FDesignedRealForm.SetRealBorderStyle(AVal);
//FDesignedRealForm.SetRealBorderStyle(AVal);
end;
procedure TFormImpl.SetRealBorderIcons(AVal: TBorderIcons);
begin
FDesignedRealForm.SetRealBorderIcons(AVal);
//FDesignedRealForm.SetRealBorderIcons(AVal);
end;
procedure TFormImpl.SetRealFormStyle(AVal: TFormStyle);
begin
FDesignedRealForm.SetRealFormStyle(AVal);
//FDesignedRealForm.SetRealFormStyle(AVal);
end;
procedure TFormImpl.SetRealPopupMode(AVal: TPopupMode);
begin
FDesignedRealForm.SetRealPopupMode(AVal);
//FDesignedRealForm.SetRealPopupMode(AVal);
end;
procedure TFormImpl.SetRealPopupParent(AVal: TCustomForm);
begin
FDesignedRealForm.SetRealPopupParent(AVal);
//FDesignedRealForm.SetRealPopupParent(AVal);
end;
function TFormImpl.GetRealBorderStyle: TFormBorderStyle;
begin
Result := FDesignedRealForm.GetRealBorderStyle;
Result := bsNone;//FDesignedRealForm.GetRealBorderStyle;
end;
function TFormImpl.GetRealBorderIcons: TBorderIcons;
begin
Result := FDesignedRealForm.GetRealBorderIcons;
Result := [];//FDesignedRealForm.GetRealBorderIcons;
end;
function TFormImpl.GetRealFormStyle: TFormStyle;
begin
Result := FDesignedRealForm.GetRealFormStyle;
Result := fsNormal;//FDesignedRealForm.GetRealFormStyle;
end;
function TFormImpl.GetRealPopupMode: TPopupMode;
begin
Result := FDesignedRealForm.GetRealPopupMode;
Result := pmNone//FDesignedRealForm.GetRealPopupMode;
end;
function TFormImpl.GetRealPopupParent: TCustomForm;
begin
Result := FDesignedRealForm.GetRealPopupParent;
Result := nil//FDesignedRealForm.GetRealPopupParent;
end;
//////
function TFormImpl.GetForm: TCustomForm;
begin
Result := FOwner;
Result := FForm;
end;
function TFormImpl.GetUpdate: Boolean;
@ -319,12 +336,12 @@ end;
function TFormImpl.GetHorzScrollPosition: Integer;
begin
Result := -(RealLeft + PositionDelta.x);
Result := -(RealLeft {+ PositionDelta.x});
end;
function TFormImpl.GetVertScrollPosition: Integer;
begin
Result := -(RealTop + PositionDelta.y);
Result := -(RealTop {+ PositionDelta.y});
end;
procedure TFormImpl.BeginUpdate;
@ -339,14 +356,14 @@ end;
procedure TFormImpl.ShowWindow;
begin
if FOwner.Parent = nil then
LCLIntf.ShowWindow(FOwner.Handle, SW_SHOW);
if FForm.Parent = nil then
LCLIntf.ShowWindow(FForm.Handle, SW_SHOW);
end;
procedure TFormImpl.HideWindow;
begin
if FOwner.Parent = nil then
LCLIntf.ShowWindow(FOwner.Handle, SW_HIDE);
if FForm.Parent = nil then
LCLIntf.ShowWindow(FForm.Handle, SW_HIDE);
end;
function TFormImpl.QueryInterface(constref IID: TGUID; out Obj
@ -354,13 +371,13 @@ function TFormImpl.QueryInterface(constref IID: TGUID; out Obj
begin
Result := inherited QueryInterface(IID, Obj);
if Result <> S_OK then
Result := TFormAccess(FOwner).QueryInterface(IID, Obj);
Result := TFormAccess(FForm).QueryInterface(IID, Obj);
end;
procedure TFormImpl.DoChangeHackedBounds;
begin
if not FUpdate and Assigned(FOnChangeHackedBounds) then
FOnChangeHackedBounds(FOwner);
FOnChangeHackedBounds(FForm);
end;
function TFormImpl.GetLogicalClientRect(ALogicalClientRect: TRect): TRect;
@ -368,10 +385,11 @@ begin
Result:=ALogicalClientRect;
end;
constructor TFormImpl.Create(AOwner: TCustomForm);
constructor TFormImpl.Create(AOwner: TComponent; AForm: TCustomForm);
begin
FOwner := AOwner;
FDesignedRealForm := FOwner as IDesignedRealForm;
inherited Create(AOwner);
FForm := AForm;
FDesignedRealForm := Self as IDesignedRealForm;
end;
destructor TFormImpl.Destroy;
@ -385,7 +403,7 @@ end;
function TFormContainer.GetDesignedForm: TFormImpl;
begin
if not Assigned(FDesignedForm) then
FDesignedForm := TFormImpl.Create(Self);
FDesignedForm := TFormImpl.Create(Self, Self);
Result := FDesignedForm;
end;

View File

@ -1,24 +1,28 @@
object BasicResizeFrame: TBasicResizeFrame
Left = 0
Height = 460
Height = 690
Top = 0
Width = 320
ClientHeight = 460
ClientWidth = 320
Width = 480
ClientHeight = 690
ClientWidth = 480
Color = clDefault
ParentColor = True
DesignTimePPI = 144
ParentFont = False
TabOrder = 0
DesignLeft = 789
DesignTop = 488
object pR: TPanel
AnchorSideTop.Control = Owner
Cursor = crSizeWE
Left = 295
Height = 443
Top = 0
Width = 8
Left = 446
Height = 664
Top = 166
Width = 12
Anchors = []
BevelOuter = bvNone
ClientHeight = 443
ClientWidth = 8
ClientHeight = 664
ClientWidth = 12
Color = clNone
ParentColor = False
TabOrder = 0
@ -28,12 +32,12 @@ object BasicResizeFrame: TBasicResizeFrame
AnchorSideBottom.Control = pR
AnchorSideBottom.Side = asrBottom
Left = 0
Height = 429
Top = 7
Width = 1
Height = 644
Top = 10
Width = 2
Anchors = [akTop, akLeft, akBottom]
BorderSpacing.Top = 7
BorderSpacing.Bottom = 7
BorderSpacing.Top = 10
BorderSpacing.Bottom = 10
BevelOuter = bvNone
Color = clWhite
ParentColor = False
@ -44,13 +48,13 @@ object BasicResizeFrame: TBasicResizeFrame
AnchorSideLeft.Control = Owner
Cursor = crSizeNS
Left = 0
Height = 8
Top = 435
Width = 303
Height = 12
Top = 656
Width = 454
Anchors = [akLeft, akRight]
BevelOuter = bvNone
ClientHeight = 8
ClientWidth = 303
ClientHeight = 12
ClientWidth = 454
Color = clNone
ParentColor = False
TabOrder = 1
@ -59,27 +63,27 @@ object BasicResizeFrame: TBasicResizeFrame
AnchorSideTop.Control = pB
AnchorSideRight.Control = pB
AnchorSideRight.Side = asrBottom
Left = 7
Height = 1
Left = 10
Height = 2
Top = 0
Width = 289
Width = 434
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 7
BorderSpacing.Right = 7
BorderSpacing.Left = 10
BorderSpacing.Right = 10
TabOrder = 0
end
end
object pL: TPanel
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Owner
Left = 0
Height = 443
Top = 0
Width = 8
Left = 3
Height = 664
Top = 166
Width = 12
Anchors = []
BevelOuter = bvNone
ClientHeight = 443
ClientWidth = 8
ClientHeight = 664
ClientWidth = 12
Color = clNone
ParentColor = False
TabOrder = 2
@ -89,13 +93,13 @@ object BasicResizeFrame: TBasicResizeFrame
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = pL
AnchorSideBottom.Side = asrBottom
Left = 7
Height = 429
Top = 7
Width = 1
Left = 10
Height = 644
Top = 10
Width = 2
Anchors = [akTop, akRight, akBottom]
BorderSpacing.Top = 7
BorderSpacing.Bottom = 7
BorderSpacing.Top = 10
BorderSpacing.Bottom = 10
BevelOuter = bvNone
Color = clWhite
ParentColor = False
@ -106,13 +110,13 @@ object BasicResizeFrame: TBasicResizeFrame
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Owner
Left = 0
Height = 8
Top = 0
Width = 303
Height = 12
Top = 3
Width = 454
Anchors = [akLeft, akRight]
BevelOuter = bvNone
ClientHeight = 8
ClientWidth = 303
ClientHeight = 12
ClientWidth = 454
Color = clNone
ParentColor = False
TabOrder = 3
@ -122,13 +126,13 @@ object BasicResizeFrame: TBasicResizeFrame
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = pT
AnchorSideBottom.Side = asrBottom
Left = 7
Height = 1
Top = 7
Width = 289
Left = 10
Height = 2
Top = 10
Width = 434
Anchors = [akLeft, akRight, akBottom]
BorderSpacing.Left = 7
BorderSpacing.Right = 7
BorderSpacing.Left = 10
BorderSpacing.Right = 10
BevelOuter = bvNone
Color = clWhite
ParentColor = False
@ -136,9 +140,9 @@ object BasicResizeFrame: TBasicResizeFrame
end
end
object iResizerLineImg: TImage
Left = 216
Left = 324
Height = 6
Top = 32
Top = 48
Width = 6
AutoSize = True
Picture.Data = {
@ -158,16 +162,14 @@ object BasicResizeFrame: TBasicResizeFrame
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = pR
AnchorSideBottom.Control = pB
Left = 8
Height = 427
Top = 8
Width = 287
Left = 15
Height = 641
Top = 15
Width = 431
Anchors = [akTop, akLeft, akRight, akBottom]
BevelOuter = bvNone
ClientHeight = 427
ClientWidth = 287
Color = clDefault
ParentColor = True
ClientHeight = 641
ClientWidth = 431
TabOrder = 4
object pFakeMenu: TPanel
AnchorSideLeft.Control = pBG
@ -175,9 +177,9 @@ object BasicResizeFrame: TBasicResizeFrame
AnchorSideRight.Control = pBG
AnchorSideRight.Side = asrBottom
Left = 0
Height = 50
Height = 75
Top = 0
Width = 287
Width = 431
Anchors = [akTop, akLeft, akRight]
BevelOuter = bvNone
TabOrder = 0
@ -192,14 +194,26 @@ object BasicResizeFrame: TBasicResizeFrame
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = pR
AnchorSideBottom.Control = pB
Left = 0
Height = 152
Top = 0
Width = 152
Left = 57
Height = 228
Top = 57
Width = 228
Anchors = []
BevelOuter = bvNone
Color = clDefault
ParentColor = True
ClientHeight = 228
ClientWidth = 228
Color = clGreen
ParentColor = False
TabOrder = 5
object pFormHandler: TPanel
Left = 32
Height = 50
Top = 112
Width = 170
BevelOuter = bvNone
Color = clDefault
ParentColor = False
TabOrder = 0
end
end
end

View File

@ -18,6 +18,7 @@ type
TResizerFrameClass = class of TBasicResizeFrame;
TBasicResizeFrame = class(TFrame, IResizeFrame)
iResizerLineImg: TImage;
pFormHandler: TPanel;
pFakeMenu: TPanel;
pBG: TPanel;
pB: TPanel;
@ -59,6 +60,7 @@ type
FPositioningKind: TPositioningKind;
FMaxWidth, FMaxHeight: Integer;
FLastClientWidth, FLastClientHeight: Integer;
FLastDesignedWidthToScroll, FLastDesignedHeightToScroll: Integer;
FOldHasMainMenu: Boolean;
FDesignerModified: Boolean;
FSizerLineWidth: Integer;
@ -92,6 +94,8 @@ type
function LeftSizerLineWidth: Integer;
function HorizontalSizerLineLength: Integer;
procedure AdjustFormHandler;
function GetMenuHeight: Integer;
protected
FNodes: TObjectList;
@ -116,7 +120,8 @@ type
function GetBackgroundPanel: TPanel;
function GetBackgroundMargin(const AIndex: Integer): Integer;
function GetClientPanel: TPanel;
function GetNewSize: TPoint;
function GetFormHandler: TPanel;
function GetNodePositioning: Boolean;
function GetDesignedForm: IDesignedForm;
procedure SetDesignedForm(const AValue: IDesignedForm);
@ -436,6 +441,7 @@ begin
if (Enabled) and (Sender is TWinControl) then
begin
FNodePositioning:=True;
BeginFormSizeUpdate(Sender);
// when we start resizing the rules do not apply to us :)
FMaxWidth := Constraints.MaxWidth;
@ -459,7 +465,6 @@ begin
BorderSpacing.Bottom := Max(Self.Height - (pB.Top - BgBottomMargin), 0);
end;
BeginFormSizeUpdate(Sender);
{$IF Defined(LCLWin32) or Defined(LCLWin64)}
SetCapture(TWinControl(Sender).Handle);
@ -619,6 +624,7 @@ begin
if Assigned(OnNodePositioning) then
OnNodePositioning(Sender, FPositioningKind, pcPositioningEnd);
FPositioningKind := [];
FNodePositioning := False;
pClient.Align := alNone;
BorderSpacing.Left := 0;
@ -632,6 +638,10 @@ begin
// after resizing, TFrame is frozen in Windows OS
// this is trick to workaraund IDE bug. Also for proper size for normal form
TryBoundDesignedForm;
// for small resizes, designed form is moved on the top and on the bottom
// is showed white block - to stop this we need to move pClient to right position
PositionNodes;
ShowSizeControls;
end;
end;
@ -725,6 +735,14 @@ begin
Result := Width - RightMargin;
end;
procedure TBasicResizeFrame.AdjustFormHandler;
begin
pFormHandler.Left:=(-FDesignedForm.Form.Left)-(FDesignedForm.PositionDelta.x+ifthen(FHorizontalScrollPos-SizerLineWidth>0,FHorizontalScrollPos-SizerLineWidth,0));
pFormHandler.Top:=(-FDesignedForm.Form.Top)-(FDesignedForm.PositionDelta.y+ifthen(FVerticalScrollPos-SizerLineWidth>0,FVerticalScrollPos-SizerLineWidth,0));
pFormHandler.Width:=(FDesignedForm.Form.Width+abs(FDesignedForm.Form.Left)+FDesignedForm.PositionDelta.x);;
pFormHandler.Height:=(FDesignedForm.Form.Height+abs(FDesignedForm.Form.Top)+FDesignedForm.PositionDelta.y);
end;
function TBasicResizeFrame.GetBackgroundMargin(const AIndex: Integer): Integer;
begin
if FBackground = nil then
@ -736,9 +754,14 @@ begin
Result := Result + GetMenuHeight;
end;
function TBasicResizeFrame.GetClientPanel: TPanel;
function TBasicResizeFrame.GetNewSize: TPoint;
begin
Result := pClient;
Result := TPoint.Create(FLastClientWidth,FLastClientHeight);
end;
function TBasicResizeFrame.GetFormHandler: TPanel;
begin
Result := pFormHandler;
end;
function TBasicResizeFrame.GetNodePositioning: Boolean;
@ -795,9 +818,9 @@ begin
// for GTK2 resizing form (pClient is hidden under pBG)
{$IF DEFINED(LCLGtk2) OR DEFINED(LCLQt) OR DEFINED(LCLQt5)}
pClient.SendToBack; // <--- this is a must.
pFormHandler.SendToBack; // <--- this is a must.
{$ENDIF}
pClient.BringToFront;
pFormHandler.BringToFront;
pFakeMenu.Visible := HasMainMenu;
if pFakeMenu.Visible then
@ -812,6 +835,8 @@ end;
procedure TBasicResizeFrame.BeginFormSizeUpdate(Sender: TObject);
begin
FLastDesignedWidthToScroll:=DesignedWidthToScroll;
FLastDesignedHeightToScroll:=DesignedHeightToScroll;
end;
procedure TBasicResizeFrame.EndFormSizeUpdate(Sender: TObject);
@ -862,8 +887,10 @@ function TBasicResizeFrame.DesignedWidthToScroll: Integer;
begin
if DesignedForm = nil then
Exit(0);
Result := DesignedForm.Width - FLastClientWidth;
if FNodePositioning then
Result := FLastDesignedWidthToScroll
else
Result := abs(DesignedForm.Width - FLastClientWidth);
//Result := DesignedForm.Width - DesignedForm.RealWidth;
end;
@ -878,7 +905,10 @@ begin
if DesignedForm = nil then
Exit(0);
Result := DesignedForm.Height - FLastClientHeight;
if FNodePositioning then
Result := FLastDesignedHeightToScroll
else
Result := abs(DesignedForm.Height - FLastClientHeight);
//Result := DesignedForm.Height - DesignedForm.RealHeight;
end;
@ -1035,6 +1065,8 @@ begin
pClient.Width := Width - pClient.Left - Max(Width - (pR.Left - BgRightMargin), 0);
end;
AdjustFormHandler;
for Node := 0 to 7 do
begin
with AroundControl do

View File

@ -55,7 +55,7 @@ begin
begin
FDesignedForm.BeginUpdate;
FDesignedForm.Form.Parent := FResizerFrame.pClient;
FDesignedForm.Form.Parent := FResizerFrame.pFormHandler;
{$IFNDEF WINDOWS}
FDesignedForm.Form.BorderStyle := bsNone;
{$ENDIF}

View File

@ -52,6 +52,7 @@ type
procedure ShowWindow;
procedure HideWindow;
function PositionDelta: TPoint;
// hacked values
function GetPublishedBounds(AIndex: Integer): Integer;
@ -102,7 +103,8 @@ type
procedure SetHorizontalScrollPos(AValue: Integer);
function GetBackgroundPanel: TPanel;
function GetBackgroundMargin(const AIndex: Integer): Integer;
function GetClientPanel: TPanel;
function GetNewSize: TPoint;
function GetFormHandler: TPanel;
function GetNodePositioning: Boolean;
function GetDesignedForm: IDesignedForm;
procedure SetDesignedForm(const AValue: IDesignedForm);
@ -120,7 +122,8 @@ type
property BgRightMargin: Integer index 2 read GetBackgroundMargin;
property BgBottomMargin: Integer index 3 read GetBackgroundMargin;
property ClientPanel: TPanel read GetClientPanel;
property NewSize: TPoint read GetNewSize;
property FormHandler: TPanel read GetFormHandler;
property NodePositioning: Boolean read GetNodePositioning;
property DesignedForm: IDesignedForm read GetDesignedForm write SetDesignedForm;

View File

@ -37,7 +37,7 @@ var
procedure Register;
begin
FormEditingHook.StandardDesignerBaseClasses[DesignerBaseClassId_TForm] := TFakeFormBG;
//FormEditingHook.StandardDesignerBaseClasses[DesignerBaseClassId_TForm] := TFakeFormBG;
Manager := TStarterDesignTimeUtilsManager.Create;
DTUManager := Manager;
end;