-
D2009 есть SimpleDataset и TreeView добавляю пункты в TreeView через AddChildObject( ..., ..., Dataset.GetBookmark() ) потом в другой процедуре обращаюсь if( not Dataset.BookmarkValid( Node.Data ) ) then Exit;
Dataset.GotoBookmark( Node.Data ); и меня что на проверке, что на переходе по закладке обматюкивает Invalid pointer operationчто не так, не пойму :(
-
есть 2 типа букмарков описанных в разных модулях, строки и указатель, у тебя где то путаница... найди "свой" и в описании задай тип с указанием модуля откуда тебе нужно.
-
в том и дело, у меня нет переменных типа букмарк а в treeview вообще Data: Pointer, так что при типе "строка" вообще не компилировалось бы описанная ошибка - runtime
-
> что не так, не пойму
Имхо, где-то портится память. Кода недостаточно, чтобы ответить точнее.
-
> описанная ошибка - runtime а что бывает если при добавлении Dataset пустой? или добавь туда nil для проверки. получишь туже ошибку тогда ищи как может сбиться значение.
но вообще нужен лог и записать значение при ошибке.
-
> а что бывает если + добавить пункт с букмарком на запись, а после наложить фильтр скрывающий эту запись? или вообще удалить запись? ++ у тебя делается перекрытие датасета? все букмарки становятся невалидными их нужно "обновлять" это учитывается? +++ чаще лучше/проще использовать значение ключа + локейт вместо букмарка.
-
> а что бывает если при добавлении Dataset пустой?
в данном случае он не пустой иначе не будет ничего в дерево добавляться, поскольку оно строится из данных датасета
> наложить фильтр скрывающий эту запись?
фильтра нет и не предполагается
> вообще удалить запись?
записи не удаляются (пока по крайней мере)
> у тебя делается переокрытие датасета?
нет
> все букмарки становятся невалидными их нужно "обновлять" это учитывается?
я знаю
> чаще лучше/проще использовать значение ключа + локейт вместо букмарка.
обычно так и делаю, но тут ключ композитный, поэтому его в Pointer не запихать
ситуация банальная просто как описано в первом посте: один датасет, одно дерево, одна процедура заполнения дерева из датасета, одна процедура обработки смены активного пункта дерева - всё! в этой последней пытаюсь перейти на нужную запись, чтоб прочитать из БД деталировку, но до чтения дело не доходит
-
> есть 2 типа букмарков описанных в разных модулях, строки и указатель
как видно из кода, в этой версии делфи уже всё разнесли, чтоб не путали
TBookmark = TBytes;
TBookmarkStr = AnsiString; ..
function GetBookmarkStr: TBookmarkStr; virtual; deprecated;
function GetBookmark: TBookmark; virtual;
-
А явное приведение типов не спасет ОРД?
-
явное приведение типов пробовал, фиолетово да и компилятор даже предупреждений не выдаёт, хотя в ранних версиях приходилось делать явное приведение
-
> в данном случае он не пустой пофигу что "в данном случае", варианты предлагал для поиска глюка. "что будет если..." получишь ту же ошибку будешь ближе к тому что происходит.
-
> добавь туда nil для проверки
Access violation at address ... in module midas.dll Read of address 00000010 ничего похожего на то, что выше да и неудивительно проверял в отладчике Node.Data - у каждого листа разные, но вполне вразумительные
-
может, подскажете, где скачать midas.dll 15.0.xxxx хочу проверить на другой версии вот только нагуглить не могу, везде ссылки на старье какое-то
-
протрассировал, вываливается на выходе (на end) из методов TCustomClientDataSet.BookmarkValid TDataSet.GotoBookmark при этом все строки методов проходят нормально, без ошибок Result в BookmarkValid устанавливается корректно в True
есть еще мысли?
|