Конференция "Компоненты" » Проблема с собщениями CM_ [D7, WinXP]
 
  • Чайник © (08.01.08 22:43) [0]
    Сделал компонент на основе TCustomControl, в котором отлавливаю дельфийские сообщения типа CM_MouseEnter или cm_MouseLeave. Все нормально работает, пока на главной форме не запускаю зацикленные вычисления:

               Repeat
                  ....
                  {здесь по ходу вычислений FStatus:=0}
                  ....
                  Application.ProcessMessages;
               Until (FStatus=0);



    Как только запускается данный цикл, мой компонент перестает ловить сообщения вида CM_ . Хотя виндузовские сообщения типа WM_ (в частности WM_LBUTTONDOWN и ему подобные)  прекрасно проходят.

    Вопросы:
    1. Кто виноват?
    2. Что делать?
  • Григорьев Антон © (09.01.08 15:38) [1]
    А в старых версиях Delphi (до семёрки) за отслеживание движения мыши отвечает Application.Idle. В новых версиях это перенесено в WndProc, так что проблемы быть не должно. Это проблема не вашего компонента, а VCL - можете убедиться, что стандартные компоненты тоже перестают реагировать на OnMouseEnter и OnMouseLeave в таком случае.
  • Чайник © (09.01.08 21:10) [2]

    > Григорьев Антон ©   (09.01.08 15:38) [1]

    У меня как раз семерка и стоит - все равно не работает.
    Я, правда, выкрутился - убрал цикл (пришлось таймер поставить), заработало, однако раздражает собственное невежество - так и не понял, что там не хватает. Это что же, выходит Application.ProcessMessages не все Messages моего Process инициирует?
  • Григорьев Антон © (09.01.08 21:45) [3]

    > Чайник ©   (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.
  • Чайник © (10.01.08 00:18) [4]

    > Григорьев Антон ©   (09.01.08 21:45) [3]


    Спасибо! Покопаю WM_MouseHover и MW_MouseLeave.
 
Конференция "Компоненты" » Проблема с собщениями CM_ [D7, WinXP]
Есть новые Нет новых   [134463   +60][b:0][p:0.001]