-
Подскажите должен ли работать и всегда ли механизм Bookmark? После обновления данных не получается вернуться на исходную запись.
_bMark := cdsData.GetBookmark;
try
RefreshData;
try cdsData.GotoBookmark(_bMark); except end;
finally
cdsData.FreeBookmark(_bMark);
end;
-
> [0] Andrey_Pl (11.11.13 18:00) > всегда ли
Эту запись удалили
-
букмарки, это указатели, а указатели после пересоздания структуры будут указывать на то же самое в новой разве, что случайно... (например сформировали в той же области памяти и все данные неизменны).
-
> Inovet © (11.11.13 18:24) [1] нет не обязательно. Сохраняются изменения в базу. Но не обязательно именно эта запись будет редактируемой.
-
> sniknik © (11.11.13 18:31) [2] как вообще букмарки работают. какой механизм их действия? (и пытался найти инфу по этому но что то не нашел)?
-
как вообще букмарки работают. какой механизм их действия?
unit DB; TBookmark = Pointer;
т.е .Как работает указатель? Не работает он. В нем хранится адрес в памяти, по которому расположены данные. В нашем случае запись.
Механизм такой: Взять адрес памяти, по которому расположены данные, записать в переменную
есть же метод .GetBookmark ctrl+click на него, попадаешь в реализацию, смотришь что делается
еще метод .BookmarkValid() ctrl+click на него, попадаешь в реализацию, смотришь что делается
-
Кстати, вместо всего этого _bMark := cdsData.GetBookmark; try RefreshData; try cdsData.GotoBookmark(_bMark); except end; Писал как то свой CDS (TClientDataSet) Где GetBookmark; в приватную переменную запоминал значение из поля, которое Index для данного CDS А GotoBookmark соответственно делал Locate туда (или на первую подходящую, если таковых несколько) А если не было записи (удалена), то на предыдущую по индексу
-
А что первичного ключа нет?
-
> А что первичного ключа нет?
Обычно это Index Но бывает, что нет
-
заметил что при обновлении данных обновленная запись иногда меняет свою позицию в пришедшем наборе данных. Как я понял с этим и связана причина того что Bookmark не помогает (из [ВладОшин] © (12.11.13 08:31) [5]).
Наверно как вариант буду использовать Locate для возврата на исходную запись.
-
> [9] Andrey_Pl (12.11.13 17:55) > запись иногда меняет свою позицию в пришедшем наборе данных
Позиция определяется только order by, но ты ничего не сказал о БД.
-
> заметил что при обновлении данных обновленная запись иногда > меняет свою позицию в пришедшем наборе данных.
Ты пойми, тебе никто не гарантирует того, что твой набор данных не изменится. Если образно, то представь, что ты выписываешь газету "Вечерний гость". Вот ты вытащил её из почтового ящика. Есть ненулевая вероятность того, что там окажется точно такая же газета, как и вчера? Ну есть. В типографии могли ошибиться, почтальон был пьян и т.д. Но, скорее всего, она уже будет другая. А ты вчера не дочитал статью про птеродактиля, но помнишь, что она была на восьмой странице (это и есть наш Bookmark). Открываем на восьмой, а там - а вот чёрт его знает, что там. Прогноз погоды. ТВ-программа. List index out of bounds (сегодня "Вечерний гость" всего на 4-х страницах вышел). Но может и повезти и статья таки окажется про птеродактиля.
|