Програмування на мові Delphi. Глава 8. Меню, рядок стану і панель інструментів, Різне, Програмування, статті

попередня стаття серії


Вихідні тексти прикладу до статті


Практично будь графічному додатку необхідно мати меню, рядок стану і панель інструментів. Ці стандартні елементи призначеного для користувача інтерфейсу доводиться створювати кожному, хто вирішує з допомогою комп’ютера будь-яку більш-менш серйозну проблему. Ми вирішили поєднати приємне з корисним і розглянути технологію створення меню та інших життєво важливих елементів програми в процесі створення простого, але дуже наочного програми. Воно призначене для перегляду стандартних графічних файлів (наприклад, точкових і векторних малюнків, значків).


8.1. Меню


8.1.1. Ідея меню


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


Розрізняють два типи меню:



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


Контекстних меню може бути багато і вони не мають постійного місця всередині форми. Такі меню не пов’язані з головним меню і з’являються лише за спеціальним вимогу з боку користувача, як правило, по клацанню правою кнопкою миші, коли покажчик миші наведено на потрібний елемент. Пункти контекстного меню можуть містити підлеглі меню. Контекстне меню прив’язується до конкретного елементу форми і ідеально підходить для розміщення команд, специфічних тільки цьому елементу. Оскільки доступ до команд контекстного меню можна отримати швидше, ніж до команд головного меню, використання контекстних меню робить користувальницький інтерфейс більш зручним.


Для створення головного та контекстного меню середу Delphi має два різних компоненти: MainMenu і PopupMenu. Заповнення цих компонентів пунктами меню відбувається однаково, але результат буде різним. У першому випадку ми отримаємо стандартну рядок головного меню, а в другому – вікно контекстного меню.


8.1.2. Головне меню


Крок 1. Приступаючи до практичної роботи, створіть новий додаток. Як це зробити, ви вже знаєте. Оскільки як приклад ми вирішили розробити програму для перегляду графічних файлів, давайте назвемо форму PictureForm (Значення властивості Name) І дамо їй заголовок Picture Viewer (Значення властивості Caption).


Крок 2. Тепер збережіть модуль форми і весь проект, виконавши команду меню File / Save All. Модуль назвіть MainUnit.pas, А файл проекту – PictureViewer.dpr. Ось тепер можна приступати до вивчення і меню і всього іншого.


Відображення у формі головного меню (main menu) забезпечує компонент MainMenu, Розташований в палітрі компонентів на вкладці Standard (Рисунок 8.1). Помістіть цей компонент на форму і дайте йому ім’я MainMenu (Значення властивості Name).



Рисунок 8.1. Компонент MainMenu


Компонент MainMenu має небагатий набір властивостей, детально ми на них зупинятися не будемо, а позначимо лише найважливіші (таблиця 8.1):




























Властивість Опис
AutoHotKeys Значення maAutomatic позбавляє програміста від необхідності призначати пунктам меню “гарячі” клавіші (за допомогою спеціального символу & в тексті пунктів); компонент автоматично підбирає “гарячі” клавіші. Значення maManual вимагає, щоб “гарячі” клавіші призначив програміст (див. параграф 8.1.3).
AutoLineReduction Якщо дорівнює значенню maAutomatic, То при відображенні меню йдуть підряд пункти-роздільники малюються як один роздільник, а пункти-роздільники, що знаходяться на початку або наприкінці меню взагалі не показуються. Властивість AutoLineReduction застосовується при програмному додаванні і видаленні пунктів меню, щоб уникнути небажаних явищ на кшталт повторюваних і повислих розділових ліній. Якщо властивість AutoLineReduction дорівнює значенню maManual, То всі пункти меню малюються як є.
AutoMerge Визначає, зливається чи головне меню вторинної форми з головним меню головної форми. Спосіб злиття визначається значенням властивості GroupIndex кожного пункту меню верхнього рівня.
Images Список значків, що відображаються поряд з пунктами меню. Властивість Images використовується спільно з властивістю ImageIndex компонентів MenuItem (Див. параграф 8.1.12).
Items Масив пунктів меню.
OwnerDraw Якщо дорівнює значенню True, то кожен пункт меню отримує можливість брати участь в процесі свого відображення за допомогою спеціальних подій OnMeasureItem і OnDrawItem. Подія OnMeasureItem відбувається в пункті меню, коли розраховуються розміри пункти. Подія OnDrawItem відбувається в пункті меню, коли пункт малюється на екрані. Якщо властивість OwnerDraw дорівнює значенню False, то пункти меню мають стандартний вигляд і події OnMeasureItem і OnDrawItem не відбуваються.
OnChange Відбувається при зміні структури меню.
Таблиця 8.1. Найважливіші властивості та події компонента MainMenu

Значок компонента MainMenu, Який ви бачите на формі, відображається лише на етапі розробки. Він потрібен для того, щоб ви могли швидко активізувати компонент і перейти до встановлення його властивостей. Однак компонент MainMenu є невізуальні і на етапі виконання програми його значок не відображається. Користувач бачить результат роботи компонента – рядок меню.


Поки в меню немає пунктів, немає і самого меню. Додавання нових пунктів виконується в спеціальному вікні – дизайнера меню (Menu Designer).


8.1.3. Дизайнер меню


Виклик дизайнера меню здійснюється за допомогою команди Menu Designer…, Яка знаходиться в контекстному меню компонента MainMenu (Рисунок 8.2).



Рисунок 8.2. Виклик дизайнера меню (Menu Designer)


Крок 3. Виберіть показану на малюнку команду Menu Designer… і на екрані з’явиться вікно з заголовком PictureForm.MainMenu. Це і є дизайнер меню.



Рисунок 8.3. Дизайнер меню (Menu Designer)


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


Крок 4. Зараз рядок головного меню складається з одного безіменного пункту. Дайте цим пунктом програмний ідентифікатор FileMenuItem (Значення властивості Name) І заголовок &File (Значення властивості Caption). Символ & забезпечує підкреслення наступного за ним символа при відображенні тексту, тому пункт меню буде видно як File (Рисунок 8.4). Підкреслена буква використовується в комбінації з клавішею Alt для швидкого вибору пункту меню і називається гарячою клавішею. В даному випадку активізація пункту File буде відбуватися по комбінації клавіш Alt+F. Зауважимо, що в деяких версіях операційної системи Windows «гарячі» клавіші підкреслюються тільки після натискання клавіші Alt.



Рисунок 8.4. Текст пункту меню


Буває дуже втомлює призначати пунктам меню гарячі клавіші. До того ж доводиться дбати про те, щоб гарячі клавіші не дублювалися в кількох пунктах. На щастя в компоненті MainMenu існує властивість AutoHotKeys. Якщо воно встановлено у значення maAutomatic, То підбір гарячих клавіш виконується автоматично. З цього моменту ми будемо користуватися цією можливістю, тому видаліть символ амперсанта (&) з властивості Caption компонента FileMenuItem і переконайтеся, що в компоненті MainMenu властивість AutoHotKeys встановлено в значення maAutomatic.


