Розробка MDI додатків в Delphi (исходники, документація), Документація, Програмування, статті

Що таке MDI?
MDI розшифровується як multiple document interface (Багатодокументний інтерфейс). У додатках з MDI в основному (батьківському) вікні можна окрить більше одного дочірнього вікна. Дана можливість зазвичай використовується в електронних таблицях або текстових редакторах.


Кожне MDI додаток має три основні складові:
Одну (і тільки одну) батьківську форму MDI, Одну і більше (зазвичай більше) дочірніх форм MDI, і основне меню MDI.

MDI “мати”
Як уже згадувалося, в проекті MDI додатку може бути присутнім тільки один MDI контейнер (батьківська форма) і він повинен бути стартовою формою.
Для створення основного вікна MDI додатка виконайте наступні кроки:



  1. Запустіть Delphi і виберіть File / New Application … Delphi створить новий проект з однією формою під назвою form1 (за замовчуванням).

  2. У властивості Name привласніть формі ім’я frMain.

  3. Встановіть властивість FormStyle в fsMDIform.

  4. Збережіть цей проект (ім’я проекту на Ваш розсуд, наприклад prMDIExample), разом з uMain.pas у щойно створеної директорії.

Як Ви встигли помітити, для створення основної форми MDI, ми встановили властивість FormStyle в fsMDIform. У кожному додатку тільки одна форма може мати властивість fsMDIform.

MDI “діти”
Кожне батьківське вікно MDI потребує принаймні в одній дочірньої формі. Дочірні форми MDI – це прості форми, за винятком того, що їх видима частина обмежена розмірами батьківського вікна. Так само при мінімізації такого вікна, воно поміщається не в панель задач, а залишається усередині батьківського вікна (на панель задач потрапить тільки батьківське вікно).

Тепер давайте створимо додаткові форми, а точніше дочірні. Просто виберіть File / New Form. Буде створений новий об’єкт форми з ім’ям form1 (за замовчуванням). За допомогою Object Inspector змініть властивість Name у формі form1 на frChild, а властивість FormStyle на fsMDIChild. Збережіть цю форму з відповідним їй файлом як uchild.pas. Зверніть увагу, що за допомогою даної властивості ми можемо перетворити будь-яку існуючу форму в дочірню форму MDI.
Ваше додаток може включати безліч дочірніх MDI форм такого ж або іншого типу.

Так само хочеться звернути Вашу увагу, що MDI додаток може включати в себе і самі звичайні форми, але на відміну від дочірніх, вони будуть відображатися як звичайні модальні діалогові вікна (такі як about box, або файловий діалог).

Естевственно, що як на батьківських, так і на дочірньому вікнах можна розташовувати будь-які елементи управління, проте вже давно склалася традиція, що на батьківській формі розташовується панель статусу (status bar) і панель інструментів (toolbar), в той час як на дочірніх формах розташовуються всі інші контроли, такі як гріди, картинки, поля вводь і т. д.

Автосоданіе -> Доступні
Тепер давайте зробимо деякі настройки нашого проекту. Виберіть Project / Options, відкриється діалог опцій проекту (Project Options). У лівій панелі виберіть frChild (Авто-створення форм (“Auto-create forms “)), і перемістіть її в праву панель (Доступні форми (Available forms)). Список правій панелі містить ті форми, які використовуються Вашим додатком, але які не створені автоматично. У MDI додатку, за умовчанням, всі дочірні форми створюються автоматично і відображаються в батьківській формі.

Створення та відображення …
Як згадано вище, настройка не дозволяє автоматично створювати дочірні вікна, тому нам необхідно додати деякий код, який буде виробляти створення об’єкта форми frChild. Наступну функцію CreateChildForm необхідно помістити всередині основної форми (MDI батько) (поряд із заголовком в interface “s private):





uses uchild;

procedure TfrMain.CreateChildForm
(const childName : string);
var Child: TfrChild;
begin
Child := TfrChild.Create(Application);
Child.Caption := childName;
end;

Даний код створює одну дочірню форму з заголовком childName.
Не забудьте, що цей код знаходиться розділі “uses uchild”.

На закриття не мінімізувати!
Закриття дочірнього вікна в MDI додатку всього навсього мінімізує його в клієнтській області батьківського вікна. Тому ми повинні забезпечити процедуру OnClose, і встановити параметр Action в caFree:





procedure TfrChild.FormClose
(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;

Зверніть увагу, що якщо форма є дочірньою формою MDI, і її властивість BorderIcons встановлено в biMinimize (за замовчуванням), то знову ж таки за умовчанням параметр Action встановлений в caMinimize. Якщо ж у дочірньої формі MDI немає цих установок, то за замовчуванням Action встановлений як caNone, що означає, що при закритті форми нічого не трапиться.

MDI батьківське меню
Кожне MDI додаток повинен мати основне меню с (якщо більше нічого немає), опцією вирівнювання вікон. Оскільки ми попередньо перемістили дочірню форму з Авто-створюваних (Auto-create) в Доступні (Available) форми, то нам потрібен буде код, який (пункт меню) буде створювати дочірні форми.

Отже, перемістіть компонент TMainMenu на frMain (MDI батько) і приведіть його до наступного вигляду:

   

Для створення дочірніх вікон в нашому додатку буде використовуватися пункт меню “New child”. Друге меню (Window) буде використовуватися для вирівнювання дочірніх віконець всередині батьківського вікна-форми.

… Створити і відобразити
У висновку нам необхідно зробити обробник для пункту меню “New child”. При натисканні на пунк меню File / New Child нашого додатки, буде викликатися процедура NewChild1Click яка в свою чергу буде викликати процедуру CreateChildForm (наведену вище), для створення (наступного) примірника форми frChild.





procedure TfrMain.NewChild1Click(Sender: TObject);
begin
CreateChildForm(“Child “+IntToStr(MDIChildCount+1));
end;

Щойно створена дочірня форма буде мати заголовок у вигляді “Child x”, де x представляє кількість дочірніх форм всередині MDI форми, як описано нижче.

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





procedure TfrMain.CloseAll1Click(Sender: TObject);
var i: integer;
begin
for i:= 0 to MdiChildCount – 1 do
MDIChildren[i].Close;
end;

Вам прийдеться виконувати перевірку на предмет наявності незбереженої інформації в кожному дочірньому вікні. Для вирішення даного завдання краще всього використовувати обробник події OnCloseQuery.

Властивості MdiChildCount і MDIChildren
MdiChildCount властивість read only, що містить в собі кількість створених дочірніх віконець. Якщо не створено ні одне дочірнє вікно, то це властивість встановлено в 0. Нам прийдеться частенько використовувати MdiChildCount поряд з масивом MDIChildren. Масив MDIChildren містить посилання на об’єкти TForm всіх дочірніх віконець.

Зверніть увагу, що MDIChildCount перша створена дочірнього вікна дорівнює 1.

Меню Window
Delphi забезпечує більшість команд, які можна помістити всередині пункту меню Window. Далі наведено приклад виклику трьох основних методів для команд, які ми помістили в наш додаток:





procedure TfrMain.Cascade1Click(Sender: TObject);
begin
Cascade;
end;
procedure TfrMain.Tile1Click(Sender: TObject);
begin
Tile;
end;
procedure TfrMain.ArrangeAll1Click(Sender: TObject);
begin
ArrangeIcons;
end;

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


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

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

Ваш отзыв

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

*

*