Показать сообщение отдельно
  #3  
Старый 17.05.2024, 08:06
VolgaLEG VolgaLEG вне форума
Прохожий
 
Регистрация: 16.05.2024
Сообщения: 18
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Вот код по событию 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;
Ответить с цитированием