Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.012 c
1-29315
Mr. X
2004-01-30 08:51
2004.02.10
CD-ROM


1-29328
alexEagle
2004-01-29 00:42
2004.02.10
Почему падает TForm.Create?


3-29273
Igoryok
2004-01-16 16:21
2004.02.10
Недостаточно сведений ключевого поля для обновления


3-29253
Stas
2004-01-19 09:29
2004.02.10
Запрос


1-29375
Gogi
2004-01-29 10:13
2004.02.10
Как изменить цвет шрифта на кнопках в ToolBar?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский