Підручник по delphi 4 - створення додатка mdi

Створення програми MDI

Термін MDI (Multiple Document Interface) дослівно означає багатодокументний інтерфейс і описує додатки, здатні завантажити і використовувати одночасно кілька документів або об'єктів. Прикладом такого додатка може служити диспетчер файлів (File Manager).






Зазвичай MDI-додатки складаються мінімум з двох форм - батьківської і дочірньою. Властивість батьківської форми FormStyle встановлено рівним fsMDIForm. Для дочірньої форми встановіть стиль fsMDIChild.
Батьківська форма служить контейнером, що містить дочірні форми, які укладені в клієнтську область і можуть переміщатися, змінювати розміри, мінімізуватися або максимизироваться. У вашому додатку можуть бути дочірні форми різних типів, наприклад одна - для обробки зображень, а інша - для роботи з текстом.

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

У цьому фрагменті коду оголошується клас TForm1.
Другим є місце, в якому описується змінна класу.

var Form1: TForm1;

Тут описана змінна Form1, яка вказує на екземпляр класу TForm1 і доступна з будь-якого модуля. Зазвичай вона використовується під час роботи програми для управління формою.
Третє місце знаходиться в початковому тексті проекту, доступ до якого можна отримати за допомогою меню View / Project Source. Цей код виглядає як:

Процес видалення форм обробляється за допомогою концепції власників об'єктів: коли об'єкт знищується, автоматично знищуються всі об'єкти, якими він володіє. Створена описаним чином форма належить об'єкту Application і знищується при закритті програми.

Динамічне створення форм
Хоча автоматичне створення форм корисно при розробці SDI-додатків, при створенні MDI-додатку воно, як правило, є неприйнятним.
Для створення нового екземпляра форми використовуйте конструктор Create класу форми. Наведений нижче код створює новий екземпляр TForm1 під час роботи програми і встановлює його властивість Caption рівним 'New Form'.

Form1: = TForm1.Create (Application);
Form1.Caption: = 'New Form';

Конструктор Create отримує від вас як параметр нащадка TComponent, який і буде власником вашої форми. Зазвичай в якості власника виступає Application, щоб всі форми були автоматично закриті після закінчення роботи програми. Ви можете також передати параметр Nil, створивши форму без власника (або володіє собою - як вам більше подобається), але тоді закривати і знищувати її доведеться вам. У разі виникнення необроблюваної помилки така форма залишиться в пам'яті, що не говорить про високий професіоналізм програміста.
У наведеному нижче коді Form1 вказує тільки на останню створену форму. Якщо вам це не подобається, скористайтеся наведеними нижче кодом - можливо, він більш точно відповідає вашим запитам:

with TFormI.Create (Application) do
Caption: = 'New Form';

Порада: При розробці MDI-додатки метод Show не потрібен, так як Delphi автоматично показує всі новостворені дочірні MDI-форми. У разі SDI-додатки ви зобов'язані використовувати метод Show.

Навіть при динамічному створенні форм Delphi спробує нав'язати вам свої послуги зі створення екземпляра кожної форми. Щоб відмовитися від них, скористайтеся діалоговим вікном Project Options, зображеним на рис. 1.14, і видаліть класи форм зі списку Auto-create forms.

Підручник по delphi 4 - створення додатка mdi
Мал. 1.14. Діалогове вікно Project Options дозволяє встановити опції для поточного проекту

Якщо ви захочете отримати доступ до окремого дочірньому примірнику класу, використовуйте властивість MDIChildren, що описується в наступному розділі.

MDI-властивості TForm
Об'єкт TForm має кілька властивостей, специфічних для MDI-додатків.

ActiveMDIChild
Це властивість повертає дочірній об'єкт TForm, що має в даний час фокус введення. Воно корисно, коли батьківська форма містить панель інструментів або меню, команди яких поширюються на відкриту дочірню форму.
Наприклад, уявімо, що проект використовує дочірню форму, яка містить елемент TMemo, названий memDailyNotes. Ім'я класу цієї дочірньої форми-TfrmMDIChild. Батьківська форма містить кнопку Clear в панелі інструментів, яка видаляє вміст memDailyNotes в активній дочірній формі. Ось як це реалізується.

procedure TfrmMDIParent.spbtnClearClick (Sender: TObject);
begin
if not (ActiveMDIChild = Nil) then
if ActiveMDIChild is TfrmMDIChild then






TfrmMDIChild (ActiveMDIChild) .memDailyNotes.Clear;
end;

У першому рядку перевіряється, чи рівний ActiveMDIChild значенням Nil, так як в цьому випадку звернення до об'єкту викличе виняткову ситуацію.
Порада: ActiveMDIChild дорівнює Nil, якщо немає відкритих дочірніх форм або властивість FormStyle не дорівнює fsMDIForm.

Оскільки ActiveMDIChild повертає об'єкт TForm, компілятор не має доступу до memDailyNotes - об'єкту TfrmMDIChild. Другий рядок перевірять відповідність типів, тобто чи дійсно ActiveMDIChild вказує на об'єкт TfrmMDIChild.
Третій рядок виконує перетворення типу і викликає метод Clear компонента memDailyNotes.

MDIChildren і MDIChildCount
Властивість MDIChildren є масивом об'єктів TForm, що надають доступ до створених дочірнім формам. MDIChildCount повертає кількість елементів в масиві MDIChildren.
Зазвичай це властивість використовується при виконанні якої-небудь дії над всіма відкритими дочірніми формами. Ось код згортання всіх дочірніх форм командою Minimize All.

procedure TFormI.mnuMinimizeAllClick (Sender: TObject);
var
iCount: Integers;
begin
for iCount: = MDIChildCount-1 downto 0 do
MDIChildren [iCount] .WindowState: = wsMinimized;
end;

Якщо ви будете згортати вікна в порядку зростання елементів масиву, цикл буде працювати некоректно, тому що після згортання кожного вікна масив MDIChildren оновлюється і перевпорядковувати. і ви можете пропустити деякі елементи.

TileMode
Це - властивість перечислимого типу, що визначає, як батьківська форма розміщує дочірні при виклику методу Tile. Використовуються значення tbHorizontal (за замовчуванням) і tbVertical для розміщення форм по горизонталі і вертикалі.

WindowMenu
Професійні MDI-додатки дозволяють активізувати необхідне дочірнє вікно, вибравши його зі списку в меню. Властивість WindowMenu визначає об'єкт TMenuItem, який Delphi буде використовувати для виведення списку доступних дочірніх форм.
Для виведення списку TMenuItem має бути меню верхнього рівня. Це меню має властивість Caption, рівне swindow.

MDI-події TForm
У MDI-додатку подія OnActivate запускається тільки при перемиканні між дочірніми формами. Якщо фокус введення передається з НЕ MDI-форми в MDI-форму, генерується подія OnActivate батьківської форми, хоча її властивість Active ніколи і не встановлюється рівним True. Ця дивина насправді строго логічна: адже, якби OnActivate генерувався тільки для дочірніх форм, не було б ніякої можливості дізнатися про перехід фокусу вводу від іншої програми.

MDI-методи TFor m
Специфічні для MDI-форм методи перераховані нижче.
Arrangelcons вибудовує піктограми мінімізованих дочірніх форм в нижній частині батьківської форми.
Cascade має дочірні форми каскадом, так що видно всі їхні заголовки.
Next і Previous переходить від однієї дочірньої форми до іншої, як ніби ви натиснули або .
Tile вибудовує дочірні форми так, що вони не перекриваються.

створення інтерфейсу
Інтерфейс MDI-додатки дуже схожий на інтерфейс розробленого раніше SDI-додатки, але кожне зображення виводиться в окремій, а не в головній формі. Виконайте наступні дії для створення батьківської форми.

1. Виберіть команду File / New Application, і з'явиться порожнє додаток.
2. Встановіть наступні властивості.
властивість значення
Caption Image Viewer
FormStyle fsMDIForm
Name frmMDIParent ShowHint True

3. Помістіть компонент TPanel в форму. Встановіть наступні його властивості.
властивість значення
Align alTop
Caption -
4. Помістіть три компонента TSpeedButton в TPanel і назвіть їх spbtnLoad, spbtnStretch і spbtnCenter. Встановіть наступні їх властивості.
властивість значення
spbtnLoad.Hint Load
spbtnLoad.Left 8
spbtnLoad.Top 8
spbtnStretch.AllowAlIUp True
spbtnStretch.Grouplndex 1
spbtnStretch.Hint Stretch
spbtnStretch.Left 48
spbtnStretch.Top 8
spbtnCenter.AllowAlIUp True
spbtnCenter.Grouplndex 2
spbtnCenter.Hint Cente r
spbtnCenter.Left 80
spbtnCenter.Top 8
Властивості Glyph встановіть ті ж, що і для SDI-додатки.

