diff --git a/lcl/controls.pp b/lcl/controls.pp index 4b65a27d9d..490dbd5cd4 100644 --- a/lcl/controls.pp +++ b/lcl/controls.pp @@ -979,6 +979,7 @@ type function GetCursor: TCursor; virtual; procedure SetCursor(Value: TCursor); virtual; procedure SetVisible(Value: Boolean); virtual; + procedure DoOnParentHandleDestruction; virtual; protected // sizing/aligning procedure DoAutoSize; virtual; @@ -1905,6 +1906,8 @@ type procedure FontChanged(Sender: TObject); override; procedure Paint; virtual; procedure DoOnChangeBounds; override; + procedure DoOnParentHandleDestruction; override; + property OnPaint: TNotifyEvent read FOnPaint write FOnPaint; public constructor Create(AOwner: TComponent); override; diff --git a/lcl/include/control.inc b/lcl/include/control.inc index d72d708c68..939d7c79db 100644 --- a/lcl/include/control.inc +++ b/lcl/include/control.inc @@ -3499,6 +3499,11 @@ begin ControlState := ControlState + [csVisibleSetInLoading]; end; +procedure TControl.DoOnParentHandleDestruction; +begin + // nothing, implement in descendats +end; + {------------------------------------------------------------------------------ TControl.SetZOrder diff --git a/lcl/include/customcontrol.inc b/lcl/include/customcontrol.inc index 5daa63327b..47bc55cb90 100644 --- a/lcl/include/customcontrol.inc +++ b/lcl/include/customcontrol.inc @@ -63,7 +63,7 @@ end; procedure TCustomControl.DestroyWnd; begin - if FCanvas<>nil then + if FCanvas <> nil then TControlCanvas(FCanvas).FreeHandle; inherited DestroyWnd; end; diff --git a/lcl/include/graphiccontrol.inc b/lcl/include/graphiccontrol.inc index c6ec1aceb2..8d50503cf4 100644 --- a/lcl/include/graphiccontrol.inc +++ b/lcl/include/graphiccontrol.inc @@ -104,5 +104,12 @@ begin TControlCanvas(Canvas).FreeHandle; end; +procedure TGraphicControl.DoOnParentHandleDestruction; +begin + inherited; + if Canvas.HandleAllocated then + TControlCanvas(Canvas).FreeHandle; +end; + // included by controls.pp diff --git a/lcl/include/wincontrol.inc b/lcl/include/wincontrol.inc index 10971979f9..8960ef25f3 100644 --- a/lcl/include/wincontrol.inc +++ b/lcl/include/wincontrol.inc @@ -6839,8 +6839,8 @@ begin if not HandleAllocated then RaiseGDBException('TWinControl.FinalizeWnd Handle already destroyed'); // make sure our text is saved - if TWSWinControlClass(WidgetSetClass).GetText(Self, S) - then FCaption := S; + if TWSWinControlClass(WidgetSetClass).GetText(Self, S) then + FCaption := S; // if color has changed make sure it will be restored if FColor<>clWindow then Include(FWinControlFlags,wcfColorChanged); @@ -6999,10 +6999,17 @@ end; Destroys the interface object. ------------------------------------------------------------------------------} procedure TWinControl.DestroyWnd; +var + i: integer; begin if HandleAllocated then begin FinalizeWnd; + + if FControls <> nil then + for i := 0 to FControls.Count - 1 do + TControl(FControls[i]).DoOnParentHandleDestruction; + TWSWinControlClass(WidgetSetClass).DestroyHandle(Self); Handle := 0; // We don't know why we here. Maybe because handle is not needed at moment