LazControls: Restore fFilter variable for FilterEdit controls. Issue #40257.

This commit is contained in:
Juha 2023-05-15 22:29:41 +03:00
parent 745e6c5db9
commit d28b530b59
4 changed files with 20 additions and 23 deletions

View File

@ -143,7 +143,7 @@ begin
fFilteredListbox:=AValue; fFilteredListbox:=AValue;
if Assigned(fFilteredListbox) then if Assigned(fFilteredListbox) then
begin begin
ActivateFilter; InternalSetFilter(Text);
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);

View File

@ -154,7 +154,7 @@ begin
fFilteredListview:=AValue; fFilteredListview:=AValue;
if Assigned(fFilteredListview) then if Assigned(fFilteredListview) then
begin begin
ActivateFilter; 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]));
end; end;

View File

@ -454,7 +454,7 @@ begin
fFilteredTreeview := AValue; fFilteredTreeview := AValue;
if fFilteredTreeview <> nil then if fFilteredTreeview <> nil then
begin begin
ActivateFilter; InternalSetFilter(Text);
fFilteredTreeview.FreeNotification(Self); fFilteredTreeview.FreeNotification(Self);
fFilteredTreeview.AddHandlerOnBeforeDestruction(@OnBeforeTreeDestroy); fFilteredTreeview.AddHandlerOnBeforeDestruction(@OnBeforeTreeDestroy);
end; end;

View File

@ -224,6 +224,7 @@ type
// visual controls like TListView and TTreeView. // visual controls like TListView and TTreeView.
TCustomControlFilterEdit = class(TCustomEditButton) TCustomControlFilterEdit = class(TCustomEditButton)
private private
fFilter: string;
fFilterLowercase: string; fFilterLowercase: string;
fFilterOptions: TFilterStringOptions; fFilterOptions: TFilterStringOptions;
fIdleConnected: Boolean; fIdleConnected: Boolean;
@ -231,7 +232,6 @@ type
fIsFirstSetFormActivate: Boolean; fIsFirstSetFormActivate: Boolean;
fOnAfterFilter: TNotifyEvent; fOnAfterFilter: TNotifyEvent;
procedure ApplyFilter(Immediately: Boolean = False); procedure ApplyFilter(Immediately: Boolean = False);
function GetFilter: string;
procedure SetFilter(const AValue: string); procedure SetFilter(const AValue: string);
procedure SetFilterOptions(AValue: TFilterStringOptions); procedure SetFilterOptions(AValue: TFilterStringOptions);
procedure SetSortData(AValue: Boolean); procedure SetSortData(AValue: Boolean);
@ -246,7 +246,7 @@ type
fOnFilterItemEx: TFilterItemExEvent; fOnFilterItemEx: TFilterItemExEvent;
fOnCheckItem: TCheckItemEvent; fOnCheckItem: TCheckItemEvent;
procedure DestroyWnd; override; procedure DestroyWnd; override;
procedure ActivateFilter; procedure InternalSetFilter(const AValue: string);
function DoDefaultFilterItem(const ACaption: string; function DoDefaultFilterItem(const ACaption: string;
const ItemData: Pointer): Boolean; virtual; const ItemData: Pointer): Boolean; virtual;
function DoFilterItem(const ACaption: string; function DoFilterItem(const ACaption: string;
@ -274,7 +274,7 @@ type
procedure StoreSelection; virtual; abstract; procedure StoreSelection; virtual; abstract;
procedure RestoreSelection; virtual; abstract; procedure RestoreSelection; virtual; abstract;
public public
property Filter: string read GetFilter write SetFilter; property Filter: string read fFilter write SetFilter;
property FilterLowercase: string read fFilterLowercase; property FilterLowercase: string read fFilterLowercase;
property IdleConnected: Boolean read fIdleConnected write SetIdleConnected; property IdleConnected: Boolean read fIdleConnected write SetIdleConnected;
property SortData: Boolean read fSortData write SetSortData; property SortData: Boolean read fSortData write SetSortData;
@ -1171,17 +1171,12 @@ begin
inherited DestroyWnd; inherited DestroyWnd;
end; end;
function TCustomControlFilterEdit.GetFilter: string; procedure TCustomControlFilterEdit.InternalSetFilter(const AValue: string);
begin begin
Result:=Text; if fFilter=AValue then Exit;
end; Button.Enabled:=AValue<>'';
fFilter:=AValue;
procedure TCustomControlFilterEdit.ActivateFilter; fFilterLowercase:=UTF8LowerCase(fFilter);
// Activate an existing filter text.
// Used when user types text, and initially when a container control is assigned.
begin
Button.Enabled:=Text<>'';
fFilterLowercase:=UTF8LowerCase(Text);
InvalidateFilter; InvalidateFilter;
end; end;
@ -1189,6 +1184,7 @@ procedure TCustomControlFilterEdit.SetFilter(const AValue: string);
begin begin
if Text=AValue then Exit; if Text=AValue then Exit;
Text:=AValue; // ActivateFilter will be called by EditChange handler. Text:=AValue; // ActivateFilter will be called by EditChange handler.
InternalSetFilter(AValue);
end; end;
procedure TCustomControlFilterEdit.SetFilterOptions(AValue: TFilterStringOptions); procedure TCustomControlFilterEdit.SetFilterOptions(AValue: TFilterStringOptions);
@ -1210,11 +1206,11 @@ function TCustomControlFilterEdit.DoDefaultFilterItem(const ACaption: string;
var var
NPos: integer; NPos: integer;
begin begin
if Filter='' then if fFilter='' then
exit(True); exit(True);
if fsoCaseSensitive in fFilterOptions then if fsoCaseSensitive in fFilterOptions then
NPos := Pos(Filter, ACaption) NPos := Pos(fFilter, ACaption)
else else
NPos := Pos(fFilterLowercase, UTF8LowerCase(ACaption)); NPos := Pos(fFilterLowercase, UTF8LowerCase(ACaption));
@ -1298,7 +1294,7 @@ end;
procedure TCustomControlFilterEdit.EditChange; procedure TCustomControlFilterEdit.EditChange;
begin begin
ActivateFilter; InternalSetFilter(Text);
inherited; inherited;
end; end;
@ -1348,10 +1344,11 @@ end;
function TCustomControlFilterEdit.ForceFilter(AFilter: String): String; function TCustomControlFilterEdit.ForceFilter(AFilter: String): String;
// Apply a new filter immediately without waiting for idle. Returns the previous filter. // Apply a new filter immediately without waiting for idle. Returns the previous filter.
begin begin
Result := Filter; Result := FFilter;
if Result = AFilter then Exit; if fFilter <> AFilter then begin
Filter := AFilter; FFilter := AFilter;
ApplyFilter(True); ApplyFilter(True);
end;
end; end;
function TCustomControlFilterEdit.GetDefaultGlyphName: string; function TCustomControlFilterEdit.GetDefaultGlyphName: string;