Крок 5. Зараз під пунктом File потрібно створити підлегле меню зі списком команд. Для цього просто клацніть в дизайнері меню на пункті File, Середа Delphi все зробить за вас. Під пунктом File з’явиться порожня осередок – заготівля першого пункту списку. Виберіть цей пункт за допомогою миші і дайте йому програмний ідентифікатор OpenMenuItem (Властивість Name), А у властивості Caption впишіть текст Open… . Замість порожній осередку з’явиться текст Open… і порожня клітинка переміститься нижче.


Крок 6. Діючи за аналогією, додайте ще три пункти: Save As… , Close і Exit. У програмі вони повинні називатися SaveAsMenuItem, CloseMenuItem і ExitMenuItem відповідно.



Рисунок 8.5. Пункти в меню File


Увага! Не намагайтеся видалити порожній пункт, завершальний список команд – у вас нічого не вийде. Та це й не потрібно, оскільки порожні висячі пункти не відображаються в меню під час роботи програми.


Погодьтеся, що додавання нових пунктів зроблено в середовищі Delphi дуже зручно. Але для створення повноцінного меню, однієї цієї можливості явно недостатньо – потрібні кошти вставки та видалення пунктів, створення вкладених меню та інші. Тому в дизайнері меню для кожного окремо взятого пункту передбачено контекстне меню з необхідним набором команд (рисунок 8.6 і таблиця 8.2).



Рисунок 8.6. Контекстні команди в дизайнері меню































Команда Опис
Insert Вставляє новий пункт.
Delete Видаляє вибраний пункт.
Create Submenu Створює в позиції пункту підлегле меню.
Select Menu Пропонує вибрати для роботи інший компонент меню.
Save As Template Зберігає поточну структуру меню в списку шаблонів.
Insert From Template Вставляє меню зі списку шаблонів.
Delete Templates Видаляє шаблон (и) меню.
Insert From Resource Вставляє меню з файлу з описом меню (розширення MNU) або з стандартного файлу ресурсів (розширення RC).
Таблиця 8.2. Контекстні команди в дизайнері меню

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


8.1.4. Пункти меню


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






































































Властивість Опис
Action Задає так звану команду, яка буде виконуватися при виборі даного пунтка меню. Весь список команд міститься в компоненті ActionList (Див. параграф 8.6).
AutoCheck Якщо дорівнює значенню True, то вибір пункту меню автоматично призводить до зміни значення властивості Checked на протилежне. Якщо дорівнює значенню False, то зміною властивості Checked управляє програміст.
AutoHotkeys Значення maAutomatic позбавляє програміста від необхідності призначати пункту меню “гарячу” клавішу (за допомогою спеціального символу & в тексті пункту); компонент автоматично підбирає “гарячу” клавішу. Значення maManual вимагає, щоб “гарячу” клавішу призначив програміст (див. параграф 8.1.3). Значення maParent показує, що спосіб призначення гарячої клавіші визначається “батьківським” компонентом MainMenu.
AutoLineReduction Якщо дорівнює значенню maAutomatic, То при відображенні меню поспіль йдуть пункти-роздільники малюються як один роздільник, а пункти-роздільники, що знаходяться на початку або наприкінці меню взагалі не показуються. Властивість AutoLineReduction застосовується при програмному додаванні і видаленні пунктів меню, щоб уникнути небажаних явищ на кшталт повторюваних і повислих розділових ліній. Якщо властивість AutoLineReduction дорівнює значенню maManual, То всі пункти меню відображаються як є. Якщо властивість дорівнює значенню maParent, То спосіб визначається “батьківським” компонентом (наприклад, MainMenu).
Bitmap Значок, який відображається поруч з текстом пункту меню. Якщо для даного пункту меню зазначений індекс значка за допомогою властивість ImageIndex, То значення властивості Bitmap ігнорується. Значки в пунктах меню більш детально переглянуті | в параграфі 8.1.12.
Break Якщо одно mbBreak або mbBarBreak, То пункт меню розпочинає новий стовпець. Значення mbBarBreak забезпечує відділення нового стовпця від попереднього вертикальної рисою.
Caption Текст пункту меню.
Checked Якщо дорівнює значенню True, то пункт меню містить мітку у вигляді “пташки”.
Default Значення True говорить про те, що вибір пункту меню можна здійснити подвійним клацанням “батьківського” пункту меню.
Enabled Визначає, чи доступний користувачеві даний пункт меню.
GroupIndex Працює по-різному в залежності від того, знаходиться пункт в підлеглому меню або в рядку головного меню. Пункти підлеглого меню з однаковим позитивним значенням GroupIndex погоджено перемикають між собою мітку – установка в одного пункту властивості Checked в значення True знімає позначку з іншого пункта.В MDI-формах властивість GroupIndex працює по-іншому. Пункти головного меню, що знаходяться в дочірній формі MDI, зливаються з пунктами головного меню обрамляє форми MDI при активізації дочірньої форми. При цьому якщо в рядку головного меню обрамляє форми існують пункти з таким самим значенням властивості GroupIndex, То новий пункт зі своїм списком пунктів повністю замінює старий, інакше новий пункт зі своїм списком пунктів вставляється в рядок головного меню. Більш докладно злиття меню викладено в довіднику середовища Delphi.
Hint Коротка підказка для користувача, яка відображається у рядку стану.
ImageIndex Номер значка в списку Images компонента MainMenu. Значок відображається поряд з текстом пункту меню (див. параграф 8.1.12). Негативне значення властивості ImageIndex говорить про те, що для пункту меню значок не заданий. Властивість ImageIndex має пріоритет над властивістю Bitmap.
RadioItem Якщо дорівнює значенню True, то мітка має вигляд жирної крапки.
ShortCut Комбінація клавіш для виконання команди, не відкриваючи меню.
SubMenuImages Список значків, що відображаються поряд з пунктами підлеглого меню. Властивість SubMenuImages використовується спільно з властивістю ImageIndex компонентів MenuItem (Див. параграф 8.1.12).
Visible Визначає, чи видно користувачеві пункт меню.
OnAdvancedDrawItem Відбувається при малюванні окремо взятого пункту меню на екрані. Подія відбувається тільки в тому випадку, якщо відповідний компонент меню (MainMenu або PopupMenu) Містить значення True у властивості OwnerDraw. Надає більш широкі можливості в порівнянні з подією OnDrawItem.
OnClick Відбувається при виборі пункту меню користувачем.
OnDrawItem Відбувається при малюванні окремо взятого пункту меню на екрані. Подія відбувається тільки в тому випадку, якщо відповідний компонент меню (MainMenu або PopupMenu) Містить значення True у властивості OwnerDraw.
OnMeasureItem Відбувається при розрахунку розмірів окремо взятого пункту меню перед його малюванням на екрані. Подія відбувається тільки в тому випадку, якщо відповідний компонент меню (MainMenu або PopupMenu) Містить значення True у властивості OwnerDraw.
Таблиця 8.3. Найважливіші властивості та події компонента MenuItem

За аналогією з іншими класами компонентів можна було б припустити, що в палітрі компонентів існує компонент MenuItem. Однак його там немає, оскільки пункти меню не існують самі по собі, а працюють тільки в складі рядка головного меню або вікна контекстного меню. Тим не менш, вони багато в чому поводяться як справжні компоненти, наприклад, налаштовуються у вікні властивостей і поряд з іншими компонентами поміщаються в вихідний текст форми у вигляді окремих полів. Щоб у цьому переконатися, активізуйте редактор коду і знайдіть визначення класу форми. Воно буде таким, як на малюнку 8.7.



Рисунок 8.7. Пункти меню в програмному коді


8.1.5. Розділові лінії


Крок 7. Логічно пов’язані між собою команди прийнято відокремлювати від інших команд горизонтальною лінією. Наприклад, пункт Exit добре б відокремити від інших (рисунок 8.8). Для цього вставте новий пункт і запишіть у значенні властивості Caption символ мінуса (-).



Рисунок 8.8. Розділова лінія в меню


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


8.1.6. Комбінації клавіш


Деяким пунктам меню призначають комбінації клавіш (shortcut), щоб виконувати команди, не відкриваючи меню. Вони прискорюють роботу з додатком і популярні серед досвідчених користувачів. Назви комбінацій клавіш відображаються праворуч від тексту відповідних пунктів. Наприклад, у багатьох програмах команді меню File / Open… призначається комбінація клавіш Ctrl+O.


Крок 8. Щоб призначити пункту комбінацію клавіш, активізуйте пункт в дизайнері меню, перейдіть до вікна властивостей і виберіть у списку значень властивості ShortCut необхідну комбінацію клавіш (рисунок 8.9). Якщо її там немає, то введіть назву комбінації клавіш вручну.



Рисунок 8.9. Комбінація клавіш для активізації пункту меню


Увага! Майте на увазі, що середа Delphi не відстежує дублювання однієї і тієї ж комбінації клавіш для кількох пунктів меню, за це відповідає програміст.


8.1.7. Обробка команд меню


У першому наближенні меню готове і вам напевно не терпиться його випробувати. Давайте реалізуємо закриття форми по команді Exit. Вирішення цього завдання зводиться до обробки події OnClick компонента ExitMenuItem. Ця подія виникає при виборі користувачем в меню пункту Exit.


Крок 9. Отже, активізуйте в дизайнері меню пункт Exit і виберіть у вікні властивостей вкладку Events. Тепер зробіть подвійне клацання мишею на значенні події OnClick (Рисунок 8.10).



Рисунок 8.10. Створення обробника команди меню


В результаті відкриється редактор коду, в якому з’явиться заготовка обробника події. Обробка команди Exit зводиться до виклику методу Close, Який закриває форму (а заодно і додаток, оскільки це єдина форма):





procedure TPictureForm.ExitMenuItemClick(Sender: TObject);
begin
Close;
end;

Підключення меню до форми виконується за допомогою властивості форми Menu. Відшукавши його у вікні властивостей, ви виявите, що воно вже містить ідентифікатор розробленого меню MainMenu, Тому в даному випадку для роботи меню більше нічого не потрібно.


Перевіримо, чи працює меню. Виконайте компіляцію і запустіть проект. На екрані з’явиться форма з рядком меню під заголовком. Вибір в меню будь-якої команди крім Exit безрезультатний. За командою Exit вікно закриється і додаток завершиться (рисунок 8.11).



Рисунок 8.11. Перевірка роботи команди Exit


8.1.8. Пункти-перемикачі


У багатьох програмах існують пункти меню, які працюють як перемикачі. Якщо ви ще не зрозуміли, про що йде мова, подивіться на малюнок 8.12. У нашій програмі перемикачами зручно зробити пункти меню, що відповідають за відображення панелі інструментів і рядка стану. Установка прапорця клацанням пункту-перемикача показує панель інструментів (або рядок стану), а зняття прапорця – ховає. Розглянемо, як програмується таку поведінку.


Крок 10. У рядку головного меню створіть меню, що випадає View до пунктів Toolbar (Програмне ім’я ToolBarMenuItem) І Status bar (Програмне ім’я StatusBarMenuItem). Встановіть в останніх двох пунктах властивість Checked в значення True. У пунктах меню з’являться мітки (рисунок 8.12).



Рисунок 8.12. Пункти-перемикачі в меню


Крок 11. У відповідь на вибір користувачем пунктів Toolbar і Status bar будемо перемикати прапорець. Ви вже знаєте, як визначити обробник події OnClick для пункту меню, тому відразу наведемо те, що ви повинні отримати:





procedure TPictureForm.ToolBarMenuItemClick(Sender: TObject);
begin / / Сховати або показати панель інструментів
ToolBarMenuItem.Checked := not ToolBarMenuItem.Checked;
end;
procedure TPictureForm.StatusBarMenuItemClick(Sender: TObject);
begin / / Сховати або показати рядок стану
StatusBarMenuItem.Checked := not StatusBarMenuItem.Checked;
end;

Готово, зберіть проект і перевірте, що пункти Toolbar і Status bar стали працювати як перемикачі. Пізніше, коли ви створите в своєму додатку рядок стану і панель інструментів, ми допишемо ці обробники подій. А зараз розглянемо ще один тип пунктів меню – Взаємовиключні перемикачі.


8.1.9. Взаємовиключні перемикачі


Крім звичайних перемикачів у меню широко застосовуються взаємовиключні перемикачі. Такі пункти працюють узгоджено – включення одного з них означає виключення інших. У нашому прикладі за допомогою взаємовиключних перемикачів зручно реалізувати вибір масштабу для малюнка. Розглянемо, як це робиться.


Крок 12. Додайте в меню View три пункти: Half Size (Програмне ім’я HalfSizeMenuItem), Normal Size (Програмне ім’я NormalSizeMenuItem) І Double Size (Програмне ім’я DoubleSizeMenuItem), Відокремивши їх від інших пунктів меню за допомогою розділової лінії.


Крок 13. Об’єднайте щойно створені пункти меню в одну погоджено працюючу групу. Для цього у всіх пунктів встановіть однакове ненульове значення властивості GroupIndex (Наприклад, 1). Крім того, встановіть для всіх цих пунктів властивість RadioItem в значення True, щоб мітка мала вигляд жирної крапки. Один з пунктів (наприклад, Normal Size) Перекладіть у включений стан, встановивши його властивість Checked в значення True (рисунок 8.13).



Рисунок 8.13. Взаємовиключні перемикачі в меню


Крок 14. Щоб привести в дію механізм перемикання пунктів, визначте в них такі обробники події OnClick:





procedure TPictureForm.HalfSizeMenuItemClick(Sender: TObject);
begin / / Показати малюнок половинного розміру
HalfSizeMenuItem.Checked := True;
end;
procedure TPictureForm.NormalSizeMenuItemClick(Sender: TObject);
begin / / Показати малюнок нормального розміру
NormalSizeMenuItem.Checked := True;
end;
procedure TPictureForm.DoubleSizeMenuItemClick(Sender: TObject);
begin / / Показати малюнок подвійного розміру
DoubleSizeMenuItem.Checked := True;
end;

Виконавши компіляцію, запустіть програму і переконайтеся, що нові пункти меню працюють як взаємовиключні перемикачі.


8.1.10. Недоступні пункти меню


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


Крок 15. У нашому прикладі логічно було б зробити недоступними пункти Save As…, Close, А також Half Size, Normal Size і Double Size, Коли немає відкритого графічного файлу. Для цього в кожному із зазначених пунктів меню встановіть властивість Enabled в значення False (Рисунок 8.14).



Рисунок 8.14. Недоступні пункти меню


Крок 16. Під час роботи програми потрібно ще динамічно робити пункти меню доступними або недоступними в залежності від того, відкритий графічний файл чи ні. Так як ці дії досить універсальні, оформимо їх у вигляді окремого методу EnableCommands:





type
TPictureForm = class(TForm)

private
{ Private declarations }
procedure EnableCommands(Enable: Boolean);
end;

procedure TPictureForm.EnableCommands(Enable: Boolean);
begin
SaveAsMenuItem.Enabled := Enable;
CloseMenuItem.Enabled := Enable;
HalfSizeMenuItem.Enabled := Enable;
NormalSizeMenuItem.Enabled := Enable;
DoubleSizeMenuItem.Enabled := Enable;
end;

Параметр Enable даного методу визначає, в який стан перевести пункти меню: доступні – True або недоступні – False.


Крок 17. Створіть обробники команд Open… і Close. Як ви розумієте, в обробник команди меню Open… слід помістити виклик методу EnableCommands з параметром True, а в обробник команди Close – Виклик методу EnableCommands з параметром False:





procedure TPictureForm.OpenMenuItemClick(Sender: TObject);
begin / / Відкрити малюнок і дозволити команди
EnableCommands(True);
end;
procedure TPictureForm.CloseMenuItemClick(Sender: TObject);
begin / / Закрити малюнок і заборонити команди
EnableCommands(False);
end;

Виконайте компіляцію і запустіть програму. Подивіться, як змінилося її меню (рисунок 8.15).



Рисунок 8.15. Меню працюючої програми. Деякі пункти недоступні.


На самому початку роботи окремі пункти випадають меню File і View недоступні. Вони стають доступними після вибору команди File / Open…, А після вибору команди File / Close – Знову недоступними.


Отже, ви вивчили всі основні аспекти програмування головного меню, тому перейдемо до питання розробки контекстних меню.


8.1.11. Контекстне меню


Контекстне (допоміжне) меню представлено в середовищі Delphi компонентом PopupMenu (Рисунок 8.16). Відшукайте його в палітрі компонентів на вкладці Standard і помістіть на форму. Дайте новому компоненту ім’я PopupMenu.



Рисунок 8.16. Компонент PopupMenu


Перш, ніж перейти до практичного використання контекстних меню, коротко опишемо відмітні властивості компонента PopupMenu (Таблиця 8.4).








































Властивість Опис
Alignment Визначає місце появи меню щодо покажчика миші: paLeft – Лівий верхній кут меню збігається з позицією курсору миші; paCenter – Середина верхнього краю меню збігається з позицією курсору миші; paRight – Правий верхній кут меню збігається з позицією курсору миші.
AutoHotkeys Значення maAutomatic позбавляє програміста від необхідності призначати пунктам меню “гарячі” клавіші (за допомогою спеціального символу & в тексті пунктів); компонент автоматично підбирає “гарячі” клавіші. Значення maManual вимагає, щоб “гарячі” клавіші призначив програміст (див. параграф 8.1.3).
AutoLineReduction Якщо дорівнює значенню maAutomatic, То при відображенні меню поспіль йдуть пункти-роздільники малюються як один роздільник, а пункти-роздільники, що знаходяться на початку або наприкінці меню взагалі не показуються. Властивість AutoLineReduction застосовується при програмному додаванні і видаленні пунктів меню, щоб уникнути небажаних явищ на кшталт повторюваних і повислих розділових ліній. Якщо властивість AutoLineReduction дорівнює значенню maManual, То всі пункти меню відображаються як є.
AutoPopup Якщо дорівнює значенню True, То меню з’являється автоматично після натискання правої кнопки миші. Якщо дорівнює значенню False, То меню необхідно відображати програмно.
Images Список значків, що відображаються поряд з пунктами меню. Властивість Images використовується спільно з властивістю ImageIndex компонентів MenuItem (Див. параграф 8.1.12).
Items Забезпечує нумерований доступ до пунктів меню.
MenuAnimation Набір прапорців, що визначають спосіб появи меню на екрані: maLeftToRight – Зліва направо, maRightToLeft – Справа наліво, maTopToBottom – Зверху вниз, maBottomToTop – Знизу вгору, maNone – Миттєве відображення. Щоб прапорці почали працювати, запустіть програму установки екрану (Start-> Settings-> Control Panel-> Display) і на вкладці Effects виберіть спосіб появи меню і підказок – Scroll Effect.
OwnerDraw Якщо дорівнює значенню True, то кожен пункт меню отримує можливість брати участь в процесі свого відображення за допомогою спеціальних подій OnMeasureItem і OnDrawItem. Подія OnMeasureItem відбувається в пункті меню, коли розраховуються розміри пункту. Подія OnDrawItem відбувається в пункті меню, коли пункт малюється на екрані. Якщо властивість OwnerDraw дорівнює значенню False, то пукнти меню мають стандартний вигляд і події OnMeasureItem і OnDrawItem не відбуваються.
TrackButton Кнопка миші для вибору пункту меню: tbLeftButton – Ліва кнопка, tbRightButton – Ще й права кнопка.
OnChange Відбувається при зміні структури меню.
OnPopup Відбувається при виклику меню користувачем.
Таблиця 8.4. Найважливіші властивості та події компонента PopupMenu

Крок 18. Контекстне меню наповнюється пунктами, як і головне меню, в дизайнера меню. Подвійним клацанням миші на компоненті PopupMenu відкрийте вікно констурктора меню і, використовуючи вже відомі вам прийоми, додайте в меню пункти Half Size (З ідентифікатором HalfSizePopupItem), Normal Size (З ідентифікатором NormalSizePopupItem) and Double Size (З ідентифікатором DoubleSizePopupItem). У всіх пунктах контекстного меню встановіть наступні властивості:



Крім цього позначте пункт Normal Size, Встановивши в ньому властивість Checked в значення True. Таким чином, команди спливаючого меню дублюють деякі команди головного меню, забезпечуючи користувачеві додаткові зручності (рисунок 8.17).



Рисунок 8.17. Команди контекстного меню


Проектування меню завершено і зараз перейдемо до програмування обробників подій. У даному прикладі команди контекстного меню обробляються так само, як і команди однойменних пунктів головного меню. Оскільки для пунктів головного меню обробники вже написані, то їх просто потрібно пов’язати з пунктами контекстного меню. Це робиться дуже просто.


Крок 19. Активізуйте в дизайнері меню пункт Half Size і виберіть у вікні властивостей вкладку Events. Виберіть обробник HalfSizeMenuItemClick із списку події OnClick. Те ж саме виконайте з пунктами Normal Size і Double Size, Встановивши для них обробники NormalSizeMenuItemClick і DoubleSizeMenuItemClick відповідно (малюнок 8.18).



Рисунок 8.18. Установка обробників команд контекстного меню


Крок 20. Для синхронної роботи головного та контекстного меню потрібно ще підправити деякі обробники:





procedure TPictureForm.HalfSizeMenuItemClick(Sender: TObject);
begin / / Показати малюнок половинного розміру
HalfSizeMenuItem.Checked := True;
HalfSizePopupItem.Checked := True;
end;
procedure TPictureForm.NormalSizeMenuItemClick(Sender: TObject);
begin / / Показати малюнок нормального розміру
NormalSizeMenuItem.Checked := True;
NormalSizePopupItem.Checked := True;
end;
procedure TPictureForm.DoubleSizeMenuItemClick(Sender: TObject);
begin / / Показати малюнок подвійного розміру
DoubleSizeMenuItem.Checked := True;
DoubleSizePopupItem.Checked := True;
end;
procedure TPictureForm.EnableCommands(Enable: Boolean);
begin
SaveAsMenuItem.Enabled := Enable;
CloseMenuItem.Enabled := Enable;
HalfSizeMenuItem.Enabled := Enable;
HalfSizePopupItem.Enabled := Enable;
NormalSizeMenuItem.Enabled := Enable;
NormalSizePopupItem.Enabled := Enable;
DoubleSizeMenuItem.Enabled := Enable;
DoubleSizePopupItem.Enabled := Enable;
end;

Крок 21. Контекстне меню готово, залишилося зробити так, щоб воно створювалося по клацанню правої кнопки миші на формі. Немає нічого простіше – активізуйте форму і запишіть у значенні властивості PopupMenu ім’я розробленого раніше контекстного меню – PopupMenu. Ви можете ввести це значення з клавіатури або вибрати із списку (рисунок 8.19).



Рисунок 8.19. Прив’язка контекстного меню до форми


Готово, виконайте компіляцію і запустіть програму. Натискання правої кнопки миші у вікні програми викличе появу контекстного меню. Всі його пункти виявляться недоступними. Щоб пункти контекстного меню заробили, виконайте команду головного меню File / Open. Після цього перевірте, що контекстне меню працює синхронно з головним меню.


8.1.12. Значки в пунктах меню


Кожен пункт меню крім тексту може містити барвистий значок, наочно пояснює призначення пункту. Найпростіший спосіб створення значка в пункті меню – встановити властивість Bitmap.


Крок 22. Викличте дизайнер меню для компонента MainMenu форми PictureForm. Виберіть пункт File / Open і перейдіть до властивості Bitmap у вікні властивостей (рисунок 8.20).



Рисунок 8.20. Властивість Bitmap пункту меню


Крок 23. Установка значення властивості Bitmap здійснюється за допомогою вже знайомого вам вікна Picture Editor (Рисунок 8.21), що викликається натисненням кнопки з трьома крапками в полі властивості. У цьому вікні натисніть кнопку Load… і виберіть файл Open.bmp з колекції малюнків на компакт-диску (каталог Images).



Рисунок 8.21. Вікно Picture Editor


Нарешті, закрийте діалогове вікно за допомогою кнопки OK. Результат показаний на малюнку 8.22.



Рисунок 8.22. Пункт Open має значок


Такий спосіб створення значків в меню дуже простий, але не завжди зручний. У тих випадках, коли кількість пунктів меню обчислюється десятками і багато пунктів головного меню дублюються в контекстних меню і панелі кнопок, використовувати для кожного пункту окрему копію одного і того ж значка не ефективно, та й незручно. У таких випадках на допомогу приходить компонент ImageList. Його основні властивості наведені в таблиці 8.5.


Як ви вже могли здогадатися з назви компонента ImageList, Він призначений для зберігання заздалегідь підготовленого списку значків (в загальному випадку, будь-яких малюнків). Інші компоненти беруть значки з цього списку за номером. Оскільки для зберігання номера потрібно набагато менше пам’яті, ніж для зберігання самого значка, то при використанні одного і того ж значка в кількох компонентах, досягається значна економія пам’яті. Та й керувати значками за допомогою компонента ImageList теж дуже зручно. Якщо змінити значок в списку, то він автоматично зміниться у всіх компонентах, які його використовують. Існує лише одне обмеження при використанні компонента ImageList – Все збережені значки повинні мати однакові розміри.


































Властивість Опис
Width, Height Ширина і висота малюнків у списку.
AllocBy Приріст масиву. Коли масив повністю заповнений і робиться спроба додати новий малюнок, розмір масиву збільшується на AllocBy елементів. Використовується для оптимізації швидкості додавання елементів та займаної ними пам’яті.
BkColor Колір фону. Цим кольором запоняются ті частини малюнків, які повинні бути прозорими. Значення clNone залишає фон прозорим.
BlendColor Колір, яким підсвічуються малюнки. Наявність підсвічування і її яскравість залежить від значення властивості DrawingStyle.
DrawingStyle Спосіб відображення малюнків:dsFocus – Легка (25%) підсвічування кольором BlendColor;dsSelected – Сильна (50%) підсвічування кольором BlendColor;dsNormal – Підсвічування відсутній, колір фону береться з властивості BkColor. Якщо властивість BkColor містить значення clNone, То фон прозорий.dsTransparent – Підсвічування відсутній, колір фону прозорий незалежно від значення властивості BkColor. Значення цієї властивості може ігноруватися стандартними компонентами. Воно корисно, якщо малюнки зі списку відображаються програмно за допомогою методу Draw.
ImageType Вибирає між відображенням малюнків (значення tiImage) Та їх масок (значення tiMask). Значення цієї властивості може ігноруватися стандартними компонентами. Воно корисно, якщо малюнки зі списку відображаються програмно за допомогою методу Draw.
Masked Якщо дорівнює значенню True, то при додаванні малюнка в список для нього створюється спеціальна маска. Маска описує фонові пікселі малюнка і використовується при виведенні малюнка на екран. Наявність маски дозволяє маніпулювати фоном малюнка за допомогою властивостей BkColor і DrawingStyle. Якщо властивість Masked дорівнює значенню False, то малюнок поміщається в список без маски і завжди малюється як є. В цьому випадку властивість BkColor ігнорується, а значення dsTrasnparent у властивості DrawingStyle не виробляє ефекту.
ShareImages Якщо дорівнює значенню False, то при знищенні компонента знищується також відповідний об’єкт операційної системи Windows, який прихований всередині компонента ImageList. Якщо дорівнює значенню True, то при знищенні компонента пов’язаний з ним об’єкт операційної системи не знищується, що дозволяє використовувати цей об’єкт за межами бібліотеки VCL.
OnChange Відбувається при будь-якій зміні списку.
Таблиця 8.5. Основні властивості та події компонента ImageList

