From ceb97dc4706e38e5d239c3b0f0021635374c59ab Mon Sep 17 00:00:00 2001 From: Juha Date: Sat, 8 Mar 2025 18:49:18 +0200 Subject: [PATCH] LazControls: Prevent TreeFilterEdit crashing when a form is closing, again. Issue #41509. --- components/lazcontrols/treefilteredit.pas | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/components/lazcontrols/treefilteredit.pas b/components/lazcontrols/treefilteredit.pas index 276e143aea..950d3541c1 100644 --- a/components/lazcontrols/treefilteredit.pas +++ b/components/lazcontrols/treefilteredit.pas @@ -136,6 +136,7 @@ type procedure SetFilteredTreeview(AValue: TCustomTreeview); procedure SetShowDirHierarchy(AValue: Boolean); function FilterTree(Node: TTreeNode): Boolean; + procedure BeforeTreeDestroy(Sender: TObject); protected procedure Notification(AComponent: TComponent; Operation: TOperation); override; procedure MoveNext(ASelect: Boolean = False); override; @@ -703,6 +704,7 @@ end; destructor TTreeFilterEdit.Destroy; begin + FilteredTreeview:=nil; FreeAndNil(fBranches); FreeAndNil(fSelectionList); inherited Destroy; @@ -713,19 +715,27 @@ begin Result := 'btnfiltercancel'; end; +procedure TTreeFilterEdit.BeforeTreeDestroy(Sender: TObject); +begin + FreeAndNil(fBranches); +end; + procedure TTreeFilterEdit.SetFilteredTreeview(AValue: TCustomTreeview); begin if fFilteredTreeview = AValue then Exit; if fFilteredTreeview <> nil then begin fFilteredTreeview.RemoveFreeNotification(Self); - ForceFilter(''); + fFilteredTreeview.RemoveHandlerOnBeforeDestruction(@BeforeTreeDestroy); + if not (csDestroying in ComponentState) then + ForceFilter(''); FreeAndNil(fBranches); end; fFilteredTreeview := AValue; if fFilteredTreeview <> nil then begin InternalSetFilter(Text); + fFilteredTreeview.AddHandlerOnBeforeDestruction(@BeforeTreeDestroy); fFilteredTreeview.FreeNotification(Self); end; end; @@ -784,6 +794,7 @@ begin begin IdleConnected:=False; fNeedFiltering:=False; + fFilteredTreeview.RemoveHandlerOnBeforeDestruction(@BeforeTreeDestroy); fFilteredTreeview:=nil; FreeAndNil(fBranches); end;