Показать сообщение отдельно
  #20  
Старый 30.05.2024, 03:01
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

ОК, давай разбираться дальше.
Для начала надо найти на каком объекте код крашится.
Вот добавил пару строчек в код:
Код:
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;

        ShowMessage('Content of FilterValues:'#13#10 + FilterValues.Text);
        ShowMessage(Format('Node count (%d) and field index (%d).',[Node.Strings.Count,AColumn.Index]));

// Далее появляется ошибка
        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;

Запускай, посмотрим какой из объектов битый.

ЗЫ. А, кстати, где описана IsValueInFilter()? Это метод класса или просто функция?
Ответить с цитированием