Как в DBGrid поместить активную запись, допустим, по центру?

Вопросы стыковки визуальных компонент (DataControls, EhGrid, VirtualTreeView, DevExpress и т.п.) с данными из БД.

Модераторы: kdv, CyberMax

Ответить
Шмель
Сообщения: 17
Зарегистрирован: 11 май 2006, 20:48

Как в DBGrid поместить активную запись, допустим, по центру?

Сообщение Шмель » 30 ноя 2006, 14:41

Здравствуйте.
Для сортировки в приложении использую динамический запрос. После выполнения SQL запроса и позиционировании методом Locate активной записи, сама активная строчка может оказаться в произвольном месте в DBGrid, что, мне кажется, не очень приятно.
Отсюда вопрос: можно ли, и каким образом можно сдвинуть "окно просмотра DBGrid'а" относительно всего списка? Спасибо.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 30 ноя 2006, 16:52

в нормальных гридах есть "центрирование" по текущей записи. Ищи соотв. свойство, но его в твоем используемом гриде может и не быть.

Шмель
Сообщения: 17
Зарегистрирован: 11 май 2006, 20:48

Сообщение Шмель » 01 дек 2006, 07:05

kdv
Ммм... А DBGrid у Builder'а 6 нормальный? А то ни свойств, ни методов решающих данную задачу я не углядел. Вот и вопрос - может оно все-таки есть, но не вижу, либо его нет - и как можно выйти из ситуации?
PS: Решение вида - прокрутить перемещение "курсора" к ближнему краю, а потом вернуть на исходную запись выглядит не очень хорошим.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 01 дек 2006, 07:55

Позиция курсора не изменяется, если перед обновлением делать DisableControls, а после EnableControls (в FIB+ еще DisableScrollEvents и EnableScrollEvents).
А вообще я бы посоветовал не заморачиваться подобной ситуацией.
Если бы после обновления курсор перемещался на первую запись - тогда да, это нехорошо. А так...

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 01 дек 2006, 09:32

под нормальными гридами я имел в виду те, которые являются альтернативными, и не входят в поставку.

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Сообщение hvlad » 01 дек 2006, 10:29

TDataSet.Resync([rmCenter])

Шмель
Сообщения: 17
Зарегистрирован: 11 май 2006, 20:48

Сообщение Шмель » 15 дек 2006, 11:49

hvlad писал(а):TDataSet.Resync([rmCenter])
hvlad, почти с вами согласен, только мне кажется, что этот метод не работает (иногда неправильно работает). Приведу пример. Напомню, при нажатии на Title формируется новый запрос и далее в нем есть следующее:

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

//запоминаем ID активной строчки, чтобы после сортировки сделать её снова активной
CurrentIDNum =DataSet1->FieldByName("ID")->AsInteger;
//Закрываем DataSet, меняем запрос, открываем
DataSet1->Active = false;
DataSet1->SelectSQL->Clear();
DataSet1->SelectSQL->Add(SQLRequest);
DataSet1->Active = true;
//запрашиваем все записи, чтобы знать количество строк в базе и полоса скроллинга была правильной.
DataSet1->FetchAll();
ShowRecordCount = DataModule1->DataSet1->RecordCount;

//Позиционируемся на той-же записи, что была активна
DataModule1->DataSet1->Locate("ID", Variant(CurrentIDNum), LocateOpt);

//Установим параметрдля Resync - пусть активная запись устанавливается в середине DBGrid'а
resyncparam << rmCenter;
//До сих пор работало верно, далее иногда сбой
// Сейчас активная запись одна
DataModule1->DataSet1->Resync(resyncparam);
//После может быть другая.
Вроде как отловил эту ситуацию. Активность переходит к другой строчке в случае, если эта строчка (активная) после Resync'а должна появиться в числе первых N строк которые получаем из DataSet после отрытия (где N это количество строк в показываемых DBGrid), причем активной строчкой, да еще и в середине DBGrid устанавливается последняя из описаных выше видимых строк.
Похоже на то, что Resync не чувствует границ в списке записей.

Нужно вызывать Resync только если после открытия DataSet и позиционирования на искомую строчку, у нас не происходил сдвиг "окна" DBGrid относительно всех записей. Но как узнать это?

PS: Buider 6

Ответить