LazControls: Prevent TreeFilterEdit crashing when a form is closing, again. Issue #41509.

This commit is contained in:
Juha 2025-03-08 18:49:18 +02:00
parent db66ebdbb3
commit ceb97dc470

View File

@ -136,6 +136,7 @@ type
procedure SetFilteredTreeview(AValue: TCustomTreeview); procedure SetFilteredTreeview(AValue: TCustomTreeview);
procedure SetShowDirHierarchy(AValue: Boolean); procedure SetShowDirHierarchy(AValue: Boolean);
function FilterTree(Node: TTreeNode): Boolean; function FilterTree(Node: TTreeNode): Boolean;
procedure BeforeTreeDestroy(Sender: TObject);
protected protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override; procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure MoveNext(ASelect: Boolean = False); override; procedure MoveNext(ASelect: Boolean = False); override;
@ -703,6 +704,7 @@ end;
destructor TTreeFilterEdit.Destroy; destructor TTreeFilterEdit.Destroy;
begin begin
FilteredTreeview:=nil;
FreeAndNil(fBranches); FreeAndNil(fBranches);
FreeAndNil(fSelectionList); FreeAndNil(fSelectionList);
inherited Destroy; inherited Destroy;
@ -713,19 +715,27 @@ begin
Result := 'btnfiltercancel'; Result := 'btnfiltercancel';
end; end;
procedure TTreeFilterEdit.BeforeTreeDestroy(Sender: TObject);
begin
FreeAndNil(fBranches);
end;
procedure TTreeFilterEdit.SetFilteredTreeview(AValue: TCustomTreeview); procedure TTreeFilterEdit.SetFilteredTreeview(AValue: TCustomTreeview);
begin begin
if fFilteredTreeview = AValue then Exit; if fFilteredTreeview = AValue then Exit;
if fFilteredTreeview <> nil then if fFilteredTreeview <> nil then
begin begin
fFilteredTreeview.RemoveFreeNotification(Self); fFilteredTreeview.RemoveFreeNotification(Self);
ForceFilter(''); fFilteredTreeview.RemoveHandlerOnBeforeDestruction(@BeforeTreeDestroy);
if not (csDestroying in ComponentState) then
ForceFilter('');
FreeAndNil(fBranches); FreeAndNil(fBranches);
end; end;
fFilteredTreeview := AValue; fFilteredTreeview := AValue;
if fFilteredTreeview <> nil then if fFilteredTreeview <> nil then
begin begin
InternalSetFilter(Text); InternalSetFilter(Text);
fFilteredTreeview.AddHandlerOnBeforeDestruction(@BeforeTreeDestroy);
fFilteredTreeview.FreeNotification(Self); fFilteredTreeview.FreeNotification(Self);
end; end;
end; end;
@ -784,6 +794,7 @@ begin
begin begin
IdleConnected:=False; IdleConnected:=False;
fNeedFiltering:=False; fNeedFiltering:=False;
fFilteredTreeview.RemoveHandlerOnBeforeDestruction(@BeforeTreeDestroy);
fFilteredTreeview:=nil; fFilteredTreeview:=nil;
FreeAndNil(fBranches); FreeAndNil(fBranches);
end; end;