5. Додайте в форму компонент TOpenDialog і встановіть наступні його властивості.
властивість значення
Filter Bitmaps (* .bmp)] *. Bmp
Name opndlgLoad
Options [ofPathMustExist, ofFileMustExist]

Тепер створимо дочірню форму.

1. Виберіть з меню File / New Form, і з'явиться порожня форма.
2. Встановіть наступні її властивості.
властивість значення
FormStyle fsMDIChild
Name frmMDIChild
Position poDefaultPosOnly
3. Помістіть компонент TImage до новоствореної форму і встановіть його наступні властивості.
властивість значення
Align alClient
Name imgMain

Видаліть дочірню форму зі списку автоматично створюваних форм наступним чином.

1. Виберіть команду Project / Options, і з'явиться діалогове вікно Project Options, показане на рис. 1.14.
2. Виберіть frmMDIChild в списку Auto-create forms.
3. Клацніть на кнопці. Форма frmMDIChild при цьому буде перенесена в список Avai lable forms.
4. Клацніть на кнопці ОК.

Тепер саме час зберегти проект, вибравши команду File / Save Project As. Збережіть Unit1 як MDIParent, а проект - як EgMDIApp.

написання коду
Створивши інтерфейс, перейдемо до написання вихідного тексту програми, який буде дуже схожий на код для SDI-додатки.
Спочатку завантажимо зображення. Введіть наступний код в обробник події OnClick компонента spbtnLoad.

procedure TfrmMDIParent.spbtnLoadClick (Sender: TObject);
begin
if opndlgLoad.Execute then
with TfrmMDIChild.Create (Application) do
begin
Caption: = opndlgLoad.FileName;
imgMain.Picture.LoadFromFile (opndlgLoad.FileName);
ClientWidth: = imgMain.Picture.Width;
ClientHeight: = imgMain.Picture.Height;
end;
end;

Після запуску діалогового вікна створюється новий екземпляр дочірньої форми і завантажується файл зображення. Після завантаження розміри дочірньої форми змінюються так, щоб можна було бачити все зображення.
Ще пара штріхов- і додаток запрацює, як і передбачалося. Оскільки модуль посилається на тип TfrmMDIChild, що знаходиться в модулі MDIChild, після рядка implementation слід додати ще один рядок:

Тепер можна приступити до компіляції і запуску додатка. Однак зауважте, що, коли ви натискаєте на кнопку Close, дочірня форма не закривається, а згортається в піктограму. Щоб змусити її закритися, слід додати в код обробника OnClose класу TfrmMDIChild маленьку деталь змінити властивість Action:

Компоненти TSpeedButton Stretch і Center виконують ті ж функції, що і в SDI-додатку, проте їх обробники події OnClick слід змінити таким чином

if not (ActiveMDIChild = Nil) then
if ActiveMDIChild 15 TfrmMDIChild then
TfrmMDIChild (ActiveMDIChild) .imgMain.Stretch: = spbthStretch.Down;

if not (ActiveMDIChild = Nil) then
if ActiveMDIChild is TfrmMDIChild then
TfrmMDIChild (ActiveMDIChild) .imgMain.Center: = spbthCenter.Down;

Залишається остання проблема - стану кнопок Stretch і Center однакові для всіх дочірніх форм Для вирішення цього завдання додайте в обробник події OnActivate класу TfrmMDIChild рядки.

frmMDIParent.spbtnStretch.Down: = imgMain.Stretch;
frmMDIParent.spbtnCenter.Down: = imgMain.Center;

І, нарешті, останній з останніх штріхов- в модулі MDIChild додайте після рядка implementation рядок.

Компілюйте, запускайте і дивіться. MDI-додаток створено!
ЗАСТЕРЕЖЕННЯ: В цьому прикладі присвоєння нового значення властивості Down класу TSpeedButton викликало подія Оn-click. Будьте обережні при написанні коду обробника події, який генерує нову подію шляхом присвоєння значення властивості, адже при цьому можна створити нескінченну рекурсію.







Схожі статті