Windows xp маніфест в delphi

У Windows XP є менеджер тем (theme manager) який змінює вигляд більшості стандартних об'єктів Windows. Misrosoft стверджує що старі версії бібліотеки comctl32.dll містять код для підтримки різних платформ сімейства Windows. Microsoft розумно вирішила почистити вміст comctl32.dll для поліпшення роботи тим в Windows XP. Тепер виходить що існує дві версії бібліотеки: стара (версія 5.8) яка має зворотну сумісність усіх попередніх версій Windows (в тому числі і XP) і нову версію (версія 6) яка сумісна тільки з XP (ну і наступними версіями Windows).

Що таке маніфест?

Що таке маніфест, і яку роль він відіграє у виборі версії 6.0 бібліотеки comctl32.dll для мого програми? Маніфест - XML ​​документ який повинен бути залінковані в ресурси вашого застосування. Зазвичай ресурси використовуються для зберігання таких речей як картинки, іконки і курсори миші. (З тим як використовувати ресурси ви можете прочитати в моїй статті. Прим. Перекладача) XML документ, коли підключається в ресурсну секцію дозволяє вирішити Windows XP яку версію comctl32.dll використовувати.

Як це зробити?

Щоб підключити цей XML маніфест в ваше додаток Ви для початку повинні знати константи надані Microsoft. Коли ви додаєте ресурс у ваше застосування, є номер групи і порядковий номер, пов'язаний з ресурсом. Номер групи зазвичай називається зрозумілим ім'ям. Якщо ви подивіться провідник ресурсів (resource explorer), що поставляється з Delphi у вигляді демонстраційного проекту (розташований) ви побачите групи звані "Strings" (Рядки), "Bitmaps" (Зображення), "Icons" (Іконки) або "Cursos" (Курсори миші) - це просто уявлення номер групи. Номер групи для "Manifest" (маніфесту) - 24, відповідно до заголовків C поширюваними Microsoft. Номер маніфесту для визначення версії бібліотеки comctl32.dll - 1 (Також відповідно до заголовків C поширюваними Microsoft). Ця інформація буде необхідна коли ми будемо створювати наш новий ресурс (.RES файл) для підключення до нашого додатком. Для створення необхідного .RES файлу нам потрібно створити файл .RC в якому буде міститися наш XML маніфест, що належить до відповідної групи та номером ресурсу. У zip-архіві включеному в цей документ ви побачите два файли:

Файл WindowsXP.RC містить інструціі для підключення WindowsXP.Manifest (XML-документа), а саме:

Отже, коли у нас є ці два файли нам необхідно використовувати компілятор ресурсів Delphi щоб скомпілювати .RC файл. В результаті чого у нас вийде файл WindowsXP.RES який ми можемо підключити в наш додаток. Для компіляції ресурсу введіть у командному рядку:

Звичайно, я думаю що ви вставили в змінну оточення PATH директорію BIN Delphi.

Після компіляції ви побачите Файл WindowsXP.RES в тойже директорії. Останній крок для того щоб ваше додаток стало WindowsXP-сумісним, це підключення ресурсного файлу в вашу програму. Найпростіший спосіб зробити це додати нижченаведену директиву в ваш файл проекту або головну форму:

Швидше за все вам доведеться помістити цю строчку відразу за директивою яка вже є у вашому додатку, відразу за пріедложеніем implementation. Як тільки ви підключили WindowsXP.RES в ваше додаток відкомпілюйте ваше додаток і запустіть його. Менеджер тим Windows призведе ваше додаток до виду інших додатків написаних для Windows XP.

попередження

Microsoft попереджає всіх розробників що вони прибрали велику кількість коду з бібліотеки comctl32.dll, і що необхідно ретельно перевіряти всі сторони роботи компонентів перед тим як поширювати нову версію. З мого досвіду можу сказати що можуть бути проблеми сумісності з Delphi. З іншого боку я знайшов тільки одну проблему - з компонентом TListView. Якщо ви використовуєте TListView в режимі показу (View Style) vsReport, у вас виникнуть проблеми з використанням властивості TColumns. Під час запуску при спробу використання заголовків колонок із зазначенням виду показу у вас виникне помилка ядра (Kernel Error).

Загалом подивіться що у мене вийшло: projectxp.zip

Виправлення проблеми з TListView (спасибі Євгену Іванову)

Став шукати як виправити це упущення, так як і Delphi 6 з Update 1 не допомагає впоратися з цією проблемою. Рішення полягає в наступному:

  1. Відкрити "ComCtrls.pas" і знайти "TCustomListView.UpdateColumn"
  2. Знайдемо наступний рядок.
  1. Замінюємо її на:
  1. Зберігаємо Comctrls.pas. Тепер TListView не викликає помилку в режимі vsReport під Windows XP.

Виправлення проблеми з TPageControl

Рішення проблеми з установкою кольору фону clBtnFace для TTabSheet.
Як ви знаєте TPageControl є контейнером TTabSheet: TPageControl нормально сприймається Windows XP маніфестом, але це залишається правильним поки ви не додасте TTabSheet.

Рішення полягає в наступному:

  1. Відкрийте модуль "ComCtrls.pas" і знайдіть рядок "TTabSheet.UpdateTabShowing"
  2. Ви побачите наступний текст:
  1. Додайте наступний рядок в цю процедуру:
  1. Якщо у вашому TPageControl створено більше одного TTabSheet, можливо при запуску вашого застосування ви побачите всі компоненти відмальовані на першому аркуші (TTabSheet). Не треба впадати в паніку. Знайдіть метод "TPageControl.Loaded" і змініть його щоб він був схожий на наступний код:

Додавання код змушує TPageControl пройтися по всіх сторінках перед показом. Це звичайно трохи негарно, але працює. Якщо у вас є інші методи вирішення цієї проблеми повідомте мені.

Виправлення проблеми з TTrackBar

TTrackBar - вибачте, а яка поточна позиція?

Підказка, що показує поточне значення TTrackBar при переміщенні повзунка зручна, тобто вам не буде потрібно додавати TLabel для цього.

  1. Відкрийте "ComCtrls.pas" і знайдіть "TTrackBar.CreateParams".
  2. Ви побачите наступний код:
  1. Додайте умова "or TBS_TOOLTIPS" в лінію "Style: =". В кінцевому результаті повинно вийти:
  1. Збережіть ComCtrls.pas і насолоджуйтеся підказкою.

Схожі статті