Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как запретить скроллинг в DBGrid?

2.2K
29 марта 2005 года
Dani
51 / / 22.09.2004
Как запретить скроллинг мыши в DBGrid?
Раз уж не работает, так и ну его на фиг. Замучился уже получать тумаки от юзеров.
/*Навеяно одним из предыдущих сабжей*/
10
29 марта 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by Dani
Как запретить скроллинг мыши в DBGrid?
Раз уж не работает, так и ну его на фиг. Замучился уже получать тумаки от юзеров.
/*Навеяно одним из предыдущих сабжей*/


Или наследовать собственный компонент от TDBGrid, перекрыв у него обработчик WM_MOUSEWHEEL, или устанавливать хук на каждый грид и перекрывать в нем обработку того же самого события.

10
29 марта 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by Dani
Раз уж не работает, так и ну его на фиг.


Блин, давно уже не пользовался стандартным DBGrid'ом. Не могу даже представить, что кто-то еще им до сих пор пользуется.

Аж интересно стало, как же там происходит? Запустил борландову демку, проверил. Действительно, самый что ни на есть неприятный глюк имеет место быть.

ВЫКИНЬТЕ СТАНДАРТНЫЙ DBGRID НА ФИГ!!!

Есть прекрасный компонент - DBGridEh, покрывающий большинство проблем, возникающих перед программистами в процессе решения боевых задач.

246
29 марта 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by smartsoft

Аж интересно стало, как же там происходит? Запустил борландову демку, проверил. Действительно, самый что ни на есть неприятный глюк имеет место быть.


А объясните мне тупому в чем глюк-то, надо что курсор менять когда юзер будет туда-сюда по сетке елозить?

Цитата:
Originally posted by smartsoft
Блин, давно уже не пользовался стандартным DBGrid'ом. Не могу даже представить, что кто-то еще им до сих пор пользуется.


Я хотел начать пользоваться.
DBGrid - по моему оптимал немного кода и можно сделать все что хочешь.
Есть некая фобия по отношению к хорошим сторонним компонентам.

10
29 марта 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by GIZMO
А объясните мне тупому в чем глюк-то, надо что курсор менять когда юзер будет туда-сюда по сетке елозить?


Если отображается индикатор, то видно, что при скроллинге мышью перемещается только прямоугольник выделения, а курсор базы данных (RecNo, если угодно) стоит без движения. К тому же, выделение перемещается только в пределах видимых на экране записей. С одной стороны это и понятно - полноценного-то скроллинга нет. А с другой стороны - на фига такой скроллинг, если от него только проблемы?

Я-то даже и не обращал внимания, что стандартный грид так глупо поступает. DBGridEh работает намного более логично: курор набора данных перемещается вместе с выделением, и само выделение не ограничено областью видимых данных.

Цитата:
Есть некая фобия по отношению к хорошим сторонним компонентам.


У тебя вот фобия, а у меня - война сторонним компонентам. Но есть два исключения: ODAC и DBGridEh. С последним забываешь проблемы отображения данных, вроде использования многострочных заголовков с объединением ячеек, написания собственной отрисовки (выделения шрифтом или цветом отдельных ячеек или строк) и т. п.

Не сочтите за рекламу.

303
30 марта 2005 года
makbeth
1.0K / / 25.11.2004
В общем расковырял я исходники DBGrid'a. Вся проблема оказалась в двух виртуальных методах класса TCustomGrid, которые не переопределены в классе TCustomDBGrid:
Код:
TCustomGrid = class (TCustomControl)
...
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 необходимо еще смещать курсор НД в нужном направлении. Кому не геморно этим занятся - прошу :)
303
30 марта 2005 года
makbeth
1.0K / / 25.11.2004
Да, чуть не забыл. Собственно по теме...
Запретить скроллинг можно так. Необходимо определить собственный обработчик событий DBGrid'a. Сделать это достаточно просто. Необходимо повесить на свойство WindowProc (тип TWndMethod) DBGrid'a свою собственную процедуру. А в ней давить сообщение CM_MOUSEWHEEL.
246
30 марта 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by smartsoft
Если отображается индикатор, то видно, что при скроллинге мышью перемещается только прямоугольник выделения, а курсор базы данных (RecNo, если угодно) стоит без движения. К тому же, выделение перемещается только в пределах видимых на экране записей. С одной стороны это и понятно - полноценного-то скроллинга нет. А с другой стороны - на фига такой скроллинг, если от него только проблемы?

Я-то даже и не обращал внимания, что стандартный грид так глупо поступает. DBGridEh работает намного более логично: курор набора данных перемещается вместе с выделением, и само выделение не ограничено областью видимых данных.


Ладно вроде убедил. Думаю если заглянуть в исходники DBGridEh, то после этого у тебя к проекту с DBGrid добавится максимум пару строк и эффект будет тотже.

Цитата:
Originally posted by smartsoft

... использования многострочных заголовков с объединением ячеек, написания собственной отрисовки (выделения шрифтом или цветом отдельных ячеек или строк) и т. п. Не сочтите за рекламу.


Такое Я сочту за Д/с №6(подготовительная группа):).

7.9K
30 марта 2005 года
avc
13 / / 04.08.2004
Цитата:
Кому не геморно этим занятся - прошу :)


Давным давно все уже сделано

Код:
class PACKAGE TDBGridM : public TDBGrid
...
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;
}
10
30 марта 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by GIZMO
Ладно вроде убедил. Думаю если заглянуть в исходники DBGridEh, то после этого у тебя к проекту с DBGrid добавится максимум пару строк и эффект будет тотже.


А вот ты не убедил. ;)

Зачем заглядывать в исходники DBGridEh, вместо того, чтобы использовать непосредственно его?

Правда, иногда в DBGridEh тоже попадаются баги, и в исходники приходится не только заглядывать, но еще и исправлять.

1.9K
31 марта 2005 года
ILS
100 / / 28.01.2003
Цитата:
Originally posted by GIZMO

Такое Я сочту за Д/с №6(подготовительная группа):).



Зря ты так. Подобных мелочей - огромное кол-во. И в итоге получился действительно очень удобный грид. Самое главное, что мне понравилось - это "поддержка": когда-то (еще во 2-ой версии - до 3-ей что-то руки так и не дошли) я сообщил автору об одном баге - он отозвался моментально и очень корректно (в тот же день прислал правильный код и разъяснения к нему).

11K
23 октября 2005 года
Sasha C
14 / / 20.10.2005
Цитата:
Originally posted by Freeman
Или наследовать собственный компонент от TDBGrid, перекрыв у него обработчик WM_MOUSEWHEEL, или устанавливать хук на каждый грид и перекрывать в нем обработку того же самого события.



Freeman, можно примерный код.

Цитата:
Originally posted by makbeth
Да, чуть не забыл. Собственно по теме...
Запретить скроллинг можно так. Необходимо определить собственный обработчик событий DBGrid'a. Сделать это достаточно просто. Необходимо повесить на свойство WindowProc (тип TWndMethod) DBGrid'a свою собственную процедуру. А в ней давить сообщение CM_MOUSEWHEEL.



makbeth, та же самая просьба.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог