![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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];