Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TSpeedButton, WinXP, XPManifest [D7, WinXP]


Tack ©   (2005-02-07 17:43:00) 

Программа запускается на WinXP с включенным XPManifest, и ИНОГДА (при некоторых удачных запусках) кнопки TSpeedButton с включенным свойством Flat работают нормально - всплывают (становятся выпуклыми) при наведении мышки и снова становятся плоскими, если мышку убрать. А все остальное время они всплывают при наведении мышки и не выходят из этого состояния при убирании мышки с кнопки.

Та же проблема под Win 2003 Server.

Под win2000 и младше проблем нет.

Это проблема ОС, компилятора или что-то надо подправить в программе?


GrayFace   (2005-02-13 08:11:00) [1]

Tack   (09.02.05 0:30) [17]"сообщения WM_TIMER всегда имеют наименьший приоритет и принимаются, только когда в очереди потока нет других сообщений. (C) Рихтер
Конечно, очередь сообщений для неWin контролов эмлируется Дельфей, но откуда в примере с 2 SpeedButton'ами мог взятся Timer?


Tack   (2005-02-09 00:30:00) [2]

Потрясающе!
Как всегда все установилось методом тыка.

В программе есть таймер на 10 мсек. Он просто регулярно проверяет параметры некоторых IO-портов.

Так вот, поменял интервал таймера 10 мсек на 16 мсек - глюк пропал!

У меня такое впечатление, что сообщение таймера идет одним из первых в списке "case" WndProc-а или что-то типа такого. В общем, до генерации CM_MOUSEENTER/LEAVE дело очевидно не доходило, т.к. к моменту завершения функции-обработчика таймера OnTimer в очереди стояло уже новое сообщение WM_TIMER, которое надо было обработать.

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

Короче, что я могу сказать, уважаемые коллеги!
Не используйте вы эти таймеры, а юзайте потоки с семафорами и т.п.! Избегнете ОЧЕНЬ странных артефактов. ;-)


Tack   (2005-02-08 13:14:00) [3]

Еще и проверил функции-обработчики OnMouseEnter/OnMouseLeave для компонента TLabel - та же проблема! При некоторых запусках программы поток управления просто не входит в эти функции!

Кстати TLabel тоже унаследован он TGraphicControl.


Tack   (2005-02-08 13:08:00) [4]

Не, у меня форма не в DLL, но идет очень долгая ее инициализация - может поэтому?

Но факт-то налицо! Значит все-таки я не один с такой проблемой на свете! :-)

Кстати, сегодня опять не работает. Начинает работать все это только после того, как сделаешь несколько загрузок/выгрузок больших программ в память, типа Word 2003, а только потом запускать мою программу.


Gero   (2005-02-07 23:27:00) [5]

А у тебя форма в dll?


Tack   (2005-02-07 23:08:00) [6]

Во! Гляди что я нашел!
....
БИБЛИОТЕКА.VCL.Неустойчивость срабатывания сообщений CM_MOUSELEAVE/CM_MOUSEENTER
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=688


Tack   (2005-02-07 22:59:00) [7]

Gero, спасибо за помощь. ;-)


Gero   (2005-02-07 22:53:00) [8]


> Tack   (07.02.05 22:45)

А ты вместе со своей программой завтра на работу понеси еще и демку с панелью и парой кнопок.


Tack   (2005-02-07 22:45:00) [9]

Проверил - не глючит. :-/
Так теперь и моя основная программа не глючит! Пока. 10 запусков сделал - все работает. Но спорю на 100 баксов, что завтра я ее понесу на работу, проверю под Win2003 и там она даст этот сбой!

Думаешь, это программа моя что-то парит? Я в цикл сообщений не вклиниваюсь никаким боком вообще. Хотя с динамической памятью работаю через GetMem/FreeMem.


Gero   (2005-02-07 22:36:00) [10]

Создай новое приложение с панелью и парой кнопок на ней и проверь, будет ли глючить.


Tack   (2005-02-07 22:34:00) [11]

Parent=TPanel


Tack   (2005-02-07 22:33:00) [12]

Он шлет CM_MOUSEENTER/CM_MOUSELEAVE, по которым Flat-кнопка должна принимать выпуклый/плоский вид.


Gero   (2005-02-07 22:32:00) [13]


> Tack   (07.02.05 22:31)

Я имею ввиду чему равно свойство Parent?


Tack   (2005-02-07 22:31:00) [14]

TSpeedButton->TGraphicControl->TControl
Конечный родитель, который посылает сообещения - TControl


Gero   (2005-02-07 22:27:00) [15]

Кто родитель SpeedButton'ов?


Tack   (2005-02-07 22:23:00) [16]

Я так понял, это происходит от того, что Delphi ИНОГДА не посылает сообщения нестандартным контролам Windows (наследованных от TGraphicControl) CM_MOUSEENTER/CM_MOUSELEAVE.

Не могу только понять, почему это происходит только с Common Controls 6, когда я подключаю модуль XPMan. И то не всегда.

Может, есть соответствующие патчи на модули контролов Delphi7 ?


Gero   (2005-02-07 20:59:00) [17]

Ошибся, не заметил, что Delphi 7, вероятно проблема в другом.


Gero   (2005-02-07 20:58:00) [18]

Это проблема VCL.
Лечится просто:
SpeedButton.ControlStyle := [csSetCaption, csClickEvents];


Наверх

Титульная страница Поиск, карта сайта Написать письмо