|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
|||
|
|||
Нашел, где описываются переменные.
Есть еще unit uVariables Вот там и описываются. Привожу выдержку Код:
var FilterDropCount: Integer=0; Node: TdxTreeListNode; Filtervalues:TStringList; |
#17
|
|||
|
|||
Нашел где описываются переменные.
В unit uValues- описание глобальных переменных. Код:
var FilterDropCount: Integer=0; Node:TdxtreelistNode; FilterValues:TStringList; Инициализации Node и Filtevalues там нет. |
#18
|
|||
|
|||
Цитата:
Так, а вот это вообще-то не есть гуд. По сути, у тебя список полей в разных формах разный, а переменная используется одна и та же. Кстати, а какие опции компилятора у тебя выставлены. Конкретно интересует галка на проверку границ массива. А то есть предположение, что у тебя на самом деле происходит ошибка OutOfBounds когда ты обращаешься к Node по индексу, но так как проверка не включена, то падает AV. Цитата:
Я бы для начала попробовал бы в секции initialization этого модуля поставить обеим переменным значение Nil. Потом я бы попробовал использовать локальные переменные внутри формы вместо глобальных. Как я понял по именам форм, та форма, где все ОК есть главная форма приложения. А вторая - дополнительная. Ну так попробуй использовать в доп. форме свои переменные (вообще сделай их членами класса и обращайся к ним через Self.xxx). |
#19
|
|||
|
|||
Отвечаю по порядку.
Настройки Runtime erros Range checking (галка стоит, я и отключал и включал – не влияет) I/O checking Overflow checking Стоят все галки А в Code generation с optimization я снял, а на Stack frames стоит 2.В секции initialization, где описываются значение nil присвоил – ошибка та же. Оставил, хуже не будет. |
#20
|
|||
|
|||
ОК, давай разбираться дальше.
Для начала надо найти на каком объекте код крашится. Вот добавил пару строчек в код: Код:
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
|
|||
|
|||
Код:
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
|
|||
|
|||
Ага, просто функция, значит тут проблем быть не должно.
Ну давай смотреть какой из обхектов гадит... |
#23
|
|||
|
|||
Сделал скрины при отладке и собрал в одном файле пароль тот же
|
#24
|
|||
|
|||
По отладке до функции дело и не доходит
|
#25
|
|||
|
|||
Ну, с ошибкой синтаксиса понятно, я ж не помню точно какая там структура объекта, это надо в DevExpress лезть. По сути, там надо было просто получить кол-во элементов в св-ве Strigs объекта Node, просто проверяем что объект существует и доступен. Попробуй просто Node.Count (посмотри по подсказке, может св-во нвзывается ItemCount или как-то еще). Но это не важно, см дальше.
Собственно, если посмотришь на 10й (вроде) скрин, то ответ там уже есть. Код Код:
if Node = nil then Node := TdxDBGrid(Sender).TopVisibleNode; Теперь вопрос - почему. В чем разница настройки гридов или компонентов доступа к БД, что в одном случае вызов 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
|
|||
|
|||
БОЛЬШОЕ СПАСИБО!!!!!!! В этом случае все работает. Пойду посмотрю на дата сет.
|
#27
|
|||
|
|||
Ну хорошо, если работает.
Но костыль он и есть костыль. Все же я бы попытался разобраться почему в одной форме работает, а в другой - нет. |
#28
|
|||
|
|||
Для начала хорошо бы прочитать документацию на компонент, но я не нашел...очень древний. А так то надо...для общей эрудиции
|
#29
|
|||
|
|||
Доку искать на сайте DevExpress'а надо. Причем тебе нужна именно та, которая VCL.
У меня стоят эти компоненты, но никакой справки там нет, только примеры какие-то. Скорее всего, там будет что-то связанное с тем, что при пустом дата-сете не создаются поля. Возможно где-то в настройках компонента надо порыться, а может быть другая ситуация. А попробуй ка вывести значения: - dxPageControlMail.ActivePageIndex - это целое число - dxBarDBNavigator1.DataSource - тут указатель, нас интересует Nil там или нет в момент заполнения фильтра (собственно, перед получением Node) А вообще, эта проблемная форма когда-ниь показывает какие-нить записи? |
#30
|
|||
|
|||
Она всегда показывала данные при корректных условиях поиска...по дате или району
|