LazControls: Fix design time issues in FilterEdit controls. Issue #41321.

This commit is contained in:
Juha 2025-03-05 17:08:07 +02:00
parent 20d924570a
commit d6c7371e1f
4 changed files with 22 additions and 13 deletions

View File

@ -140,6 +140,12 @@ end;
procedure TListFilterEdit.SetFilteredListbox(const AValue: TCustomListBox); procedure TListFilterEdit.SetFilteredListbox(const AValue: TCustomListBox);
begin begin
if fFilteredListbox = AValue then Exit; if fFilteredListbox = AValue then Exit;
if Assigned(fFilteredListbox) then
begin
fFilteredListbox.RemoveFreeNotification(Self);
InternalSetFilter('');
ApplyFilter(True);
end;
fFilteredListbox:=AValue; fFilteredListbox:=AValue;
if Assigned(fFilteredListbox) then if Assigned(fFilteredListbox) then
begin begin
@ -147,6 +153,7 @@ begin
fOriginalData.Assign(fFilteredListbox.Items); fOriginalData.Assign(fFilteredListbox.Items);
if (fFilteredListbox is TCustomCheckListBox) and not Assigned(fCheckedItems) then if (fFilteredListbox is TCustomCheckListBox) and not Assigned(fCheckedItems) then
fCheckedItems:=TStringMap.Create(False); fCheckedItems:=TStringMap.Create(False);
fFilteredListbox.FreeNotification(Self);
end; end;
end; end;

View File

@ -151,12 +151,19 @@ var
i: Integer; i: Integer;
begin begin
if fFilteredListview = AValue then Exit; if fFilteredListview = AValue then Exit;
fFilteredListview:=AValue; if Assigned(fFilteredListview) then
begin
fFilteredListview.RemoveFreeNotification(Self);
InternalSetFilter('');
ApplyFilter(True);
end;
fFilteredListview := AValue;
if Assigned(fFilteredListview) then if Assigned(fFilteredListview) then
begin begin
InternalSetFilter(Text); InternalSetFilter(Text);
for i := 0 to fFilteredListview.Items.Count-1 do for i := 0 to fFilteredListview.Items.Count-1 do
fOriginalData.Add(ListItem2Data(fFilteredListview.Items[i])); fOriginalData.Add(ListItem2Data(fFilteredListview.Items[i]));
fFilteredListview.FreeNotification(Self);
end; end;
end; end;

View File

@ -729,11 +729,13 @@ begin
begin begin
fFilteredTreeview.RemoveFreeNotification(Self); fFilteredTreeview.RemoveFreeNotification(Self);
fFilteredTreeview.RemoveHandlerOnBeforeDestruction(@OnBeforeTreeDestroy); fFilteredTreeview.RemoveHandlerOnBeforeDestruction(@OnBeforeTreeDestroy);
InternalSetFilter('');
ApplyFilter(True);
end; end;
fFilteredTreeview := AValue; fFilteredTreeview := AValue;
if fFilteredTreeview <> nil then if fFilteredTreeview <> nil then
begin begin
InvalidateFilter; InternalSetFilter(Text);
fFilteredTreeview.FreeNotification(Self); fFilteredTreeview.FreeNotification(Self);
fFilteredTreeview.AddHandlerOnBeforeDestruction(@OnBeforeTreeDestroy); fFilteredTreeview.AddHandlerOnBeforeDestruction(@OnBeforeTreeDestroy);
end; end;

View File

@ -121,7 +121,6 @@ type
property OnButtonClick: TNotifyEvent read GetOnButtonClick write SetOnButtonClick; property OnButtonClick: TNotifyEvent read GetOnButtonClick write SetOnButtonClick;
public public
constructor Create(AOwner: TComponent); override; constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end; end;
{ TEditButton } { TEditButton }
@ -233,7 +232,6 @@ type
fSortData: Boolean; // Data needs to be sorted. fSortData: Boolean; // Data needs to be sorted.
fIsFirstSetFormActivate: Boolean; fIsFirstSetFormActivate: Boolean;
fOnAfterFilter: TNotifyEvent; fOnAfterFilter: TNotifyEvent;
procedure ApplyFilter(Immediately: Boolean = False);
procedure SetFilter(AValue: string); procedure SetFilter(AValue: string);
procedure SetFilterOptions(AValue: TFilterStringOptions); procedure SetFilterOptions(AValue: TFilterStringOptions);
procedure SetSortData(AValue: Boolean); procedure SetSortData(AValue: Boolean);
@ -259,6 +257,7 @@ type
procedure BuddyClick; override; procedure BuddyClick; override;
procedure SortAndFilter; virtual; abstract; procedure SortAndFilter; virtual; abstract;
procedure ApplyFilterCore; virtual; abstract; procedure ApplyFilterCore; virtual; abstract;
procedure ApplyFilter(Immediately: Boolean = False);
procedure MoveNext(ASelect: Boolean = False); virtual; abstract; procedure MoveNext(ASelect: Boolean = False); virtual; abstract;
procedure MovePrev(ASelect: Boolean = False); virtual; abstract; procedure MovePrev(ASelect: Boolean = False); virtual; abstract;
procedure MovePageUp(ASelect: Boolean = False); virtual; abstract; procedure MovePageUp(ASelect: Boolean = False); virtual; abstract;
@ -1170,18 +1169,13 @@ begin
Spacing := 4; Spacing := 4;
end; end;
destructor TCustomEditButton.Destroy;
begin
inherited Destroy;
end;
{ TCustomControlFilterEdit } { TCustomControlFilterEdit }
constructor TCustomControlFilterEdit.Create(AOwner: TComponent); constructor TCustomControlFilterEdit.Create(AOwner: TComponent);
begin begin
inherited Create(AOwner); inherited Create(AOwner);
ControlStyle := ControlStyle - [csSetCaption]; ControlStyle:=ControlStyle-[csSetCaption];
CharCase:=ecLowerCase; CharCase:=ecLowerCase;
Button.Enabled:=False; Button.Enabled:=False;
fFilterOptions:=[]; fFilterOptions:=[];
@ -1192,7 +1186,7 @@ end;
destructor TCustomControlFilterEdit.Destroy; destructor TCustomControlFilterEdit.Destroy;
begin begin
IdleConnected := False; IdleConnected:=False;
inherited Destroy; inherited Destroy;
end; end;
@ -1204,7 +1198,6 @@ end;
procedure TCustomControlFilterEdit.InternalSetFilter(const AValue: string); procedure TCustomControlFilterEdit.InternalSetFilter(const AValue: string);
begin begin
if fFilter=AValue then Exit;
Button.Enabled:=AValue<>''; Button.Enabled:=AValue<>'';
fFilter:=AValue; fFilter:=AValue;
fFilterLowercase:=UTF8LowerCase(fFilter); fFilterLowercase:=UTF8LowerCase(fFilter);
@ -1215,7 +1208,7 @@ procedure TCustomControlFilterEdit.SetFilter(AValue: string);
// AValue parameter must not have const modifier. It causes a crash, see issue #40300. // AValue parameter must not have const modifier. It causes a crash, see issue #40300.
begin begin
if Text=AValue then Exit; if Text=AValue then Exit;
Text:=AValue; // ActivateFilter will be called by EditChange handler. Text:=AValue; // ApplyFilter will be called by EditChange handler.
InternalSetFilter(AValue); InternalSetFilter(AValue);
end; end;