У меня есть компонент, который я создаю в Delphi XE, который я хочу использовать следующим образом:
Пользователь создает новый пустой проект.
Пользователь помещает мой компонент в форму.
В моем компоненте выполняется какой-то специальный код Designtime, который изменяет параметры проекта, чтобы снять флажок «Включить темы времени выполнения» в параметрах проекта. Я не уверен, что это вообще возможно, поэтому я спрашиваю, возможно ли это.
Если №3 невозможно, то мне нужно другое решение моей проблемы с «удобством использования» с этим компонентом; Проблема, с которой я столкнулся, заключается в том, что если пользователи не отключают статически связанный файл манифеста, снимая флажок Включить темы времени выполнения, то этот статически сгенерированный манифест, связанный с EXE, по-видимому, переопределяет внешние файлы манифеста, которые я хочу иметь за пределами EXE, на диск. Мне также нужно изменить эти манифесты во время выполнения, поэтому мне нужны внешние манифесты. Я, конечно, могу включить функциональность Runtime Theme с помощью этих манифестов, когда это желательно. Второстепенный вопрос - о приоритете внешних и внутренних проявлений; Может ли внешний манифест каким-то образом иметь приоритет над внутренним ресурсом манифеста, который связан с приложениями Delphi, когда вы устанавливаете флажок «Включить темы времени выполнения»?
Приемлемые решения, кроме # 3:
A. Каким-то образом заставить Delphi не генерировать манифест. Б. Каким-то образом во время выполнения заставьте Windows распознавать внешние файлы .manifest и назначать им приоритеты, даже если обнаружен внутренний.
C. Наименее хорошее решение; Во время выполнения, после сбоя CoCreateInstance в моем компоненте, я могу перечислить ресурсы, сообщить, что внешний манифест присутствует и мешает нам, и полагаться на разработчиков, которые используют мой компонент, читая сообщения об ошибках времени выполнения, мой компонент выплевывает, говоря им отключить установите флажок темы времени выполнения и пересоберите их приложение. Извлечение и чтение манифеста уже описано в другом вопросе о стеке, здесь, с кодом C ++, который может быть легко преобразован в Delphi.
Обновить. Принятый ответ делает именно то, что я просил, но считается взломом, а ответ Дэвида о контекстах активации гораздо более разумный и является рекомендуемым подходом.
Update2 Встроенный манифест обычно переопределяется в более поздних версиях Delphi (XE5 и новее) путем явного указания манифеста, который вы хотите связать, в настройках проекта.
IOTAProjectOptions
интерфейс. - person Ondrej Kelle   schedule 19.07.2011