Форум: "Основная";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.143 c