Как запретить скроллинг в DBGrid?
Раз уж не работает, так и ну его на фиг. Замучился уже получать тумаки от юзеров.
/*Навеяно одним из предыдущих сабжей*/
Как запретить скроллинг мыши в DBGrid?
Раз уж не работает, так и ну его на фиг. Замучился уже получать тумаки от юзеров.
/*Навеяно одним из предыдущих сабжей*/
Или наследовать собственный компонент от TDBGrid, перекрыв у него обработчик WM_MOUSEWHEEL, или устанавливать хук на каждый грид и перекрывать в нем обработку того же самого события.
Раз уж не работает, так и ну его на фиг.
Блин, давно уже не пользовался стандартным DBGrid'ом. Не могу даже представить, что кто-то еще им до сих пор пользуется.
Аж интересно стало, как же там происходит? Запустил борландову демку, проверил. Действительно, самый что ни на есть неприятный глюк имеет место быть.
ВЫКИНЬТЕ СТАНДАРТНЫЙ DBGRID НА ФИГ!!!
Есть прекрасный компонент - DBGridEh, покрывающий большинство проблем, возникающих перед программистами в процессе решения боевых задач.
Аж интересно стало, как же там происходит? Запустил борландову демку, проверил. Действительно, самый что ни на есть неприятный глюк имеет место быть.
А объясните мне тупому в чем глюк-то, надо что курсор менять когда юзер будет туда-сюда по сетке елозить?
Блин, давно уже не пользовался стандартным DBGrid'ом. Не могу даже представить, что кто-то еще им до сих пор пользуется.
Я хотел начать пользоваться.
DBGrid - по моему оптимал немного кода и можно сделать все что хочешь.
Есть некая фобия по отношению к хорошим сторонним компонентам.
А объясните мне тупому в чем глюк-то, надо что курсор менять когда юзер будет туда-сюда по сетке елозить?
Если отображается индикатор, то видно, что при скроллинге мышью перемещается только прямоугольник выделения, а курсор базы данных (RecNo, если угодно) стоит без движения. К тому же, выделение перемещается только в пределах видимых на экране записей. С одной стороны это и понятно - полноценного-то скроллинга нет. А с другой стороны - на фига такой скроллинг, если от него только проблемы?
Я-то даже и не обращал внимания, что стандартный грид так глупо поступает. DBGridEh работает намного более логично: курор набора данных перемещается вместе с выделением, и само выделение не ограничено областью видимых данных.
У тебя вот фобия, а у меня - война сторонним компонентам. Но есть два исключения: ODAC и DBGridEh. С последним забываешь проблемы отображения данных, вроде использования многострочных заголовков с объединением ячеек, написания собственной отрисовки (выделения шрифтом или цветом отдельных ячеек или строк) и т. п.
Не сочтите за рекламу.
...
protected
function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; override;
function DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; override;
...
end;
function TCustomGrid.DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean;
begin
Result := inherited DoMouseWheelDown(Shift, MousePos);
if not Result then
begin
if Row < RowCount - 1 then Row := Row + 1;
Result := True;
end;
end;
function TCustomGrid.DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean;
begin
Result := inherited DoMouseWheelUp(Shift, MousePos);
if not Result then
begin
if Row > FixedRows then Row := Row - 1;
Result := True;
end;
end;
Как видно, в классе TCustomGrid они просто увеличивают/уменьшают номер строки. Соответственно в этих методах в DBGrid'e необходимо еще смещать курсор НД в нужном направлении. Кому не геморно этим занятся - прошу :)
Запретить скроллинг можно так. Необходимо определить собственный обработчик событий DBGrid'a. Сделать это достаточно просто. Необходимо повесить на свойство WindowProc (тип TWndMethod) DBGrid'a свою собственную процедуру. А в ней давить сообщение CM_MOUSEWHEEL.
Если отображается индикатор, то видно, что при скроллинге мышью перемещается только прямоугольник выделения, а курсор базы данных (RecNo, если угодно) стоит без движения. К тому же, выделение перемещается только в пределах видимых на экране записей. С одной стороны это и понятно - полноценного-то скроллинга нет. А с другой стороны - на фига такой скроллинг, если от него только проблемы?
Я-то даже и не обращал внимания, что стандартный грид так глупо поступает. DBGridEh работает намного более логично: курор набора данных перемещается вместе с выделением, и само выделение не ограничено областью видимых данных.
Ладно вроде убедил. Думаю если заглянуть в исходники DBGridEh, то после этого у тебя к проекту с DBGrid добавится максимум пару строк и эффект будет тотже.
... использования многострочных заголовков с объединением ячеек, написания собственной отрисовки (выделения шрифтом или цветом отдельных ячеек или строк) и т. п. Не сочтите за рекламу.
Такое Я сочту за Д/с №6(подготовительная группа):).
Давным давно все уже сделано
...
protected:
DYNAMIC bool __fastcall DoMouseWheelUp (TShiftState Shift, const Windows::TPoint& MousePos);
DYNAMIC bool __fastcall DoMouseWheelDown (TShiftState Shift, const Windows::TPoint& MousePos);
...
bool __fastcall TDBGridM:: DoMouseWheelUp (TShiftState Shift, const Windows::TPoint& MousePos)
{
if (!DataLink || !DataLink->Active) return true;
TDataSet *ds = DataSource->DataSet;
if (ds->State == dsBrowse) ds->Prior();
return true;
}
//---------------------------------------------------------------------------
bool __fastcall TDBGridM:: DoMouseWheelDown (TShiftState Shift, const Windows::TPoint& MousePos)
{
if (!DataLink || !DataLink->Active) return true;
TDataSet *ds = DataSource->DataSet;
if (ds->State == dsBrowse) ds->Next();
return true;
}
Ладно вроде убедил. Думаю если заглянуть в исходники DBGridEh, то после этого у тебя к проекту с DBGrid добавится максимум пару строк и эффект будет тотже.
А вот ты не убедил. ;)
Зачем заглядывать в исходники DBGridEh, вместо того, чтобы использовать непосредственно его?
Правда, иногда в DBGridEh тоже попадаются баги, и в исходники приходится не только заглядывать, но еще и исправлять.
Такое Я сочту за Д/с №6(подготовительная группа):).
Зря ты так. Подобных мелочей - огромное кол-во. И в итоге получился действительно очень удобный грид. Самое главное, что мне понравилось - это "поддержка": когда-то (еще во 2-ой версии - до 3-ей что-то руки так и не дошли) я сообщил автору об одном баге - он отозвался моментально и очень корректно (в тот же день прислал правильный код и разъяснения к нему).
Или наследовать собственный компонент от TDBGrid, перекрыв у него обработчик WM_MOUSEWHEEL, или устанавливать хук на каждый грид и перекрывать в нем обработку того же самого события.
Freeman, можно примерный код.
Да, чуть не забыл. Собственно по теме...
Запретить скроллинг можно так. Необходимо определить собственный обработчик событий DBGrid'a. Сделать это достаточно просто. Необходимо повесить на свойство WindowProc (тип TWndMethod) DBGrid'a свою собственную процедуру. А в ней давить сообщение CM_MOUSEWHEEL.
makbeth, та же самая просьба.