Створення меню і панелей інструментів в lazarus

ActionList як основа для користувача інтерфейсу

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

Зрозуміло, при такому багаторазовому дублювання виникає проблема додавання і зміни команд: один і той же дію потрібно описати кілька разів. Ось тут-то нам і допоможе ActionList, точніше, що входять до нього елементи Action. Ці елементи акумулюють все загальні властивості пунктів меню і кнопок, а також дозволяють визначити єдині обробники подій, які будуть активуватися щоразу під час активації будь-якого з елементів, що посилаються на Action.

Більш того, під час виконання програми ми можемо змінювати властивості будь-якого елементу Action і ці зміни будуть автоматично поширюватися на всі пов'язані компоненти. Наприклад, якщо встановити властивість Enabled в False у одного з елементів Action, то все пов'язані компоненти стануть недоступними.

Озброївшись настільки цінними знаннями, давайте створимо в Lazarus новий проект і розмістимо на його головній (і єдиною) формою компоненти StaticText і ActionList. Перший з них будемо використовувати для індикації активації різних пунктів меню і кнопок панелі інструментів, тому збільшимо шрифт, щоб краще було видно. Другий забезпечимо п'ятьма елементами Action, створимо для них обробники подій OnExecute, в яких будемо присвоювати властивості Caption нашого StaticText нехитрий текст, який повідомляє яке з дій було виконано.

Створення меню і панелей інструментів в lazarus
Однак, без пов'язаних з ним компонент ActionList ніяк себе не проявляє і тому непотрібний. Наповнити сенсом його існування допоможуть меню зі своїми пунктами і панель інструментів з кнопками.

Створення головного меню

Додамо компонент MainMenu на форму, створимо в ньому 3 пункту верхнього рівня і в кожен з них додамо підміню з 1-2 пунктів так, щоб у всіх підміню вийшло в цілому 5 пунктів. У властивості Action кожного з цих п'яти пунктів виберемо відповідний елемент нашого ActionList. При цьому властивості пунктів меню, зокрема Caption, будуть змінюватися відповідно до обраного Action. Саме меню відобразиться вгорі форми, як йому і належить.

Створення меню і панелей інструментів в lazarus

Створення контекстного меню

Контекстне меню, або, по-іншому, спливаюче меню - також дуже зручний елемент інтерфейсу. Його додавання на форму схоже на додавання головного меню з тією лише різницею, що воно має вертикальну структуру і не повинно бути єдиним: практично кожному компоненту форми можна задати своє контекстне меню. Як і в головне меню, додамо в контекстне меню 5 пунктів, а елементом, для якого ми його зробили оголосимо саму форму. Для цього властивості форми PopupMenu дамо тільки що підготовлене контекстне меню.

Створення меню і панелей інструментів в lazarus

Створення панелі інструментів

Панель інструментів, безсумнівно, - найскладніша частина інтерфейсу, особливо якщо ми хочемо зробити її красивою, зручною і функціональною. За основу візьмемо не примітивною TToolBar, а панель TPanel, на яку будемо додавати різні компоненти. Щоб наша панель була схожа саме на панель інструментів, встановимо її властивість Align в alTop. Так вона розпластається уздовж верхньої межі доступної області вікна. Тепер додамо на панель п'ять кнопок TSpeedButton і ще одну панель, на якій розмістимо випадає і просту кнопку TButton. Всі кнопки і панель вирівняємо по лівому краю, встановивши їх властивості Align в alLeft і трохи растянем. Має вийти приблизно наступне:

Створення меню і панелей інструментів в lazarus
Ви запитаєте, звідки взялися пікторгамми на кнопках? Я розмістив їх там вручну. Насправді, для управління піктограмами кнопок і пунктів меню можна використовувати компонент TImageList. Однак, з одного боку, це не зовсім тривіальне завдання, тому що для кнопок і меню використовуються зображення різного розміру, а з іншого - реалізація TImageList в Lazarus, на жаль, поки не завершена.

Давайте тепер розглянемо більш детально сам компонент TPanel. В даному випадку нас найбільше цікавить, як найбільш естетично і раціонально розмістити на панелі інші компоненти. TPanel надає для цього масу можливостей. По-перше, розмістити на ній можна не тільки кнопки, але і інші компоненти, зокрема додаткові панелі, які можуть містити елементи, що не потребують масштабування. Пам'ятайте, що ми вирівняли всі дочірні компоненти вліво і тепер вони розташовані впритул один до одного і змінюють висоту, повторюючи висоту панелі? Так ось: випадає і кнопка скасування зроблених з його допомогою змін не повинні міняти ні розмір, ні взаємне положення. Саме тому вони розміщені всередині додаткової панелі.

Що стосується власного зовнішнього вигляду і розміщення вбудованих компонент, панель має набір властивостей, що дозволяють змінювати все це в досить широких межах. Для початку, спробуйте поекспериментувати з властивостями BevelOuter BevelInner, які визначають вид обрамлення панелі. Вибираючи різні поєднання цих властивостей, можна домогтися досить химерних результатів. Іншими важливими властивостями є різні відступи і межі. Ось як впливають деякі з них на розташування компонентів у складі панелі:

Створення меню і панелей інструментів в lazarus

Але і це ще не все. Давайте заповнимо випадає такими рядками: Після цього запрограмуємо процедури обробки подій списку і кнопки як зроблено в лістингу вище. Запустимо вийшла програму і вибираючи різні рядки в списку, переконаємося, що відповідні пункти головного і контекстного меню, а також кнопки на панелі зникають або стають недоступними. Така поведінка інтерфейсу досить корисно, наприклад, при реалізації системи поділу прав доступу.