Скористаємося компонентом ImageList для зберігання значків в нашій програмі. Знайдіть його в палітрі компонентів на вкладці Win32 (Рисунок 8.23).



Рисунок 8.23. Компонент ImageList


Помістіть компонент ImageList на форму і дайте йому ім’я ImageList. Зверніть увагу, що стандартні значення властивостей Width і Height дорівнюють 16, тому не забудьте їх змінити, якщо ваші значки мають інші розмірів.


Крок 24. Редагування списку малюнків здійснюється в спеціальному вікні. Викличте його за допомогою команди ImageList Editor…, Що знаходиться в контекстному меню компонента ImageList (Рисунок 8.24).



Рисунок 8.24. Виклик вікна для редагування списку значків


Крок 25. У вікні (рисунок 8.25) натисніть кнопку Add… і виберіть декілька файлів з колекції малюнків на компакт-диску (каталог Images).



Рисунок 8.25. Вікно, в якому редагується список значків


У цьому вікні параметри Transparent Color, Fill Color і Options потребують поясненні. Параметр Transparent Color – Це колір пікселів, які стають прозорими. Установки Options і Fill Color використовуються, якщо розміри малюнка не збігаються з розмірами, зазначеними у властивостях Width і Height компонента ImageList. Параметр Options приймає наступні значення: Crop – Заповнити зайві пікселі кольором Fill Color (Або відсікти праву нижню частину малюнка, якщо малюнок перевищує розміри); Stretch – Розтягнути / стиснути рисунок до прийнятих розмірів; Center – Центрувати малюнок, заповнивши залишилася область кольором Fill Color.


Закрийте діалогове вікно за допомогою кнопки OK.


Крок 26. Список значків ми підготували. Тепер потрібно вказати нашу компоненту MainMenu, Звідки брати значки для своїх пунктів. Виділіть компонент MainMenu на формі і перейдіть до властивості Images у вікні властивостей. Зі списку значень властивості Images виберіть елемент ImageList.


Крок 27. Тепер залишилося вказати пункти меню номери відповідних їм значків. Для цього викличте дизайнер меню для компонента MainMenu. Як це зробити, ви вже знаєте. Далі виберіть пункт Open… (Програмний ідентифікатор OpenMenuItem), Перейдіть до властивості ImageIndex і виберіть із списку відповідний значок (рисунок 8.26).



Рисунок 8.26. Установка значка для пункту меню


Аналогічно встановіть номери відповідних значків для пунктів Save As…, Half Size, Normal Size і Double Size. Не лякайтеся зовнішнього вигляду значків в недоступних пунктах меню. Вони, як і текст, відображаються бляклими.


На малюнку 8.27 показана форма після додавання значків.



Рисунок 8.27. В меню додані значки


Крок 28. Тепер встановимо значки для пунктів контекстного меню нашої форми. Активізуйте форму PictureForm і виберіть на ній компонент PopupMenu. Потім у вікні властивостей перейдіть до властивості Images та зі списку значень цієї властивості виберіть елемент ImageList. Після цього викличте дизайнер меню у компонента PopupMenu, І аналогічно тому, як ви це робили в головному меню, призначте номера відповідних значків для пунктів Half Size, Normal Size і Double Size контекстного меню.


Увага! Значок, заданий за допомогою властивості Bitmap, Використовується лише в разі, коли властивість ImageIndex містить від’ємне число. Тому якщо ви виявите, що установка значка за допомогою властивості Bitmap не приносить бажаного результату, не панікуйте, а просто перевірте властивість ImageIndex.


Крок 29. До речі, ми зовсім забули про значок, все ще зберігається у властивості Bitmap компонента OpenMenuItem. Зараз в ньому немає необхідності, оскільки реально використовується значок, заданий за допомогою властивості ImageIndex. Щоб не тримати в програмі непотрібні дані, видаліть значок з властивості Bitmap. Для цього викличте дизайнер меню для компонента MainMenu і виберіть пункт Open…. Далі у вікні властивостей перейдіть до властивості Bitmap і натисніть клавішу Del, Після чого натисніть клавішу Enter.


Тепер ми впритул наблизилися до повноцінного додатком для перегляду графічних файлів.


8.2. Повноцінне додаток для перегляду графічних файлів


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



Перше завдання вирішується за допомогою стандартних діалогових компонентів OpenDialog і SaveDialog, Друга – за допомогою спеціального компонента Image.


8.2.1. Діалогові вікна відкриття та збереження файлу


Шаг 30. Діалогові вікна для вибору відкривається або файлу організовуються за допомогою компонентів OpenDialog і SaveDialog (Рисунок 8.29). Знайти їх в палітрі компонентів на вкладці Dialogs і помістіть на форму. Перший компонент назвіть OpenDialog, А другий – SaveDialog.



Рисунок 8.28. Компоненти OpenDialog і SaveDialog


Характерні властивості цих компонентів коротко описані в таблиці 8.6.




















































Властивість Опис
DefaultExt Розширення, яке додається до імені файлу, якщо користувач його не вказав.
FileName Ім’я вибраного файлу.
Filter Фільтри імені файлу.
FilterIndex Номер активного фільтра.
InitialDir Початковий каталог, що відкривається при першій появі вікна діалогу.
Options Параметри, що визначають зовнішній вигляд і поведінка вікна діалогу. (Див. таблицю 8.7).
OptionsEx Додаткові параметри, що визначають зовнішній вигляд і поведінка вікна діалогу (див. таблицю 8.7).
Title Заголовок вікна діалогу. Якщо значення властивості не вказано, то заголовок буде стандартним – Open (Відкрити) або Save (Зберегти) в залежності від типу компонента.
OnCanClose Відбувається, коли користувач намагається закрити вікно діалогу. Дозволяє виконати додаткові перевірки та скасувати закриття вікна при необхідності.
OnClose Відбувається безпосередньо перед закриттям форми після події OnCanClose.
OnFolderChange Відбувається, якщо користувач переходить в інший каталог.
OnIncludeItem Відбувається при додаванні кожного файлу в список відображуваних у вікні файлів. Дозволяє виконувати додаткову фільтрацію файлів.
OnSelectionChange Відбувається при зміні виділеного файлу або списку файлів.
OnShow Відбувається безпосередньо перед відображенням вікна діалогу на екрані.
OnTypeChange Відбувається, коли користувач вибирає фільтр.
Таблиця 8.6. Найважливіші властивості та події компонентів OpenDialog і SaveDialog.

