Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.039 c
14-1108018112
Sergo
2005-02-10 09:48
2005.02.27
HKEY_LOCAL_MACHINE


14-1107432469
Ega23
2005-02-03 15:07
2005.02.27
Я плакал!


1-1108401404
yarvu
2005-02-14 20:16
2005.02.27
ActiveX HTML


4-1105596574
JohnKorsh
2005-01-13 09:09
2005.02.27
Как грамотно принимать данные на LPT?


3-1107013435
neat
2005-01-29 18:43
2005.02.27
dbExpress. Ошибка в параметре запроса





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский