diff --git a/designer/designer.pp b/designer/designer.pp index 152bffca07..7c647cc73a 100644 --- a/designer/designer.pp +++ b/designer/designer.pp @@ -2991,6 +2991,9 @@ Begin // remove all child controls owned by the LookupRoot if (APersistent is TWinControl) then begin AWinControl:=TWinControl(APersistent); + // Component may to auto-create new components during deletion unless informed. + // ComponentState does not have csDestroying yet when removing children. + AWinControl.DesignerDeleting := True; i:=AWinControl.ControlCount-1; while (i>=0) do begin ChildControl:=AWinControl.Controls[i]; @@ -3005,6 +3008,7 @@ Begin end else dec(i); end; + AWinControl.DesignerDeleting := False; end; // remove component {$IFDEF VerboseDesigner} diff --git a/lcl/controls.pp b/lcl/controls.pp index ce425de86f..3a0da6a36d 100644 --- a/lcl/controls.pp +++ b/lcl/controls.pp @@ -1893,6 +1893,7 @@ type FDoubleBuffered: Boolean; FDockSite: Boolean; FUseDockManager: Boolean; + FDesignerDeleting: Boolean; procedure AlignControl(AControl: TControl); function GetBrush: TBrush; function GetControl(const Index: Integer): TControl; @@ -2120,6 +2121,7 @@ type property Showing: Boolean read FShowing; // handle visible property UseDockManager: Boolean read FUseDockManager write SetUseDockManager default False; + property DesignerDeleting: Boolean read FDesignerDeleting write FDesignerDeleting; property VisibleDockClientCount: Integer read GetVisibleDockClientCount; public // size, position, bounds diff --git a/lcl/pairsplitter.pas b/lcl/pairsplitter.pas index 120bbbaba4..4428d023bc 100644 --- a/lcl/pairsplitter.pas +++ b/lcl/pairsplitter.pas @@ -170,19 +170,26 @@ end; procedure TPairSplitterSide.SetParent(AParent: TWinControl); var ASplitter: TCustomPairSplitter; + DeletingSplitter: Boolean; begin CheckNewParent(AParent); // remove from side list of old parent ASplitter := Splitter; - if ASplitter <> nil then + if ASplitter <> nil then begin ASplitter.RemoveSide(Self); + DeletingSplitter := (csDestroying in ASplitter.ComponentState) or DesignerDeleting; + end + else + DeletingSplitter := False; inherited SetParent(AParent); - // add to side list of new parent - ASplitter:=Splitter; - if ASplitter <> nil then - ASplitter.AddSide(Self); + if not DeletingSplitter then begin + // add to side list of new parent + ASplitter:=Splitter; + if ASplitter <> nil then + ASplitter.AddSide(Self); + end; end; procedure TPairSplitterSide.WMPaint(var PaintMessage: TLMPaint); @@ -281,7 +288,7 @@ begin i := Low(FSides); repeat if FSides[i] = ASide then - Exit; + Exit; if FSides[i] =nil then begin FSides[i] := ASide; @@ -309,7 +316,8 @@ begin FSides[i] := nil; end; // if the user deletes a side at designtime, autocreate a new one - if (csDesigning in ComponentState) then + if (ComponentState * [csDesigning,csDestroying] = [csDesigning]) + and not DesignerDeleting then CreateSides; end;