Компоненти OpenDialog і SaveDialog дуже схожі між собою, обидва є об’єктно-орієнтованими оболонками стандартних діалогових вікон Windows: Open і Save. На наступному малюнку показано вікно Open (рисунок 8.29).



Рисунок 8.29. Стандартне вікно Open для вибору файлу,


Приблизний сценарій роботи з кожним з компонентів OpenDialog і SaveDialog такий. Компонент поміщається на форму і конфігурується для вибору тих чи інших файлів. За командою меню Open… або Save As… у відповідного компонента викликається метод Execute. Він викликає діалог і повертає значення True, Якщо користувач вибрав файл. Повний маршрут до файлу запам’ятовується у властивості FileName. Хід подальших дій залежить прикладної від завдання і, як правило, включає або читання, або запис файлу, в залежності від оброблюваної команди меню.


Дотримуючись написаного сценарію, пристосуємо частини OpenDialog і SaveDialog для вибору графічних файлів, які підтримуються нашою програмою. Щоб користувач міг переглядати файли вибірково (якогось одного типу) в діалогових блоках є набір фільтрів, оформлений у вигляді розкривного списку з підписом Files of type (Див. рис. Вище). Вихідні дані для цього списку встановлюються у властивості Filter. Номер активного в даний момент фільтра записується у властивості FilterIndex.


Крок 31. Приступимо до формування списку фільтрів. Активізуйте на формі компонент OpenDialog і у вікні властивостей виберіть властивість Filter (Рисунок 8.30). Клацанням кнопки з трьома крапками відкрийте редактор фільтрів – вікно Filter Editor (Рисунок 8.31).



Рисунок 8.30. Натискання кнопки з трьома крапками викликає редактор фільтрів


Вікно Filter Editor являє собою список з двома стовпцями. У лівій колонці вводиться текст, який відображається в списку Files of type вікна діалогу. У правому стовпчику через крапку з комою записуються маски, на підставі яких виконується фільтрація файлів.


Крок 32. Встановіть у компоненті OpenDialog фільтри, як показано на малюнку 8.31.



Рисунок 8.31. Вікно для редагування фільтрів – Filter Editor


Крок 33. Аналогічним чином встановіть фільтри в компоненті SaveDialog. Самий простий і швидкий спосіб в даному випадку – скопіювати текст властивості Filter з компонента OpenDialog в компонент SaveDialog через буфер обміну (результат показаний на малюнку 8.32):



Рисунок 8.32. Фільтри для вікна Save скопійовані з вікна Open


Компоненти OpenDialog і SaveDialog мають велику кількість булевских параметрів, організованих у вигляді складових властивостей Options і OptionsEx. Ці параметри впливають на те, як вікно діалогу виглядає і працює. Їх сенс пояснює таблиця 8.7.












































































Параметр Опис
ofReadOnly Якщо одно True, то перемикач Read-only у вікні діалогу включений.
ofOverwritePrompt Якщо одно True, то користувачеві видається попередження при спробі зберегти файл з ім’ям, яке вже існує.
ofHideReadOnly Якщо одно True, то перемикач Read-only відсутня у вікні діалогу.
ofNoChangeDir Якщо одно True, то користувач не зможе змінити каталог у вікні діалогу.
ofShowHelp Якщо одно True, то у вікні діалогу присутня кнопка Help.
ofNoValidate Якщо одно True, то користувач може вводити в імені файлу будь-які символи, навіть неприпустимі.
ofAllowMultiSelect Якщо одно True, то користувач може виділити відразу декілька файлів.
ofExtensionDifferent Цей параметр встановлюється після завершення діалогу, якщо розширення в імені файлу відрізняється від початкового розширення.
ofPathMustExist Якщо одно True, то користувач не зможе ввести для файлу неіснуючий маршрут.
ofFileMustExist Якщо одно True, то користувач не зможе ввести ім’я неіснуючого файла.
ofCreatePrompt Якщо одно True і користувач вводить ім’я неіснуючого файла, то користувачеві задається питання, чи бажає він створити новий файл з таким ім’ям.
ofShareAware Якщо одно True, то помилки одночасного доступу до файлу з боку декількох додатків ігноруються.
ofNoReadOnlyReturn Якщо одно True, то користувач не зможе ввести файл з атрибутом read-only (тільки для читання).
ofNoTestFileCreate Якщо одно True, то перевірка на можливість запису в каталог не виконується.
ofNoNetworkButton Якщо одно True, то кнопка Network відсутня у вікні діалогу. Цей параметр працює тільки в парі з параметром ofOldStyleDialog.
ofNoLongNames Якщо одно True, то довгі імена файлів заборонені.
ofOldStyleDialog Якщо одно True, то вікно діалогу відображається в старому стилі Windows 3.1.
ofNoDereferenceLinks Якщо одно True, то ярлики до каталогів трактуються як звичайні файли. В іншому випадку вони трактуються як каталоги.
ofEnableIncludeNotify Якщо одно True, то при формуванні списку відображуваних файлів відбувається подія OnIncludeItem (для кожного файлу). В обробнику цієї події зазвичай виконується додаткова фільтрація файлів.
ofEnableSizing Якщо дорівнює значенню True, то користувач має можливість змінювати розміри вікна діалогу.
ofDontAddToRecent Якщо дорівнює значенню True, то файл не поміщається в список останніх відкритих файлів.
ofShowHidden Якщо одно True, то у вікні показуються приховані файли (файли з атрибутом Hidden).
ofExNoPlaceBar Якщо одно True, то бічна панель не показується у вікні діалогу. Прапорець ofExNoPlaceBar відноситься до властивості OptionsEx.
Таблиця 8.7. Параметри компонентів OpenDialog і SaveDialog

Крок 34. У нашому простому прикладі обмежимося тим, що встановимо в компоненті SaveDialog параметр ofOverwritePrompt в значення True (Див. табл. 6.6).


Зауважимо, що перевірити роботу компонентів OpenDialog і SaveDialog можна за допомогою команди Test Dialog. Вона знаходиться в контекстному меню значка компонента у формі.


8.2.2. Відображення малюнків


