не работает GotoBookmark() в Лазаре

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
racotr
новенький
Сообщения: 14
Зарегистрирован: 18.12.2009 23:32:56
Откуда: Braneapol

не работает GotoBookmark() в Лазаре

Сообщение racotr »

Здравствуйте ещё раз. Кто-нибудь может быть встречался с такой проблемой:

Хочу запомнить запись на которой находился в текущем Query.
В дельфе был метод

Код: Выделить всё

var bm : TBookmark; //переменная указатель на закладку
...
bm := Query1.GetBookmark; //Берём закладку в память
Query1.First; //Делаем разные действия с запросм Query1, например, переходим на 1-ю строку
Query1.GotoBookmark(bm); //возвращаемся на запомненное место
Query1.FreeBookMark(bm); //освобождаем память

В Дельфе 6 это работало на ура. В лазаре есть такая технология, код собирается нормально. Но на строке Query1.GotoBookmark(bm) в процессе работы программы возникает ошибка Project name_project exception class 'External: SIGSEGV'. Что не так с этим классом? И как с этим бороться?

Спасибо за любые советы!
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Проблема в самом Query1 - что используеш?
racotr
новенький
Сообщения: 14
Зарегистрирован: 18.12.2009 23:32:56
Откуда: Braneapol

Сообщение racotr »

alexs писал(а):Проблема в самом Query1 - что используеш?



Как понять, что использую? Использую компонент TSQLQuery, если Вы про это.
Аватара пользователя
WAYFARER
энтузиаст
Сообщения: 564
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Сообщение WAYFARER »

У меня все работает. Только что попробовал. Подобную ошибку выдало только когда я попробовал перейти к закладке уже уничтожив её. А попробуйте не уничтожать закладку?
racotr
новенький
Сообщения: 14
Зарегистрирован: 18.12.2009 23:32:56
Откуда: Braneapol

Сообщение racotr »

Очень странно, щас попробовал тот же код - всё работает. Магия какая-то...
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 836
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

Можно я не буду плодить темы?

Есть вот такой код. Используется BufDataSet и RXDBGrid. Для сортировки из Wiki взята функция SortBufDataSet();
Проблема в ошибках на строке bdsInputStream.GotoBookmark(dbBookmark);
Один раз нажимаю, кликаю во все можно и все нормально, в другой - облом падаем. Когда вызывают карточку просмотра записи, и закрываю ее, то обычно валится стабильно.
Но никакой работы с bdsInputStream по изменению там не ведется. Только считывание текущей записи.
Отслеживание приходит на procedure TCustomBufDataset.CurrentRecordToBuffer(Buffer: TRecordBuffer);
Может я не правильно порядок работы команд выставил?

Код: Выделить всё

bIsBookmark:=bdsInputStream.Active;

               if bIsBookmark then
               begin
                 dbBookmark:=bdsInputStream.GetBookmark;
               end;

               bdsInputStream.DisableControls;
               bdsInputStream.Active:=False;
               bdsInputStream.Clear;
               bdsInputStream.ClearIndexes;
               bdsInputStream.IndexName:='';
               try
                  AMS.Position:=0;
                  bdsInputStream.LoadFromStream(AMS);
    
                  if bIsBookmark then
                  begin
                      if bdsInputStream.BookmarkValid(dbBookmark) then
                         bdsInputStream.GotoBookmark(dbBookmark);
                  end;

                  if FSortField<>'' then
                  begin
                      SortBufDataSet(bdsInputStream, FSortField);
                      if FSortDescending then
                      SortBufDataSet(bdsInputStream, FSortField);
                  end;

               finally
                  if bIsBookmark then
                     bdsInputStream.FreeBookmark(dbBookmark);
                  bdsInputStream.EnableControls;
               end;
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

Сталкивался с нестабильной работой перехода к закладке.
То работает, то нет. Закономерности не уловил.
Перестал пользоваться и делаю всегда Locate
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Закладки используют внутри открытого датасета - после взятия закладки не надо датасет закрывать
Сама закладка - это чёрный ящик. Внутренняя реализация зависит от конкретного набора данных. Но даже если она является элементарно индексом в массиве со строками данных - то после переоткрытия индекс может быть за пределами массива выбранных строк. И даже если кол-во строк совпадёт - не вариант что требуемая строка будет содержать ожидаемые данные.
При необхдимости переоткрытия запроса - правильный метод - поиска строки по ключу
Аватара пользователя
Sharfik
энтузиаст
Сообщения: 836
Зарегистрирован: 20.07.2013 01:04:30

Сообщение Sharfik »

alexs писал(а):Закладки используют внутри открытого датасета - после взятия закладки не надо датасет закрывать
Сама закладка - это чёрный ящик. Внутренняя реализация зависит от конкретного набора данных. Но даже если она является элементарно индексом в массиве со строками данных - то после переоткрытия индекс может быть за пределами массива выбранных строк. И даже если кол-во строк совпадёт - не вариант что требуемая строка будет содержать ожидаемые данные.
При необхдимости переоткрытия запроса - правильный метод - поиска строки по ключу
Во! Спасибо, всеобъмлюще и понятно.
Ответить