-
Сделал компонент на основе TCustomControl, в котором отлавливаю дельфийские сообщения типа CM_MouseEnter или cm_MouseLeave. Все нормально работает, пока на главной форме не запускаю зацикленные вычисления: Repeat
....
....
Application.ProcessMessages;
Until (FStatus=0); Как только запускается данный цикл, мой компонент перестает ловить сообщения вида CM_ . Хотя виндузовские сообщения типа WM_ (в частности WM_LBUTTONDOWN и ему подобные) прекрасно проходят. Вопросы: 1. Кто виноват? 2. Что делать?
-
А в старых версиях Delphi (до семёрки) за отслеживание движения мыши отвечает Application.Idle. В новых версиях это перенесено в WndProc, так что проблемы быть не должно. Это проблема не вашего компонента, а VCL - можете убедиться, что стандартные компоненты тоже перестают реагировать на OnMouseEnter и OnMouseLeave в таком случае.
-
> Григорьев Антон © (09.01.08 15:38) [1]
У меня как раз семерка и стоит - все равно не работает. Я, правда, выкрутился - убрал цикл (пришлось таймер поставить), заработало, однако раздражает собственное невежество - так и не понял, что там не хватает. Это что же, выходит Application.ProcessMessages не все Messages моего Process инициирует?
-
> Чайник © (09.01.08 21:10) [2] > У меня как раз семерка и стоит - все равно не работает.
А я и имел ввиду - до семёрки включительно. Так что ещё раз говорю - это проблема не вашего компонента.
> Это что же, выходит Application.ProcessMessages не все Messages > моего Process инициирует?
Во-первых, термина "инициировать сообщение" я не знаю, поэтому мне сложно догадаться, что вы имеете ввиду.
Нормальный цикл обработки сообщений, если видит, что сообщений нет, запускает Application.Idle, в котором и выполняется проверка того, где находится курсор мыши и не надо ли посылать компонентам CM_MouseEnter и CM_MouseLeave. Но этот медод (его можно задействовать, если вместо ProcessMessages вызывать HandleMessage) остановит вашу программу, если не будет сообщений. А вызвать "самый ответственный" за это метод TApplication.DoMouseIdle у вас не получится - он имеет видимость private. Честно говоря, средствами VCL вы вряд ли сможете сделать что-то лучшее, чем таймер.
Но так как у вас наследник TCustomControl, т.е. оконный компонент, вы можете попытаться воспользоваться средствами системы вместо VCL. Покопайте MSDN на тему WM_MouseHover и MW_MouseLeave, а также функции TrackMouseEvent.
-
> Григорьев Антон © (09.01.08 21:45) [3]
Спасибо! Покопаю WM_MouseHover и MW_MouseLeave.
|