Крок 35. Ну ось, діалогові компоненти налаштовані. Тепер потрібен компонент, що забезпечує відображення малюнків різних форматів. Такий компонент в середовищі Delphi є, він називається Image і знаходиться в палітрі компонентів на вкладці Additional (Рисунок 8.33). Виберіть його з палітри і помістіть на форму. Назвіть новий компонент Image, А властивостями Left і Top встановіть значення 0.



Рисунок 8.33. Компонент Image


Характерні властивості компонента Image коротко описані в таблиці 8.8.































Властивість Опис
AutoSize Якщо дорівнює значенню True, То розміри компонента автоматично підганяються під розміри малюнка.
Center Центрує малюнок в межах компонента.
IncrementalDisplay Забезпечує поступове (у міру завантаження) відображення великих малюнків. Використовується для усунення ефекту блокування користувача введення під час відображення малюнка.
Picture Містить малюнок, який відображається в області компонента. Властивість Picture є об’єктом класу TPicture і може зберігати точковий малюнок (bitmap), метафайл (metafile), значок (icon).
Proportional Якщо дорівнює значенню True, то при масштабуванні зберігається пропорція між вертикальним і горизонтальним розмірами малюнка.
Stretch Якщо дорівнює значенню True, то малюнок масштабується так, щоб його розміри збігалися з розмірами компонента. Масштабування виконується тільки для точкових рисунків і метафайлів.
Transparent Якщо дорівнює значенню True, то фон малюнків стає прозорим. Ефект з’являється тільки після установки властивості Picture.
OnProgress Відбувається по мірі виконання тривалих операцій, наприклад під час завантаження великих малюнків.
Таблиця 8.8. Основні властивості компонента Image

Компонент Image дозволяє відображати малюнки різних форматів: точкові малюнки (BMP), значки (ICO), метафайли (WMF, EMF). Сам малюнок зберігається у властивості Picture.


Крок 36. Розміри встановленого малюнка можуть не збігатися з поточними розмірами компонента. В цьому випадку зайва частина зображення відсікається. Щоб підігнати розміри компонента під розміри малюнка установіть властивість AutoSize в значення True (рисунок 8.34). Після цього при кожній установці властивості Picture розміри компонента (але не малюнка) будуть змінюватися автоматично.



Рисунок 8.34. Властивість AutoSize в компоненті Image встановлено в значення True


Буває і зворотна ситуація, коли потрібно підігнати розміри малюнка під задані розміри компонента. Для цього властивість Stretch встановлюється в значення True, а AutoSize – В значення False. Масштабування доцільно застосовувати тільки для векторних зображень; для точкових малюнків воно не завжди дає приємний результат – починає позначатися точкова природа зображення.


Зараз компонент Image знаходиться на своєму місці і підготовлений до роботи (властивість AutoSize має значення True). Розглянемо, як здійснюється завантаження і збереження малюнка по командам меню Open… і Save As… .


Крок 37. У початковому тексті вже є недописаний обробник команди Open…. У ньому потрібно викликати стандартне діалогове вікно відкриття файлу і завантажити малюнок в тому випадку, якщо користувач ввів в цьому вікні назва файлу:





procedure TPictureForm.OpenMenuItemClick(Sender: TObject);
begin
if OpenDialog.Execute then
begin
Image.Picture.LoadFromFile(OpenDialog.FileName);
EnableCommands(True);
NormalSizeMenuItem.Click;
end;
end;

В даному обробнику зверніть увагу на виклик методу Click у компонента NormalSizeItem. Він імітує вибір пункту меню Normal Size, Щоб відразу після завантаження малюнок мав нормальний розмір.


Шаг 38. Пункт меню Save As… ще не має обробника події OnClick, Тому вам доведеться його створити (нагадаємо, що це робиться у вікні властивостей на вкладці Events). Обробка команди Save As… складається у виклику стандартного діалогового вікна Save з подальшому збереженням малюнка в файлі:





procedure TPictureForm.SaveAsMenuItemClick(Sender: TObject);
begin
if SaveDialog.Execute then
Image.Picture.SaveToFile(SaveDialog.FileName);
end;

Крок 39. Щоб наш приклад, нарешті, запрацював, залишилося дописати кілька обробників подій. В обробнику команди меню Close додамо оператори видалення малюнка з компонента Image і зменшення розмірів компонента до нуля, щоб у відсутність малюнка компонент не займав місця на формі:





procedure TPictureForm.CloseMenuItemClick(Sender: TObject);
begin
with Image do
begin
Picture := nil;
Width := 0;
Height := 0;
end;
NormalSizeMenuItem.Click;
EnableCommands(False);
end;

Крок 40. Ще залишилися незавершеними обробники команд меню Half Size, Normal Size і Double Size, Які теж потрібно доопрацювати. З ними ви легко розберетеся:





procedure TPictureForm.HalfSizeMenuItemClick(Sender: TObject);
begin
HalfSizeMenuItem.Checked := True;
HalfSizePopupItem.Checked := True;
with Image do
begin
AutoSize := False;
Width := Picture.Width div 2;
Height := Picture.Height div 2;
Stretch := True;
end;
end;
procedure TPictureForm.NormalSizeMenuItemClick(Sender: TObject);
begin
NormalSizeMenuItem.Checked := True;
NormalSizePopupItem.Checked := True; Image.AutoSize: = True; / / відновити нормальних розмірів компонента
end;
procedure TPictureForm.DoubleSizeMenuItemClick(Sender: TObject);
begin
DoubleSizeMenuItem.Checked := True;
DoubleSizePopupItem.Checked := True;
with Image do
begin
AutoSize := False;
Width := Picture.Width * 2;
Height := Picture.Height * 2;
Stretch := True;
end;
end;

У першому наближенні програма для перегляду графічних файлів готова. Виконайте компіляцію програми і перевірте її працездатність. Наприклад, відкрийте файл Chemical.bmp із стандартної колекції зображень середовища Delphi (C: Program FilesCommon FilesBorland SharedImagesSplash256Color). Вашому погляду постане наступна картина (малюнок 8.35):



Рисунок 8.35. Програма для перегляду графічних файлів у роботі


Увага! У каталозі C: ​​Program FilesCommon FilesBorland SharedImages ви знайдете для своїх додатків багато корисних і красивих точкових малюнків, значків, курсорів. Якщо ви ще не дослідили цей каталог, то зробіть це за допомогою своєї програми.


Експериментуючи з додатком, зверніть увагу на здатність форми прокручувати малюнки, які в ній не вміщаються. Це явище називається автоматичною прокруткою. Автоматична прокрутка не вимагає ніяких турбот з боку програміста і дуже добре виручає в тих випадках, коли зображення перевищує розміри робочої області форми.


8.3. Рядок стану


8.3.1. Створення рядка стану


Рядок стану (status bar) – це панель у нижній частині вікна, призначена для виведення допоміжної інформації: параметрів документа, з яким рабо

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*