Добавление скинов в существующий проект
Существует два основных способа применения скинов в проекте:
-
Использование стандартных компонентов, управляемых компонентом TsSkinManager
-
Замена используемых компонентов на их аналоги из пакета AlphaControls
1. Использование стандартных компонентов
Первый путь в большинстве случаев проще и позволяет увидеть результат уже через несколько минут. Поэтому вначале мы рассмотрим его. Для примера будем использовать уже существующую демо-программу из папки Demos поставки BDS2005. Скачать её исходники можно здесь.
После первой компиляции данного примера, получаем окно, где форма и все компоненты имеют стандартный вид.
Всё, что нам теперь нужно, это расположить на форме компонент TsSkinManager и настроить его:
-
Кладём компонент на форму и добавляем в свойство InternalSkins один из скинов. Как это делается можно посмотреть на странице "Первое приложение со скинами". Я добавил скин под названием AlterMetro.
-
Выбираем этот скин в свойстве SkinName, свойство Active должно быть True. Можно еще включить свойство ExtendedBorders, в этом случае при запуске форма будет иметь красивую тень.
-
Открываем свойство ThirdParty и видим окно с применённым скином AlterMetro. Это означает, что компонент настроен правильно. В открывшемся диалоге слева находится список типов компонентов, которые будут поддерживать скины в run-time. При первом открытии диалога там находится только объявление типа TButton (стандартная кнопка). Это означает, что при запуске приложения будут зашкуриваться только форма и эта все кнопки, имеющие тип TButton.
Можно закрыть диалог и запустить программу, чтобы посмотреть как она теперь выглядит. Мы увидим красивую форму, но на ней все компоненты по-прежнему имеют стандартный вид. Это из-за того, что нужные типы не были добавлены в список поддержки. В нём находится TButton, но на форме нет таких кнопок - только TBitBtn.
-
Попробуем добавить поддержку TBitBtn. Для этого вернемся в design-time и снова откроем редактор свойства ThirdParty. Нажимаем кнопку "New" и в открывшемся диалоге задаём название типа ("TBitBtn") и правило, по какому будет обрабатываться этот компонент ("Button"). Нажимаем "Ok".
-
Закрываем редактор и запускаем программу снова. Теперь мы видим, что все кнопки TBitBtn тоже красиво рисуются в соответствии с выбранным скином.
-
Добавлять таким образом все используемые типы и долго и лень. Поэтому можно воспользоваться с предустановленными списками поддерживаемых типов, расположенными справа в редакторе свойства ThirdParty. Переходим к списку "Packages" и нажимаем на пункт "Standard VCL". Справа заполнится список стандартных компонент, которые поддерживаются в пакете. Просто нажимаем большую кнопку "<<" в центре формы и все эти компоненты перенесутся в список компонент которые будут поддерживаться в программе.
-
Это всё! Теперь снова запускаем программу и смотрим, что получилось. Cкомпилированный пример с исходным кодом можно скачать здесь. Все стандартные компоненты и даже стандартные диалоги, вызываемые в программе рисуются в соответствии с заданным скином.
Так как мы добавили скин AlterMetro в свойство InternalSkins, то он теперь встроен в Exe и всегда будет загружаться при переносе на другие машины.
Плюсы и минусы рассмотренного варианта в сравнении с использованием компонентов из пакета:
-
Основным преимуществом использования первого варианта является скорость преобразования готового проекта. За несколько минут можно добавить поддержку скинов и полностью изменить внешний вид приложения.
-
Минусом данного подхода является более медленная отрисовка компонентов. Аналоги стандартных компонентов, находящиеся в пакете, полностью наследуют стандартное поведение, но при этом специально оптимизированы для более быстрой работы со скинами.
-
Поддержка стандартных компонентов более сложна технически, что может быть критично на очень больших проектах.
-
Компоненты из пакета содержат множество дополнительных свойств. Например, все элементы редактирования имеют свойство BoundLabel. Это метка которая приклеена к компоненту и смещается вместе с компонентом, если он меняет свою позицию. Кнопки имеют такие свойства как Reflected и другие. И еще, все видимые компоненты имеют свойство SkinData, которое позволяет менять правило отображения скина для каждого компонента, настраивать собственные цвета и задавать SkinManager для компонента. Все дополнительные свойства и возможности компонентов из пакета AlphaControls будут описаны в отдельной статье.
2. Замена используемых компонентов на их аналоги из пакета AlphaControls
Итак, у нас есть уже готовый работающий проект, в котором добавлены скины. Теперь можно заменить стандартные компоненты на их аналоги из пакета.
Для начала попробуем заменить TBitBtn на TsBitBtn, чтобы понять принцип:
-
В design-time открываем форму и нажимаем Alt+F12 или правой кнопкой мыши на форме выбираем пункт меню "View as text". В открывшемся окне редактирования мы можем изменить файл Dfm.
-
Для быстрого изменения вызываем диалог "Replace". Указываем, что нужно изменить TBitBtn на TsBitBtn и нажимаем "Replace all". Снова нажимаем Alt+F12 и возвращаемся к визуальному представлению формы. Можем убедиться, что все кнопки заменены на TsBitBtn.
-
Теперь сохраним форму. Среда Delphi выдаст сообщение о том, что в Pas-файле по прежнему находятся объявления TBitBtn и предложит откорректировать это. Нажимаем "Yes" И Delphi автоматически меняет объявление TBitBtn на TsBitBtn.
Конечно, если мы таким образом будем менять каждый тип в проекте, то это займёт довольно много времени. Существуют автоматизированные средства для замены одних типов в проекте на другие. Одно из лучших средств находится в составе GExperts. Также доступна утилита AlphaConvert, которая специально разработана для замены стандартных компонентов их аналогами из пакета AlphaControls. Возможна и обратная конвертация компонентов к стандартным типам. Рассмотрим эту программу подробнее и попробуем с её помощью заменить остальные компоненты в нашем примере:
-
Для работы конвертера необходимо, чтобы формы проекта были сохранены в текстовом формате. В нашем примере нажимаем на форме правую клавишу мыши и смотрим пункт меню "Text DFM", должно быть True. Закрываем проект.
Убедитесь, что у вас есть сохраненная копия конвертируемого проекта.
-
Скачиваем архив с программой, распаковываем его в любую директорию и запускаем Alphaconvert.exe. Если установить флажок "Skip this greeting...", то при следующих запусках программы данное окно показываться не будет. Нажимаем кнопку Next.
-
В открывшемся диалоге открытия файлов, удерживая клавишу Ctrl или Shift, выбираем формы, которые нужно сконвертировать. В нашем примере - только одна форма Main. Закрываем диалог и попадаем в следующее окно конвертера. Здесь выбираем "Standard to AC" и в списке файлов указываем типы, которые должны быть сконвертированы. По умолчанию включены все возможные. Нажимаем "Next".
-
Теперь все изменённые формы проекта должны быть открыты в Delphi и пересохранены заново (кнопка "Save" может быть disabled, в таком случае нужно что-нибудь изменить на форме и она станет доступна). Delphi предложит обновить типы компонентов как это было сделано когда мы конвертировали TBitBtn в TsBitBtn. Соглашаемся и нажимаем "Enter". Уже в design-time мы видим, что компоненты изменились. Запускаем приложение.
Это всё! В крупных проектах, возможно, потребуются дополнительные изменения в коде программ, в местах где типы компонентов не поменялись автоматически. Здесь можно скачать готовый пример.
Теперь можно открыть свойство ThirdParty и удалить все типы из списка, кроме TButton. Этот тип кнопки используется в некоторых диалогах Delphi.
В стандартном примере некоторые кнопки имели текст синего цвета. Были и метки синего и красного цветов. Теперь все цвета берутся из текущего скина, но мы можем сделать так, чтобы в этих компонентах по-прежнему применялся их собственный цвет, заданный в свойстве Font.Color. Для этого откроем у кнопок свойство SkinData.CustomFont и изменим его на True. У меток нужно изменить свойство UseSkinColor на False.
При запуске программы под Windows Vista и новее, мы увидим, что анимация показа окна не такая гладкая как должна быть. Это из-за того, что скин на форме инициализируется уже после запуска анимации системой. Чтобы этого избежать, достаточно положить на форму компонент TsSkinProvider. Он позволит инициализировать скин на форме до её показа. Настроить анимацию формы можно в свойстве TsSkinManager.AnimEffects. Также TsSkinProvider содержит ряд других настроек, которые могут быть полезны. Подробнее о них можно прочитать на странице TsSkinProvider.
Поддержка скинов в программу добавлена и всё работает как надо, но в пакете есть ещё много других возможностей, которые будут рассмотрены позже в следующих статьях.