Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП (12 MDI).doc
Скачиваний:
1
Добавлен:
11.11.2019
Размер:
100.86 Кб
Скачать

1.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, оскільки в цьому випадку звернення до об'єкту викличе виняткову ситуацію.

2.MdiChildren і mdiChildCount

Властивість MDIChildren є масивом об'єктів TForm, що надають доступ до створених дочерним формам. MDIChildCount повертає кількість елементів в масиві MDIChildren.

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

  procedure TForm1.mnuMinimizeAllClick(Sender: TObject);

  var

  iCount: Integers;

  begin

  for iCount:=MDIChildCount-1 downto 0 do

  MDIChildren[iCount].WindowState:= wsMinimized;

  end;

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

3.TileMode

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

4.WindowMenu

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

Для виведення списку TMenuItem повинне бути меню верхнього рівня. Це меню має властивість Caption, рівне swindow.

MDI-подія Tform

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

MDI-методи Tform

Arrangelcons - вибудовує піктограми мінімізованих дочірніх форм в нижній частині батьківської форми.

Cascade - має в своєму розпорядженні дочірні форми каскад, так що видно всі їх заголовки.

Next і Previous - переходить від однієї дочірньої форми до іншої, неначе ви натиснули <Ctrl+Tab> або <Ctrl+Shift+Tab>.

Tile - вибудовує дочірні форми так, що вони не перекриваються.

Приклад MDI-приложения

У розробленому програмному коді розширюються можливості проглядання зображень.

Створення інтерфейсу

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

  1. Виберіть команду File/New Application, і з'явиться порожнє застосування.

  2. Встановите наступні властивості.

    Властивість

    Значення

    Caption FormStyle Name

    mage Viewer fsMDIForm frmMDIParent  ShowHint  True

  3. Помістите компонент TPanel у форму. Встановите наступні його властивості.

    Властивість

    Значення

    Align Caption

    alTop -

  4. Помістіть три компоненти TSpeedButton в TPanel і назвіть їх spbtnLoad, spbtnStretch і spbtnCenter. Встановите наступні їх властивості.

Властивість

Значення

spbtnLoad.Hint spbtnLoad.Left spbtnLoad.Top spbtnStretch.AllowAlIUp spbtnStretch.Grouplndex spbtnStretch.Hint spbtnStretch.Left spbtnStretch.Top spbtnCenter.AllowAlIUp spbtnCenter.Grouplndex spbtnCenter.Hint spbtnCenter.Left spbtnCenter.Top

Load 8 8 True 1 Stretch 48 8 True 2 Center 80 8

  1. Властивості Glyph встановите ті ж, що і для SDI-приложения.

  2. Додайте у форму компонент TOpenDialog і встановіть наступні його властивості.

Властивість

Значення

Filter Name Options

Bitmaps (*.bmp)]*.bmp opndlgLoad [ofPathMustExist,ofFileMustExist]


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

1. Виберіть з меню File/New Form, і з'явиться порожня форма.

2. Встановите наступні її властивості.

Властивість

Значення

FormStyle Name Position

fsMDIChild frmMDIChild poDefaultPosOnly


Властивість

Значення

Align Name

alClient imgMain


3. Помістите компонент TImage в знов створену форму і встановите його наступні властивості.

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

1. Виберіть команду Project/ Options, і з'явиться діалогове вікно Project Options

2. Виберіть frmMDIChild в списку Auto-create forms.

3. Клацніть на кнопці. Форма frmMDIChild при цьому буде перенесена в список Available 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 слід додати ще один рядок:

  uses MDIChild;

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

  Action:=caFree;

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

ifnot (ActiveMDIChild=Nil) then

  if ActiveMDIChild is TfrmMDIChild then

  TfrmMDIChild(ActiveMDIChild).imgMain.Stretch:= spbthStretch.Down;

і

ifnot (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 рядок.

  uses MDIParent;

MDI-приложение створене.