Предлагаю доработку для StFilter. Когда выбраны "Все записи" и список вариантов неотфильтрован, то это по смыслу равно "Отчистить фильтр". Вместо этого грид собирает строку фильтра из всех вариантов и с тормозами её накладывает. Исправление
Код:
procedure TSTColumnFilterEh.UpdateFilterFromValuesCheckingState(ss: TStrings;
CheckStates: TBooleanDynArray);
var
FilterStr: String;
i,k: Integer;
DataOpType: TSTOperandTypeEh;
sv: String;
// IncludeCheckNull: Boolean;
bCheckVal, bCheckResult: Boolean;
begin
{SAMO}
if Length(CheckStates) > 0 then
begin
bCheckResult := False;
bCheckVal := CheckStates[0];
for i := Low(CheckStates) to High(CheckStates) do
begin
if bCheckVal <> CheckStates[i] then
begin
bCheckResult := True;
Break;
end;
end;
end;
FilterStr := '';
if bCheckResult then {SAMO}
begin
k := 0;
// IncludeCheckNull := False;
if (Column.Field <> nil)
then DataOpType := STFldTypeMapEh[Column.Field.DataType]
else DataOpType := botNon;
for i := 0 to Length(CheckStates)-1 do
begin
if (ss.Objects[i] is TCustomListboxItemEh) and TCustomListboxItemEh(ss.Objects[i]).IsDataItem then
if CheckStates[i] = True then
begin
sv := StringReplace(ss[i], '''', '''''',[rfReplaceAll]);
if FilterStr <> '' then FilterStr := FilterStr + ',';
if (DataOpType in [botNumber, botDateTime, botBoolean]) and (sv = '') then
FilterStr := FilterStr + 'Null'
else
FilterStr := FilterStr + '''' + sv + '''';
Inc(k);
end;
end;
if FilterStr <> '' then
if k = 1
then FilterStr := '=' + FilterStr
else FilterStr := 'in (' + FilterStr + ')';
{ if IncludeCheckNull then
if FilterStr = ''
then FilterStr := '=Null'
else FilterStr := FilterStr + ' OR =Null ';}
end;
InternalSetExpressionStr(FilterStr);
if (Column.Grid.FilterEdit <> nil) and Column.Grid.FilterEdit.Visible then
Column.Grid.FilterEdit.Text := FilterStr;
if Column.Grid.STFilter.InstantApply then
Column.Grid.SetDataFilter;
end;