TAnimate в Windows XP / Vista с включенными темами не будет работать

Коллега использовал пользовательский AVI для индикации прогресса в течение более длительных операций в течение многих лет. Это всегда работало нормально.

Недавно он решил перейти с Delphi 7 на Delphi 2007, частично чтобы получить поддержку тем для своих приложений. (У нас, наконец, есть большинство людей, но не все, работающие на XP.) Анимация перестала работать. Отключение тем заставляет его работать снова.

TAnimate - это оболочка для элемента управления анимацией Windows, созданная с помощью InitCommonControlsEx (ICC_ANIMATE_CLASS). В документации MSDN сказано, что «если вы используете ComCtl32.dll версии 6, поток не поддерживается, поэтому убедитесь, что ваше приложение не блокирует пользовательский интерфейс, иначе анимация не будет отображаться». Очевидно, это и есть предполагаемое поведение.

У кого-нибудь есть предложение об обходном пути или альтернативе этой проблеме? Обработка, которую он пытается продемонстрировать для выполнения, не подходит для порождения отдельного потока, и по очевидным причинам Application.ProcessMessages также не является хорошим решением.

РЕДАКТИРОВАТЬ: я присуждаю Робу Кеннеди правильный ответ на этот вопрос, потому что а) он предоставил «недостающую ссылку»; (каламбур) для поста в блоге Раймонда Чена на эту тему, и б) потому что, конечно, правильный перевод был перенесен в отдельную ветку.

Ирония здесь: операция, которую он проводил, блокировавшая TAnimate, была операцией индексации для используемого нами механизма базы данных (Advantage Database Server или ADS). Он не упомянул об этом, когда пришел ко мне с проблемой.

ADS поддерживает обратный вызов хода выполнения с использованием методов TAdsDataSet.AdsRegisterCallbackFunction и TAdsDataSet.AdsClearCallbackFunction. Функция обратного вызова обеспечивает как ход выполнения (в процентах) текущей операции, так и способ отменить операцию с помощью возвращаемого значения функции. Таким образом, весь вопрос оказывается спорным; функцию обратного вызова можно использовать для обновления индикатора выполнения, который указывает пользователю, что приложение не зависло.

Ответы на вопрос(2)

Ваш ответ на вопрос