Візуальні стилі в Delphi

У гол. 8 ми детально поговоримо про роль дій при розробці інтерфейсу програми і спеціальному компоненті для управління діями - TActionManager . Трохи забігаючи наперед скажемо, що цей компонент є свого роду "командним пунктом", з якого повинні керуватися елементи керування додатком. Зараз нас цікавить лише одна властивість цього компонента

property Style: TActionBarStyle;

За умовчанням середовище розробки Delphi пропонує два стилі:

  • standard — програма використовує системну бібліотеку ComCtl32.dll версії 5;
  • windows XP — програма використовує системну бібліотеку ComCtl32.dll

версії 6 та єдиний стандартний візуальний стиль Windows XP.

Ці стилі можна застосовувати лише до елементів керування, розміщених на панелях інструментів (TActionToolBar ), створених у компоненті

Однак не поспішайте обурюватись явною обмеженістю вибору. Ви можете самостійно створити власний стиль. Щоправда, це вимагатиме дуже багато зусиль — адже на основі базових класів елементів керування вам потрібно буде створити власні класи з потрібною вам поведінкою та зовнішнім виглядом.

Для цього необхідно створити клас нового візуального стилю на основі класу TActionBarstyieEx. Потім новий стиль реєструється за допомогою процедури

procedure RegisterActnBarStyle(AStyle: TActionBarStyleEx) ;

Після цього ваш стиль стає доступним для властивості style компонента TActionManager. Щоб скасувати стиль, використовуйте процедуру

procedure UnRegisterActnBarStyle(AStyle: TActionBarStyleEx);

Наприклад, обидві ці операції зручно виконати при ініціалізації та деініціалізації модуля, що описує клас стилю:

Лістинг 6.3.Варіант реєстрації та скасування власного візуального стилю

var MyStyle: TMyStyleActionBars;

Для зміни стилю програми можна використовувати глобальну змінну нового стилю (див. листинг 6.3). Її досить присвоїти властивості style :

При зміні стилю всі елементи керування, розташовані на панелях компонента ActionManagerl, будуть знищені та створені заново за допомогою налаштувань нового стилю.

Клас TActionBarstyieEx має лише кілька методів, які необхідно перекрити під час створення власного стилю. Всі вони повертають класи об'єктів, що використовуються при створенні інтерфейсу користувача. Розглянемо їх.

function GetStyleName: string;

повертає ім'я стилю.

function GetColorMapClass(ActionBar: TCustomActionBar): TCustomColorMapClass;

дозволяє отримати посилання на клас компонента налаштування палітри кольорів (див. розділ "Компоненти налаштування палітри кольорів" далі в цьому розділі), використовуваний панеллю інструментів.

Наступні три методи дають інформацію про класи різних типів елементів управління, що використовуються при проектуванні інтерфейсу користувача за допомогою компонента TActionManager .

Для того щоб отримати доступ до елементів керування, пов'язаних зі стилем, призначений метод

function GetControlClass(ActionBar: TCustomActionBar; AnItem:

Він повертає клас елемента керування з панелі ActionBar, пов'язаного з елементом керування Anitem. Саме ця функція викликається при створенні елементів керування у панелях інструментів компонента

Як уже говорилося вище, при присвоєнні властивості style компонента TActionManager нового значення (примірника класу розробленого вами візуального стилю) знищуються всі існуючі елементи керування і потімстворюються нові. І в процесі створення кожного візуального компонента викликається функція Getcontrolciass нового стилю, а повернене значення використовується для виклику конструктора відповідного класу.

Аналогічно, для отримання класу, який використовується в панелі меню, застосовується метод

function GetPopupClass(ActionBar: TCustorrActionBar): TGetPopupClass;

та для класів кнопок панелі інструментів застосовується функція

function GetScrollBtnClass: TCustomToolScrollBtnClass;

А клас панелі інструментів повертає функція

function GetAddRemoveltemClass(ActionBar: TCustomActionBar): TCustomAddRemoveltemClass;

Отже, після розробки та налагодження власних класів елементів керування із заданими властивостями вам потрібно буде створити нащадка від класу TActionBarstyieEx і перекрити всі перелічені вище функції так, щоб вони повертали потрібні класи для типів елементів керування, що використовуються.