![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
Она всегда показывала данные при корректных условиях поиска...по дате или району
|