100 Компонентів delphi
7.7 Фрейми
У Delphi 5 введений новий компонент, який допомагає підтримувати стилістичну єдність додатки. Це Frame - фрейм. Він являє собою щось середнє між панеллю і формою. З формою його ріднить те, що він:- проектується окремо, як самостійне вікно
- має свій модуль - файл .pas
- має можливості успадкування, причому навіть більш широкі, ніж у форми, так як може успадковуватися навіть всередині однієї програми
- може включатися в Депозитарій і використовуватися так само, як і форма, включаючи успадкування
- не є самостійним вікном Windows і може відображатися тільки на формі або іншому контейнері
- має властивості, методи, події, подібні панелі, а не формі
Таким чином, фрейм - це панель, тобто якийсь фрагмент вікна програми, але здатний переноситися на різні форми, в різні додатки і допускає використання переваг успадкування.
На фрейм ви можете так само, як на форму, переносити і розміщувати будь-які компоненти, встановлювати їх властивості, писати обробники їх подій і т.п.
Давайте створимо чисто тестовий фрейм, щоб на його прикладі продемонструвати проектування фрейму, його використання, доступ до різних його елементів і успадкування властивостей.
Почніть новий додаток і виконайте команду File | New Frame. Перенесіть на фрейм групову панель GroupBox (див. Розділ 7.2). Перенесіть на панель мітку Label і три кнопки Button. Додайте всі ці компоненти приблизно так, як показано на рис. 7.9, змінивши відповідно їх написи (Caption) і назвавши кнопки відповідно BSetup. BInc. BShow.
Давайте "> У модулі введені змінні:- А - введена в закритий розділ класу; видна тільки в процедурах даного класу в цьому модулі; незалежні один від одного змінні А будуть міститися в кожному об'єкті фрейма.
- В - введена в відкритий розділ класу; в інших модулях можна отримати доступ до В через ім'я об'єкта фрейму; незалежні один від одного змінні В міститимуться в кожному об'єкті фрейма.
- З - введена в відкритий інтерфейс поза описом класу; доступна в інших модулях; є єдиний екземпляр С. незалежно від числа об'єктів фреймів.
- D - введена в реалізацію класу; доступна тільки в даному модулі; є єдиний екземпляр D. незалежно від числа об'єктів фреймів.
Введені в модуль обробники клацаючи на кнопках забезпечують скидання всіх змінних на 1 (процедура TFrame2.BSetupClick), збільшення всіх змінних на 1 (процедура TFrame2.BIncClick), відображення поточного стану змінних (процедура TFrame2.BShowClick).
Тепер давайте розмістимо кілька примірників фрейму на формі. Перейдіть в основну форму додатка і виберіть в палітрі компонентів Frame (перша кнопка на сторінці Standard). З'явиться діалогове вікно, в якому буде питатися, який фрейм ви хочете розмістити на формі. Виберіть ваш фрейм Frame2 і він з'явиться на формі. Можете відбуксирувати його, як звичайний компонент, в потрібне місце. Повторіть цю операцію ще раз і розмістіть на формі другий фрейм (рис. 7.10). Додайте кнопку і мітку, задавши її властивість Align рівним alTop і властивість Alignment рівним taCenter.
Ви отримали форму, яка містить два об'єкти - фрейма. Можете змінити якісь властивості об'єктів. Наприклад, змінити написи (Caption) групових панелей GroupBox (див. Рис. 7.10 а).
Мал. 7.10
Приклад використання фреймів; форма (а) і додаток в роботі (б)
Після "> Тепер давайте напишемо обробник клацання на кнопці головної форми. Насамперед гляньте на текст модуля цієї форми. Ви побачите, що в ньому в описі класу форми з'явилися два рядки:
Помістіть в обробник клацання на цій кнопці оператор
Він відображає в мітці Label1 значення змінних У об'єктів фреймів і значення змінної С класу фрейму. Значення змінних А і D відобразити неможливо, оскільки ці змінні недоступні із зовнішніх модулів. Якщо ви попитаетес' відобразити їх значення, компілятор видасть повідомлення про помилку.
Збережіть ваш додаток, відтранслює його і виконайте. Маніпулюючи кнопками ви легко зможете переконатися (див. Рис. 7.10 б), що змінні А і В незалежні для кожного фрейму, а змінні С і D однакові. Точніше обидва фрейма оперують з одними і тими ж змінними С і D.
Розглянутий фрейм не мав ніякого практичного значення. Давайте побудуємо більше корисний приклад. У багатьох діалогах при установці різних опцій фігурує фрагмент, фрейм якого показаний на рис. 7.11. Фрагмент включає в себе панель GroupBox. вікно редагування, в якому користувач може написати ім'я файлу, і кнопку Огляд. яка дозволяє вибрати файл в стандартному діалозі Windows відкриття файлу. Якщо шлях до файлу довгий, то повне ім'я файлу з шляхом може не поміщатися в вікні редагування. Тому корисно для нього передбачити спливаюче вікно, яке відображало б повне ім'я файлу разом з шляхом і спливало б, якщо користувач затримав над ним курсор миші.
Давайте побудуємо подібний фрейм і випробуємо його в роботі. Почніть новий додаток і виконайте команду File | New Frame. Перенесіть на фрейм групову панель GroupBox. Перенесіть в цю панель вікно редагування Edit. кнопку Button. діалог OpenDialog (див. розділ 8.2) і компонент ApplicationEvents - перехоплювач подій додатки (див. розділ 9.4). Розмістіть компоненти приблизно так, як показано на рис. 7.11.
Задайте "> В обробник події OnShowHint компонента ApplicationEvents занесіть оператор:
Цей оператор в момент, коли повинен відображатися ярличок, перевіряє, чи не є джерелом цієї події (HintInfo.HintControl) вікно редагування Edit1. Якщо так, то текст ярлика (HintStr) підміняється текстом, що містяться у вікні редагування і вживаються заходи (метод CancelDispatch), щоб ця подія не оброблялося іншими компонентами ApplicationEvents. які можуть бути присутніми в додатку. Пояснення всіх цих операцій див. В розділі 9.4.
Тепер введіть в модуль фрейма глобальну змінну FileName типу string. в якій буде відображатися обраний файл. В обробник клацання на кнопці введіть оператор який викликає діалог відкриття файлу і поміщає в вікно редагування Edit1 і в змінну FileName ім'я файлу, обраного користувачем, разом з шляхом до нього.
В обробник події OnExit компонента Edit1 помістіть оператор заносить в змінну FileName ім'я файлу, якщо користувач не користувався діалогом, а просто написав у вікні ім'я файлу.
Програмування фрейма закінчено. Тепер створіть тестову програму, яка використовує цей фрейм. Припустимо, що вам потрібно розмістити на формі два фрагмента, описаних вами у фреймі. Перейдіть в основний модуль вашого застосування і розмістіть на формі так, як ви вже робили, два об'єкта вашого фрейму (рис. 7.12 а).
Мал. 7.12
Додатки з двома фреймами вибору файлу: його форма (а) і додаток під час виконання (б)
Тепер "> Ви розробили досить корисний фрейм і хотіли б його зберегти для використання в майбутніх додатках. Це легко зробити, внісши його у Депозитарій. Клацніть на своєму фреймі правою кнопкою миші і виберіть з сплив меню розділ Add To Repository. Перед вами відкриється вікно , представлене на рис. 7.13. у верхньому його вікні редагування Title ви повинні написати назву вашого фрейму - підпис під його піктограмою при вході в Депозитарій. у наступному вікні - Description можете написати більш розгорнуте пояснення. його може побачити користувач , Увійшовши в Депозитарій, клацнувши правою кнопкою миші і вибравши під сплив меню форму відображення View Details. У випадаючому списку Page ви можете вибрати сторінку Депозитарію, на якій хочете розмістити піктограму свого фрейму. Втім, ви можете вказати і нову сторінку з новим заголовком (Мої форми на рис. 7.13). в результаті вона з'явиться в Депозитарії.
Тепер ви можете використовувати його в наступних ваших додатках. Для цього вам треба буде виконати команду File | New і в діалоговому вікні New Items відшукати ваш фрейм (рис. 7.14).
Мал. 7.13
Вікно додавання фрейма в Депозитарій
Мал. 7.14
Вікно New Items з включеним новим фреймом
В "> Сору - копіювати, Inherit - успадковувати, Use - використовувати. Якщо включена кнопка Сору. То файли фрейма просто будуть скопійовані в вашу програму. При цьому ніякої подальшої зв'язку між вихідним фреймом і копією не буде. Ви можете спокійно змінювати властивості вашої копії і це ніяк не відіб'ється на фреймі, що зберігається в Депозитарії. А якщо ви в подальшому щось зміните у фреймі, що зберігається в Депозитарії, то ці зміни ніяк не торкнуться вашого застосування, куди ви до цього скопіювали фрейм.
При включеній кнопці Inherit ви отримаєте в своєму проекті фрейм, що успадковує розміщеному в Депозитарії. Це означає, що якщо ви щось зміните у фреймі, що зберігається в Депозитарії, то це відіб'ється при перекомпіляції у всіх проектах, які успадковують цей фрейм. Однак, зміни в успадкованих фреймах ніяк не позначаться на властивостях фрейму, що зберігається в Депозитарії.
При включеній кнопці Use ви отримаєте режим використання. В цьому випадку в ваш проект включиться сам фрейм, що зберігається в Депозитарії. Значить будь-яка зміна властивостей фрейма, зроблене в вашому проекті, відіб'ється і на що зберігається в Депозитарії фреймі, і на всіх проектах, які успадковують або використовують цей фрейм (при їх перекомпіляції).
Таким чином, режим Inherit доцільно використовувати для всіх модулів вашого проекту, а режим Use - для зміни базового фрейму. Тоді удосконалення вами базового фрейму буде синхронно позначатися на всіх модулях проекту при їх перекомпіляції.
Введений в Delphi 5 компонент фрейм завдяки використанню успадкування дозволяє забезпечити єдність стилістичних рішень не тільки всередині програми, але і в рамках серії розробляються вами додатків. Вам достатньо один раз розробити якісь часто застосовуються фрейми, включити їх в Депозитарій, а потім ви можете використовувати їх багаторазово у всіх своїх проектах.