Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.20;
Скачать: CL | DM;

Вниз

Как в DBGrid отловить MouseWheel?   Найти похожие ветки 

 
Alex_C   (2008-12-10 14:43) [0]

События OnMouseWheel у DBGrid нет. Как отловить?


 
KilkennyCat ©   (2008-12-10 14:45) [1]

Как и в любом другом компоненте.


 
Alex_C   (2008-12-10 15:07) [2]

Как в другом не получается.
procedure CMMouseWheel(var Message: TCMMouseWheel); message CM_MOUSEWHEEL;
вот при использовании колесика мышки в Memo - попадаем в эту ф-цию, а вот в DBGrid - нет.


 
Dimka Maslov ©   (2008-12-10 15:58) [3]

события от движения мыши и нажатия кнопок направляются в то окно, над которым расположен курсор, но события от колеса мыши посылаются в активное окно (как и события от клавиатуры).


 
DVM ©   (2008-12-10 23:55) [4]


> Alex_C

Отловить то можно, но работать оно все равно будет не ахти.


 
Германн ©   (2008-12-11 01:01) [5]


> DVM ©   (10.12.08 23:55) [4]
>
>
> > Alex_C
>
> Отловить то можно, но работать оно все равно будет не ахти.
>
>

Почему "не ахти"?


 
DVM ©   (2008-12-11 10:52) [6]


> Германн ©   (11.12.08 01:01) [5]

Да как то странно работает. Сколько не пытался прикрутить - не выходит как надо. В результате плюнул на это.
В идеале, хотелось бы, чтобы при прокрутке колесиком происходили все те же действия, что при нажатии стрелок вверх, вниз на клавиатуре. Т.е и текущая выбранная строка менялась и грид прокручивался при необходимости. Такого поведения мне добиться не удалось. Либо одно работает, либо другое. Возможно делал я не так.


 
DVM ©   (2008-12-11 11:01) [7]


> Германн ©   (11.12.08 01:01) [5]

Проще всего повесить на OnMessage TApplicationEvents следующее:

procedure TfrmMain.ApplicationEvents1Message(var Msg: tagMSG;
 var Handled: Boolean);
begin
 if Msg.message = WM_MOUSEWHEEL then
   begin
     Msg.message := WM_KEYDOWN;
     Msg.lParam := 0;
     if Msg.wParam > 0 then
       Msg.wParam := VK_UP
     else
       Msg.wParam := VK_DOWN;
     Handled := False;
   end;
end;

Ну можно еще проверку ввести, что грид в фокусе и т.д. Оно работает. Но почему то не всегда. Иногда перестает. Т.е грид прокручивается, а вот перемещения по записям уже не происходит.


 
Германн ©   (2008-12-12 00:46) [8]


> DVM ©   (11.12.08 10:52) [6]
>
>
> > Германн ©   (11.12.08 01:01) [5]
>
> Да как то странно работает.


> Т.е грид прокручивается, а вот перемещения по записям уже
> не происходит.
>

А с чего бы возникло бы "перемещение по записям"? Будет свободная минутка посмотри генофонд. И узри что в TDBGrid не переопределён ни один метод связанный с колесом мышки. Они просто унаследованы без изменений у TCustomGrid. А TCustomGrid, как ты сам понимаешь, знать ничего не знает о каких-то там "наборах данных".


 
DVM ©   (2008-12-12 10:38) [9]


> А с чего бы возникло бы "перемещение по записям"?

я бы понял, если бы оно вообще не возникало, а ведь возникает но не всегда. Вот это странно. Кстати, раз уж зашел разговор, я еще раз не поленился, посмотрел и придумал вроде надежный способ:

Так:

type
 TMyClass = class(TControl);

procedure TfrmMain.DBGridNewProc(var Message: TMessage);
var
 d: short;
begin
 if (Message.Msg = WM_MOUSEWHEEL) then
   begin
     d := HIWORD(Message.wParam);
     d := d div WHEEL_DELTA;
     DbGrid1.DataSource.DataSet.MoveBy(-d)
   end
 else
   TMyClass(DBGrid1).WndProc(Message);
end;

Ну и в

procedure TfrmMain.FormCreate(Sender: TObject);
begin
 DBGrid1.WindowProc := DBGridNewProc;
end;



Страницы: 1 вся ветка

Текущий архив: 2009.12.20;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.008 c
15-1256078084
Kerk
2009-10-21 02:34
2009.12.20
Политкорректность


4-1225224879
AndreyRus
2008-10-28 23:14
2009.12.20
Странности в определении загруженности CPU


2-1257157663
Сергей
2009-11-02 13:27
2009.12.20
Как передать данные в CRReport.PrintOut


15-1255770792
Вайка
2009-10-17 13:13
2009.12.20
S. T. A. L. K. E. R. Зов Припяти. Как Вам?


1-1229515633
dima47
2008-12-17 15:07
2009.12.20
Защита дискет от копирования