DockedFormEditor: Fixed AV on designer default method creation (mouse double click)

git-svn-id: trunk@64573 -
This commit is contained in:
michl 2021-02-13 21:35:48 +00:00
parent 26c6ac0ef4
commit e1df656379
4 changed files with 23 additions and 11 deletions

View File

@ -229,7 +229,7 @@ var
LPageIndex: Integer; LPageIndex: Integer;
begin begin
LPageCtrl := SourceEditorWindows.FindModulePageControl(LastActiveSourceEditor); LPageCtrl := SourceEditorWindows.FindModulePageControl(LastActiveSourceEditor);
LRefreshDesigner := Assigned(LPageCtrl) and (LPageCtrl.PageIndex in [1, 2]); LRefreshDesigner := Assigned(LPageCtrl) and LPageCtrl.DesignerFocused;
LPageIndex := LPageCtrl.PageIndex; LPageIndex := LPageCtrl.PageIndex;
LPageCtrl.CreateTabSheetAnchors; LPageCtrl.CreateTabSheetAnchors;
@ -465,14 +465,14 @@ begin
// Prevent unexpected events (when is deactivated some control outside designed form) // Prevent unexpected events (when is deactivated some control outside designed form)
if (LDesignForm.LastActiveSourceWindow = LSourceEditorWindowInterface) if (LDesignForm.LastActiveSourceWindow = LSourceEditorWindowInterface)
// important!!! for many error - switching between editors... // important!!! for many error - switching between editors...
and (LPageCtrl.PageIndex in [1, 2]) then and LPageCtrl.DesignerFocused then
SourceEditorWindows.SourceEditorWindow[LSourceEditorWindowInterface].ActiveDesignForm := LDesignForm SourceEditorWindows.SourceEditorWindow[LSourceEditorWindowInterface].ActiveDesignForm := LDesignForm
else else
SourceEditorWindows.SourceEditorWindow[LSourceEditorWindowInterface].ActiveDesignForm := nil; SourceEditorWindows.SourceEditorWindow[LSourceEditorWindowInterface].ActiveDesignForm := nil;
end; end;
LPageCtrl.InitPage; LPageCtrl.InitPage;
if (LPageCtrl.PageIndex in [1, 2]) then if LPageCtrl.DesignerFocused then
begin begin
if not LDesignForm.Hiding then if not LDesignForm.Hiding then
begin begin
@ -578,7 +578,7 @@ begin
LSourceEditorWindow := SourceEditorWindows.SourceEditorWindow[LActiveSourceWindowInterface]; LSourceEditorWindow := SourceEditorWindows.SourceEditorWindow[LActiveSourceWindowInterface];
if LSourceEditorWindow = nil then Exit; if LSourceEditorWindow = nil then Exit;
if not (LPageCtrl.PageIndex in [1, 2]) then if not LPageCtrl.DesignerFocused then
begin begin
LSourceEditorWindow.ActiveDesignForm := nil; LSourceEditorWindow.ActiveDesignForm := nil;
LPageCtrl.InitPage; LPageCtrl.InitPage;

View File

@ -51,6 +51,7 @@ type
procedure CreateTabSheetAnchors; procedure CreateTabSheetAnchors;
procedure CreateTabSheetDesigner; procedure CreateTabSheetDesigner;
procedure DesignerSetFocus; procedure DesignerSetFocus;
function DesignerFocused: Boolean;
procedure HideDesignPages; procedure HideDesignPages;
procedure InitPage; procedure InitPage;
procedure RefreshResizer; procedure RefreshResizer;
@ -82,7 +83,6 @@ begin
FDesignForm := AValue; FDesignForm := AValue;
if AValue = nil then if AValue = nil then
begin begin
//find
if Assigned(FResizer) then if Assigned(FResizer) then
FResizer.DesignForm := nil; FResizer.DesignForm := nil;
end else begin end else begin
@ -153,6 +153,12 @@ begin
Resizer.DesignerSetFocus; Resizer.DesignerSetFocus;
end; end;
function TModulePageControl.DesignerFocused: Boolean;
begin
Result := (ActivePage = FTabSheetDesigner) or
(ActivePage = FTabSheetAnchors);
end;
procedure TModulePageControl.HideDesignPages; procedure TModulePageControl.HideDesignPages;
begin begin
FreeAndNil(FTabSheetAnchors); FreeAndNil(FTabSheetAnchors);

View File

@ -447,8 +447,13 @@ end;
procedure TResizeFrame.SetDesignForm(const AValue: TDesignForm); procedure TResizeFrame.SetDesignForm(const AValue: TDesignForm);
begin begin
FDesignForm := AValue; FDesignForm := AValue;
// special for QT (at start "design form" has wrong position) if Assigned(AValue) then
TryBoundDesignForm; begin
// special for QT (at start "design form" has wrong position)
TryBoundDesignForm;
Application.AddOnIdleHandler(@AppOnIdle);
end else
Application.RemoveOnIdleHandler(@AppOnIdle);
end; end;
procedure TResizeFrame.TryBoundDesignForm; procedure TResizeFrame.TryBoundDesignForm;
@ -481,14 +486,11 @@ begin
PanelFormClient.OnChangeBounds := @ClientChangeBounds; PanelFormClient.OnChangeBounds := @ClientChangeBounds;
PanelAnchorContainer.OnChangeBounds := @ClientChangeBounds; PanelAnchorContainer.OnChangeBounds := @ClientChangeBounds;
AdjustPanelResizer; AdjustPanelResizer;
Application.AddOnIdleHandler(@AppOnIdle);
end; end;
destructor TResizeFrame.Destroy; destructor TResizeFrame.Destroy;
begin begin
Pointer(FDesignForm) := nil; DesignForm := nil;
Application.RemoveOnIdleHandler(@AppOnIdle);
FBitmapBarInactive.Free; FBitmapBarInactive.Free;
FBitmapBarActive.Free; FBitmapBarActive.Free;
inherited Destroy; inherited Destroy;

View File

@ -107,6 +107,10 @@ end;
procedure TResizer.SetDesignForm(AValue: TDesignForm); procedure TResizer.SetDesignForm(AValue: TDesignForm);
begin begin
{$IFDEF DEBUGDOCKEDFORMEDITOR}
if Assigned(AValue) then DebugLn('TResizer.SetDesignForm: New Designform: ', DbgSName(AValue.Form))
else DebugLn('TResizer.SetDesignForm: New Designform: nil');
{$ENDIF}
if FDesignForm <> nil then if FDesignForm <> nil then
FDesignForm.OnChangeHackedBounds := nil; FDesignForm.OnChangeHackedBounds := nil;
FDesignForm := AValue; FDesignForm := AValue;