Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.27;
Скачать: CL | DM;

Вниз

TSpeedButton, WinXP, XPManifest   Найти похожие ветки 

 
Tack   (2005-02-07 17:43) [0]

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

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

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

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


 
Gero ©   (2005-02-07 20:58) [1]

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


 
Gero ©   (2005-02-07 20:59) [2]

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


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

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

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

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


 
Gero ©   (2005-02-07 22:27) [4]

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


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

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


 
Gero ©   (2005-02-07 22:32) [6]


> Tack   (07.02.05 22:31)

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


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

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


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

Parent=TPanel


 
Gero ©   (2005-02-07 22:36) [9]

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


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

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

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


 
Gero ©   (2005-02-07 22:53) [11]


> Tack   (07.02.05 22:45)

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


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

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


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

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


 
Gero ©   (2005-02-07 23:27) [14]

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


 
Tack   (2005-02-08 13:08) [15]

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

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

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


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

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

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


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

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

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

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

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

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

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


 
GrayFace ©   (2005-02-13 08:11) [18]

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



Страницы: 1 вся ветка

Текущий архив: 2005.02.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.065 c
1-1107787392
Tack
2005-02-07 17:43
2005.02.27
TSpeedButton, WinXP, XPManifest


9-1101630474
George
2004-11-28 11:27
2005.02.27
Нужна dll ка


14-1107432712
КаПиБаРа
2005-02-03 15:11
2005.02.27
Опрос - рефакторинг


1-1108312356
Alex31
2005-02-13 19:32
2005.02.27
Как открыть Word и передать "ему" имя файла?


14-1106517183
ArMellon
2005-01-24 00:53
2005.02.27
Кто из вас прошел "Соло на клавиатуре" ?