Как в DBGrid поместить активную запись, допустим, по центру?
Как в DBGrid поместить активную запись, допустим, по центру?
Здравствуйте.
Для сортировки в приложении использую динамический запрос. После выполнения SQL запроса и позиционировании методом Locate активной записи, сама активная строчка может оказаться в произвольном месте в DBGrid, что, мне кажется, не очень приятно.
Отсюда вопрос: можно ли, и каким образом можно сдвинуть "окно просмотра DBGrid'а" относительно всего списка? Спасибо.
Для сортировки в приложении использую динамический запрос. После выполнения SQL запроса и позиционировании методом Locate активной записи, сама активная строчка может оказаться в произвольном месте в DBGrid, что, мне кажется, не очень приятно.
Отсюда вопрос: можно ли, и каким образом можно сдвинуть "окно просмотра DBGrid'а" относительно всего списка? Спасибо.
kdv
Ммм... А DBGrid у Builder'а 6 нормальный? А то ни свойств, ни методов решающих данную задачу я не углядел. Вот и вопрос - может оно все-таки есть, но не вижу, либо его нет - и как можно выйти из ситуации?
PS: Решение вида - прокрутить перемещение "курсора" к ближнему краю, а потом вернуть на исходную запись выглядит не очень хорошим.
Ммм... А DBGrid у Builder'а 6 нормальный? А то ни свойств, ни методов решающих данную задачу я не углядел. Вот и вопрос - может оно все-таки есть, но не вижу, либо его нет - и как можно выйти из ситуации?
PS: Решение вида - прокрутить перемещение "курсора" к ближнему краю, а потом вернуть на исходную запись выглядит не очень хорошим.
Позиция курсора не изменяется, если перед обновлением делать DisableControls, а после EnableControls (в FIB+ еще DisableScrollEvents и EnableScrollEvents).
А вообще я бы посоветовал не заморачиваться подобной ситуацией.
Если бы после обновления курсор перемещался на первую запись - тогда да, это нехорошо. А так...
А вообще я бы посоветовал не заморачиваться подобной ситуацией.
Если бы после обновления курсор перемещался на первую запись - тогда да, это нехорошо. А так...
hvlad, почти с вами согласен, только мне кажется, что этот метод не работает (иногда неправильно работает). Приведу пример. Напомню, при нажатии на Title формируется новый запрос и далее в нем есть следующее:hvlad писал(а):TDataSet.Resync([rmCenter])
Код: Выделить всё
//запоминаем 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 не чувствует границ в списке записей.
Нужно вызывать Resync только если после открытия DataSet и позиционирования на искомую строчку, у нас не происходил сдвиг "окна" DBGrid относительно всех записей. Но как узнать это?
PS: Buider 6