Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 28.05.2024, 16:01
VolgaLEG VolgaLEG вне форума
Прохожий
 
Регистрация: 16.05.2024
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Нашел, где описываются переменные.

Есть еще unit uVariables

Вот там и описываются.

Привожу выдержку
Код:
var
FilterDropCount: Integer=0;
Node: TdxTreeListNode;
Filtervalues:TStringList;
Ответить с цитированием
  #17  
Старый 28.05.2024, 16:09
VolgaLEG VolgaLEG вне форума
Прохожий
 
Регистрация: 16.05.2024
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Нашел где описываются переменные.

В unit uValues- описание глобальных переменных.

Код:
var
FilterDropCount: Integer=0;
Node:TdxtreelistNode;
FilterValues:TStringList;

Инициализации Node и Filtevalues там нет.
Ответить с цитированием
  #18  
Старый 28.05.2024, 18:51
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,034
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от VolgaLEG
Сейчас сделаю архив работающей формы. пароль тот же Она первая и запускается и весит параллельно (разные окна)

Так, а вот это вообще-то не есть гуд. По сути, у тебя список полей в разных формах разный, а переменная используется одна и та же.
Кстати, а какие опции компилятора у тебя выставлены. Конкретно интересует галка на проверку границ массива. А то есть предположение, что у тебя на самом деле происходит ошибка OutOfBounds когда ты обращаешься к Node по индексу, но так как проверка не включена, то падает AV.

Цитата:
Сообщение от VolgaLEG
Нашел где описываются переменные.
В unit uValues- описание глобальных переменных.

Я бы для начала попробовал бы в секции initialization этого модуля поставить обеим переменным значение Nil.

Потом я бы попробовал использовать локальные переменные внутри формы вместо глобальных. Как я понял по именам форм, та форма, где все ОК есть главная форма приложения. А вторая - дополнительная. Ну так попробуй использовать в доп. форме свои переменные (вообще сделай их членами класса и обращайся к ним через Self.xxx).
Ответить с цитированием
  #19  
Старый 29.05.2024, 14:52
VolgaLEG VolgaLEG вне форума
Прохожий
 
Регистрация: 16.05.2024
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Отвечаю по порядку.
Настройки Runtime erros
Range checking (галка стоит, я и отключал и включал – не влияет)
I/O checking
Overflow checking
Стоят все галки
А в Code generation с optimization я снял, а на Stack frames стоит
2.В секции initialization, где описываются значение nil присвоил – ошибка та же. Оставил, хуже не будет.
Ответить с цитированием
  #20  
Старый 30.05.2024, 03:01
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,034
Версия 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()? Это метод класса или просто функция?
Ответить с цитированием
  #21  
Старый 30.05.2024, 09:02
VolgaLEG VolgaLEG вне форума
Прохожий
 
Регистрация: 16.05.2024
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Код:
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;

Это пользовательская функция. В проекте есть модуль, там собраны много пользовательских функций и процедур. Вы мне даже приводили постами выше как ее улучшить.

Сейчас пойду внесу в код Ваше предложение .... посмотрим что покажет
Ответить с цитированием
  #22  
Старый 30.05.2024, 12:58
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,034
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ага, просто функция, значит тут проблем быть не должно.
Ну давай смотреть какой из обхектов гадит...
Ответить с цитированием
  #23  
Старый 30.05.2024, 17:00
VolgaLEG VolgaLEG вне форума
Прохожий
 
Регистрация: 16.05.2024
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Сделал скрины при отладке и собрал в одном файле пароль тот же
Вложения
Тип файла: zip скрины отладки.zip (2.40 Мбайт, 1 просмотров)
Ответить с цитированием
  #24  
Старый 30.05.2024, 17:01
VolgaLEG VolgaLEG вне форума
Прохожий
 
Регистрация: 16.05.2024
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

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

Ну, с ошибкой синтаксиса понятно, я ж не помню точно какая там структура объекта, это надо в DevExpress лезть. По сути, там надо было просто получить кол-во элементов в св-ве Strigs объекта Node, просто проверяем что объект существует и доступен. Попробуй просто Node.Count (посмотри по подсказке, может св-во нвзывается ItemCount или как-то еще). Но это не важно, см дальше.

Собственно, если посмотришь на 10й (вроде) скрин, то ответ там уже есть. Код
Код:
        if Node = nil then
            Node := TdxDBGrid(Sender).TopVisibleNode;
Уже выполнился, а вот в переменной Node значение все-равно Nil.
Теперь вопрос - почему. В чем разница настройки гридов или компонентов доступа к БД, что в одном случае вызов TopVisibleNode что-то возвращает, а во втором случае - нет.

В принципе, можно сделать маленькую заглушку. Как я понимаю, данный код заполняет фильтр. А если нет данных, то и фильтровать нечего. Так что после получения Node просто проверяем еще раз на Nil и выходим. Как-то так:
Код:
        if Node = nil then
          begin
             Node := TdxDBGrid(Sender).TopVisibleNode;
             if Node = nil then exit;
          end;
Возможно, будет работать.

Последний раз редактировалось lmikle, 30.05.2024 в 19:22.
Ответить с цитированием
  #26  
Старый Вчера, 07:35
VolgaLEG VolgaLEG вне форума
Прохожий
 
Регистрация: 16.05.2024
Сообщения: 16
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

БОЛЬШОЕ СПАСИБО!!!!!!! В этом случае все работает. Пойду посмотрю на дата сет.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:42.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter