Вот код по событию EnumFilterValues в gride на форме FormaERR
Код:
procedure TMailForm.dxDBGridArxivEnumFilterValues(Sender: TObject;
AColumn: TdxDBTreeListColumn;
var AValue: Variant;
var ADisplayText: string;
var ARepeatEnumeration: Boolean);
var
LookKey: string;
LookIndex: Integer;
begin
try // finally
if FilterValues = nil then
FilterValues := TStringList.Create;
if Node = nil then
Node := TdxDBGrid(Sender).TopVisibleNode;
// Далее появляется ошибка
if IsValueInFilter(FilterValues, Node.Strings[AColumn.Index]) then
begin
Node := TdxDBGrid(Sender).GetNextVisible(Node);
Exit;
end
else
FilterValues.Add(Node.Strings[AColumn.Index]);
ADisplayText := Node.Strings[AColumn.Index];
if TdxDBGrid(Sender).Columns[AColumn.Index].Field.FieldKind <> fkLookup then
AValue := Node.Values[AColumn.Index]
else
begin
LookKey := TdxDBGrid(Sender).ColumnByFieldName(AColumn.FieldName).Field.KeyFields;
LookIndex := TdxDBGrid(Sender).FindColumnByFieldName(LookKey).Index;
AValue := Node.Values[LookIndex];
end;
Node := TdxDBGrid(Sender).GetNextVisible(Node);
if Node = nil then
begin
FilterValues.Free;
FilterValues := nil;
ARepeatEnumeration := False;
end;
finally
Inc(FilterDropCount);
if FilterDropCount > 100 then
begin
FilterValues.Free;
FilterValues := nil;
Node := nil;
FilterDropCount := 0;
ARepeatEnumeration := False;
end;
end;
end;
Для сравнения, далее код из формы по событию EnumFilterValues, где все работает FormaOK (закрасил * не для общего обозрения)
Код:
procedure TMainForm.dxDBGrid_PersonEnumFilterValues(Sender: TObject;
AColumn: TdxDBTreeListColumn; var AValue: Variant;
var ADisplayText: string; var ARepeatEnumeration: Boolean);
var
LookKey: string;
LookIndex: Integer;
begin
try // finally
if FilterValues = nil then
FilterValues := TStringList.Create;
if Node = nil then
Node := TdxDBGrid(Sender).TopVisibleNode;
// Тут все проходит
if IsValueInFilter(FilterValues, Node.Strings[AColumn.Index]) then
begin
Node := TdxDBGrid(Sender).GetNextVisible(Node);
Exit;
end
else
FilterValues.Add(Node.Strings[AColumn.Index]);
ADisplayText := Node.Strings[AColumn.Index];
if TdxDBGrid(Sender).Columns[AColumn.Index].Field.FieldKind <> fkLookup then
AValue := Node.Values[AColumn.Index]
else
begin
LookKey := TdxDBGrid(Sender).ColumnByFieldName(AColumn.FieldName).Field.KeyFields;
LookIndex := TdxDBGrid(Sender).FindColumnByFieldName(LookKey).Index;
AValue := Node.Values[LookIndex];
end;
if AColumn.FieldName = 'LLP_PERSONS_RESULT' then
begin
if AValue = 'D' then
ADisplayText := 'Отработан';
if AValue = 'W' then
ADisplayText := 'Ожидание';
end;
if AColumn.FieldName = 'ISMAKET' then
begin
case AValue of
0: ADisplayText := 'Отсутствует';
1: ADisplayText := 'Фрагмент';
2: ADisplayText := 'Полный';
end;
end;
if AColumn.FieldName = 'SOURCE_OOPP' then
begin
case AValue of
0: ADisplayText := '';
1: ADisplayText := '**********';
end;
end;
if AColumn.FieldName = 'SOURCE_SZVK' then
begin
case AValue of
0: ADisplayText := '';
1: ADisplayText := '********';
end;
end;
if AColumn.FieldName = 'SOURCE_PENS' then
begin
case AValue of
0: ADisplayText := '';
1: ADisplayText := '*********';
end;
end;
if AColumn.FieldName = 'SOURCE_PTK' then
begin
case AValue of
0: ADisplayText := '';
1: ADisplayText := '******************';
end;
end;
if AColumn.FieldName = 'SOURCE_ZAGS' then
begin
case AValue of
0: ADisplayText := '';
1: ADisplayText := '*******************';
end;
end;
if AColumn.FieldName = 'SOURCE_MANUAL' then
begin
case AValue of
0: ADisplayText := '';
1: ADisplayText := 'Ручной ввод';
end;
end;
if AColumn.FieldName = 'SOURCE_CZN' then
begin
case AValue of
0: ADisplayText := '';
1: ADisplayText := '***************';
end;
end;
if AColumn.FieldName = 'CMN_SOURCE_DREG' then
begin
case AValue of
0: ADisplayText := '';
1: ADisplayText := 'Данные из другого региона';
end;
end;
if AColumn.FieldName = 'SOURCE_ASV' then
begin
if VarIsNull(AValue) then
AValue := 0;
case AValue of
0: ADisplayText := '';
1: ADisplayText := '********************';
end;
end;
Node := TdxDBGrid(Sender).GetNextVisible(Node);
if Node = nil then
begin
FilterValues.Free;
FilterValues := nil;
ARepeatEnumeration := False;
end;
CurColumn := AColumn.FieldName;
finally
Inc(FilterDropCount);
if FilterDropCount > MAX_DROP_COUNT then
begin
FilterValues.Free;
FilterValues := nil;
Node := nil;
FilterDropCount := 0;
ARepeatEnumeration := False;
end;
end;
end;
Пользовательская функция IsValueInFilter() (вот тут кажется и проблема)
Код:
function IsValueInFilter(FValues: TStringList; S: string): Boolean;
var
i: Integer;
res: Boolean;
begin
res := False;
for i := 0 to FValues.Count-1 do
begin
if FValues[i] = S then
begin
res := True;
Break;
end;
end;
Result := res;
end;