Синхронізація mainmenu і toolbar через tactionmanager і tapplicationevents в delphi і з builder

Яке страшне вийшла назва у теми! На ділі все набагато простіше. Хочу розповісти, як зробити головне меню в своїй програмі налаштованим (тобто деякі рідко іспользиемие пункти можна приховувати або додавати контекстно-залежні пункти меню). Також в цій статті торкнемося питання, як синхронізувати ToolBar з меню, зробити, щоб він теж міняв свій вигляд в залежності від контексту програми. І нарешті, пройдемося по тих компонентів, які покликані полегшити нам цей процес, а не набивати все вручну. І звичайно ж, робимо все це на прикладі.

Отже, натискаємо в Delphi або билдер File-> New-> VCL Form Application. Так як середовище програмування Delphi якось більш поширена в російськомовній частині світу (а також в Латиноамериканської :)), ніж С ++ Builder. то і приклад буду супроводжувати в ній. Для билдер відмінності будуть несуттєвими і виражатися тільки в синтаксисі мови. Тому адаптувати приклад під Builder будь-якому мало-мальськи починаючому програмісту труднощів не складе.

Відразу ж перейменовуємо нашу форму в інспекторові об'єктів в frmMain (свойст Name). У властивості Caption (заголовок форми) пишемо "TACtionManager test application" або щось в цьому дусі. Я так рекомендую робити, щоб потім зручніше було розрізняти проекти, якщо раптом через якийсь час Ви до них повернетеся за прикладом. Тиснемо зберегти проект як (Save Project As ...), даємо йому ім'я, напрмер: ActionManTest. а файл головної форми зберігаємо під невигадливою назвою Main.

Додамо ще один стрілялки - вихід з програми. Знову правий клік мишкою - пункт меню, що випадає Додати стандартний стрілялки - і знову в гілці файл вибираємо TFileExit.

З'явився пункт меню File. Але ми, рускоговорящіе, хочемо, щоб він називався Файл. Завдяки тому, що тепер він доступний в інспектор об'єктів, ми просто виділивши його мишкою там і перейменуємо.

Синхронізація mainmenu і toolbar через tactionmanager і tapplicationevents в delphi і з builder

Запсукаем наші труди і отримуємо повністю працездатний додаток, які вміють відкривати файл (теоретично - по крайней мере, показувати діалог відкриття файлу ... фізично ніякого файлу ми поки не відкриваємо) і виходити з програми за переходами в головному меню або панелі інструментів. І це без єдиної строчки коду!

Але в мудёрном заголовку статті я ще пріплёл TApplicationEvents. Що це за звір і для чого він тут: це компонента, що відповідає за обробку системних подій додатки, а саме: мінімізація вікна, обробник холостого ходу, обробник відновлення і т.п. Саме в нашому випадку він буде корисний для тієї самої синхронізації, про яку я згадав в заголовку статті.

Припустимо, ми не хочемо, щоб користувач міг відкривати файли в якийсь період часу. Для цього нам треба зробити недоступними (Disabled. А точніше Enabled: = false) пункти меню і кнопки тулбара, що відповідають за відкриття файлу. Приклад звичайно притягнутий за вуха. На практиці частіше навпаки, забороняють кнопки збереження (якщо файл не відкритий - нічого зберігати) або доступу до чого-небудь (якщо версія тріальна) і т.п. Ну да ладно, для розуміння принципів механізму це не важливо. Важливим є те, що ми не будемо все це робити вручну, а доручимо оброблювачу OnIdle компонети TApplicationEvents. Отже, відкривши його властивості і перейшовши на закладку Events. створимо обробник OnIdle (для цього двічі клацнемо в відповідної рядку навпроти потрібного нам властивості). Тепер в демонстраційних цілях я хочу, щоб файл можна було відкривати тільки по непарних хвилинах поточного часу, тобто в 1-ю, 3-ю, 5-ю і т.п. а по парних користувач був позбавлений такої радості.

Пишемо такий код обработіка:

Функція MinuteOf повертає номер хвилини на якийсь момент, в нашому випадку Now (тепер). Ця функція оголошена в модулі DateUtils, тому його треба підключити (написавши uses DateUtils; відразу ж після ключового слова implementation в коді програми) Функція Odd повертає true. якщо її аргумент непарний. Таким чином, наші пункти меню і іконки тулбару будуть дозволені або заборонені в залежності від того, парна чи ні зараз йде хвилина системного часу. Зауважте, що ми не звертаємося до властивості Enabled пункту меню або піктограми тулбару, а робимо це в єдиному місці - в властивості Enabled екшену FileOpen1. Це працює, тому що наш пункт меню і елемент тулбару мають один загальний Action = FileOpen1.

Запускаємо наше тестове додаток і протягом декількох хвилин дивимося то на нього (а саме на пункт меню Open і тулбар), то на системний годинник (за замовчуванням в правому нижньому кутку екрану). І бачимо, що як тільки настає парна хвилина, ці елементи стають забороненими і навпаки. Це можливо завдяки оброблювачу OnIdle компоненти TApplicationEvents.

Звичайно ж, на практиці в цьому обробнику пишуться більш реальні речі. Напрмер, якщо файл відкритий і змінений, то стають доступними пункти меню Save і Save As ... і т.п.