Позиция курсора в DBGrid

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

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

Ответить
Аватара пользователя
donpadlo
новенький
Сообщения: 58
Зарегистрирован: 18.08.2011 09:14:53

Позиция курсора в DBGrid

Сообщение donpadlo »

Есть некая таблица, отображаемая в DBgrid. Происходит некое действо, ну скажем удаление одной записи из этой таблицы. Делаем Refresh. Нужно вернуть курсор туда где был, с учетом того что позиции на которой он стоял уже может и не быть. Важно! В SQLQuery1 используются фильтры, поэтому SQLQuery1.recno и SQLQuery1.recordcount использовать нельзя.

//некий код
//некий код
//некий код
//здесь както запоминаем позицию
orgtehniks.SQLQuery1.Refresh;
//здесь позицию курсора должны поставить на место. Причем с учетом того что записи на которой он стоял уже может и не быть, поэтому ставить нужно не на конкретную запись, а именно в номер строки

Вопрос как это реализовать...
alexkam
постоялец
Сообщения: 152
Зарегистрирован: 07.09.2009 20:03:59

Сообщение alexkam »

Например так:
SQLQuery.Locate('ID', SQLQuery.FieldByName('ID').AsInteger, [loPartialKey]);
Аватара пользователя
donpadlo
новенький
Сообщения: 58
Зарегистрирован: 18.08.2011 09:14:53

Сообщение donpadlo »

Дык я и грю, этой записи на которой стояли уже может и не быть
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

Если записи уже нет в выборке, то уже без разницы куда позиционировать курсор, имхо
Аватара пользователя
donpadlo
новенький
Сообщения: 58
Зарегистрирован: 18.08.2011 09:14:53

Сообщение donpadlo »

Почему без разницы? Нужно к ближайшему от удаленного. Представь пользователь листает DBGrid на несколько страниц... Удалил запись. И все снова листать к тому же месту?
Аватара пользователя
stikriz
энтузиаст
Сообщения: 612
Зарегистрирован: 15.03.2006 08:37:47

Сообщение stikriz »

У датасетов есть у каждой строки номер RecNo. Вот, по нему и надо ориентироваться.
Аватара пользователя
donpadlo
новенький
Сообщения: 58
Зарегистрирован: 18.08.2011 09:14:53

Сообщение donpadlo »

Он верно работает если не используются фильтры в SQLQuery. А если используются, то иногда может возникать ситуация что если удалена текущая запись, то RecNo - уже не под текущим фильтром.
Аватара пользователя
stikriz
энтузиаст
Сообщения: 612
Зарегистрирован: 15.03.2006 08:37:47

Сообщение stikriz »

donpadlo писал(а):иногда может возникать ситуация что если удалена текущая запись, то RecNo - уже не под текущим фильтром.

И что тогда произойдет? Куда встанет курсор?

Добавлено спустя 15 минут 48 секунд:
Вот тут
http://www.stikriz.narod.ru/art/dataset2.htm
Есть исходники датасета, правда, для дельфи.
Если указать несуществующий RecNo, то курсор встанет на ближайшую строчку выше с учетом фильтрации. За это отвечает метод GetRecord.
Если в Ваших датасетах это не так, то это бага. Заметьте, что грида испорльзует RecNo. И когда она удаляет, то точно так же происходит - она пытается встать на тот же RecNo или выше. Ничто не мешает запомнить RecNo, переотрыть датасет и присвоить тот же самый RecNo.
Ответить