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

Вниз

Отловить перемещение курсора на форме, заваленной компонентами   Найти похожие ветки 

 
Islander   (2004-01-31 21:34) [0]

У меня вся форма заставлена контролами. Можно ли как то отловить перемещения курсора мыши в пределах этой формы? А то очень уж не хочется для каждого компонента обрабатывать OnMouseMove


 
Palladin ©   (2004-01-31 21:38) [1]

обрабатывай WM_MouseMove на форме

TForm=class...
procedure lcMM(var msg:TMessage); message wm_mousemove;
...


 
Islander   (2004-01-31 22:02) [2]

Не, форма не получает сообщение, т.к. вся заставлена контролами. Что делать?


 
Palladin ©   (2004-01-31 22:15) [3]

мда... действительно... ступил...
определи единую процедуру на это событие и назначь всем контролам.

TWinControl.ControlCount, TWinControl.Controls[], рекурсия...


 
Islander   (2004-01-31 22:19) [4]

Я уже почти подошел к решению проблемы. Смотри в чем фишка: сообщения получают контролы, а не форма, значит, они передают их дальше по цепочке и до формы. Т.е. вот так уже работает:

procedure CMMouseenter(var Message: TMessage); message CM_MOUSEENTER;

А насчет способа, который ты предлагаешь: я думал над ним:

1) Слишком напряжно
2) Это перекроет те события, которые я могу назначить в дизайн-тайме


 
Cardinal ©   (2004-01-31 22:27) [5]

Когда надо (OnTimier напр.) отслеживаешь Mouse.CursorPos.


...
var x,y: integer;
...
x:=Mouse.CursorPos.x-{form1.}Left;
y:=Mouse.CursorPos.y-{form1.}Top;
...


 
Palladin ©   (2004-01-31 23:23) [6]

1) напряжено? кому?
2) Так сохраняй предыдущий обработчик для каждого контрола и вызывай его в общем.


 
Almaz ©   (2004-02-01 00:51) [7]

Господа, а не проще ли использовать Application.OnMessage ?

type
TForm1 = class(TForm)
...
private
procedure OnMessage(var Msg: TMsg; var Handled: Boolean);
...
end;

...

implementation

{$R *.DFM}

procedure TForm1.OnMessage(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.message = WM_MOUSEMOVE then
begin
// ...
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := OnMessage;
end;
...


Правда есть одна тонкость - OnMessage будет срабатывать для всех форм в проекте, но это легко проверить по Msg.hwnd.

Удачи.


 
Германн ©   (2004-02-01 04:30) [8]

2 Almaz © (01.02.04 00:51) [7]
Формально по сабжу Вы, возможно, правы. Но учитывая Islander (31.01.04 22:19) [4] и упоминание в нем CM_MOUSEENTER можно предположить, что автору нужно не столько "перемещение", сколько "в пределах какого контрола" находится "курсор мыши" в данный момент.


 
Almaz ©   (2004-02-01 05:06) [9]


> Германн © (01.02.04 04:30) [8]
> ...
> сколько "в пределах какого контрола" находится "курсор мыши"
> в данный момент.

Ну тогда еще останется вызвать ControlAtPos в OnMessage. И все.

Удачи.



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

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

Наверх




Память: 0.49 MB
Время: 0.015 c
1-29319
lipskiy
2004-01-27 22:31
2004.02.10
WinExec не везде выполняется, что неправильно?


6-29497
Kinder
2003-10-27 19:26
2004.02.10
Как посчитать трафик текукщего соединения с инетом


1-29381
denisWW
2004-01-28 00:23
2004.02.10
Уважаемые Дельфисты - проблемма с потоками


1-29358
axx
2004-01-29 12:37
2004.02.10
Помогите с преобразованием в массива в строку :-)


7-29625
kast
2003-11-25 12:09
2004.02.10
opc-client