Пример MDI-приложения
В этом разделе мы расширим возможности созданной ранее программы просмотра изображений.
Создание интерфейса
Интерфейс MDI-приложения очень похож на интерфейс разработанного ранее SDI-приложения, но каждое изображение выводится в отдельной, а не в главной форме. Выполните следующие действия для создания родительской формы.
Выберите команду File/New Application, и появится пустое приложение
Установите следующие свойства.
Свойство | Значение | Caption FormStyle Name ShowHint | Image Viewer fsMDIForm frmMDIParent True |
Поместите компонент TPanel в форму. Установите следующие его свойства.
Свойство | Значение | Align Caption | alTop - |
Поместите три компонента 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 |
Свойства Glyph установите те же, что и для SDI-приложения.
Добавьте в форму компонент TOpenDialog и установите следующие его свойства.
Свойство | Значение | Filter Name Options | Bitmaps (*.bmp)]*.bmp opndlgLoad ofPathMustExist,ofFileMustExist] |
Теперь создадим дочернюю форму.
Выберите из меню File/New Form, и появится пустая форма.
Установите следующие ее свойства.
Свойство | Значение | FormStyle Name Position | fsMDIChild frmMDIChild poDefaultPosOnly |
Поместите компонент TImage во вновь созданную форму и установите его следующие свойства.
Свойство | Значение | Align Name | alClient imgMain |
Удалите дочернюю форму из списка автоматически создаваемых форм следующим образом.
Выберите команду Project/ Options, и появится диалоговое окно Project Options, показанное на рис. 1.14.
Выберите frmMDIChild в списке Auto-create forms.
Щелкните на кнопке. Форма frmMDIChild при этом будет перенесена в список Available forms.
Щелкните на кнопке ОК.
Теперь самое время сохранить проект, выбрав команду 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 следует изменить следующим образом
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 строку.
uses MDIParent;
Компилируйте, запускайте и смотрите. MDI-приложение создано!
ПРЕДОСТЕРЕЖЕНИЕ: В этом примере присвоение нового значения свойству Down класса TSpeedButton вызывало событие Оn-click. Будьте осторожны при написании кода обработчика события, который генерирует новое событие путем присвоения значения свойству, ведь при этом можно создать бесконечную рекурсию.
1 2 3
8 8 8
| |