Delphi mdi формы как в 1с
Для того чтобы создать готовый шаблон, следует выполнить команду File / New / Other и на странице Projects выбрать пиктограмму MDI Application (Что такое MDI?) .
Как видим, в приложении уже имеются меню, стандартные диалоги, кнопки. Теперь откомпилируем и проверяем работу этих элементов. Обратите внимание, в шаблоне не используются кнопки Save и Save As. поэтому на форму помещаем элемент SaveDialog. Далее создаем обработчики события для сохранения документов.
procedure TMainForm.FileSaveItemClick(Sender: TObject);
var
Child: TMDIChild ;
begin
Name := Child.Caption;
if SaveDialog1.Execute then Child.Memo1.Lines.SaveToFile(Name);
end;
А в конце изменяем содержимое формы About.
Я также добавил обработку для просмотра изображений, создав дополнительную форму MDIPic.
Вот коды для каждой кнопки меню и горячих клавиш.
.
procedure TMainForm.CreateMDIChild(const Name: string);
var
Child: TMDIChild;
begin
< create a new MDI child window >
Child := TMDIChild.Create(Application);
Child.Caption := Name;
if FileExists(Name) then Child.Memo1.Lines.LoadFromFile(Name);
end;
procedure TMainForm.FileNew1Execute(Sender: TObject);
begin
CreateMDIChild('NONAME' + IntToStr(MDIChildCount + 1));
end;
procedure TMainForm.FileOpen1Execute(Sender: TObject);
begin
if OpenDialog.Execute then
CreateMDIChild(OpenDialog.FileName);
end;
procedure TMainForm.FileSaveItemClick(Sender: TObject);
var
Child: TMDIChild;
begin
Name := Child.Caption;
if SaveDialog1.Execute then Child.Memo1.Lines.SaveToFile(Name);
end;
procedure TMainForm.N3Click(Sender: TObject);
var
Child: TMdiPic;
Name: string;
begin
if (OpenDialog.Execute) then
Name := OpenDialog.FileName;
Child := TMDIPic.Create(Application);
Child.Caption := Name;
if FileExists(Name) then Child.Image1.Picture.LoadFromFile(Name);
end;
procedure TMainForm.FileSaveAsItemClick(Sender: TObject);
var
Child: TMDIChild;
begin
if SaveDialog1.Execute then Child.Memo1.Lines.SaveToFile(SaveDialog1.FileName);
end;
.
В Делфи существует два подхода к созданию MDI приложений - первый - посредством шаблонов, второй - с нуля и своими ручонками =) Если вы лентяй и у вас стоит Borland Delphi 5 или выше, вы можете воспользоваться первым подходом. Вот как это можно сделать - запустите делфи, создайте "свежий проект", выбрав в меню File | New | Other, затем выберите в появившемся окне вкладку Projects и в ней MDI Application. В результате у вас появится готовый проект - шаблон, единственное, что для вас остается - немного пофантазировать и добавить необходимый вам код.
Второй путь более трудоемкий. Вначале вы должны спроектировать главную форму. Делаете это, как если бы вы делали обычный проект, обычное приложение. Сохраняете, запускаете и пока что все. Главное условие, чтобы на форме было свободное место, место для дочерних окон, поэтому на форму обычно перекидывают из видимых компонентов только три (обязательных) : TMainMenu, TToolBar и TStatusBar. Далее - самое интересное. Изменим свойство FormStyle главного окна на fsMDIForm и создадим одну кнопку в компоненте TToolBar (для открытия дочерних окон) . На этом работа с главным окном временно закончена. Теперь создадим новый unit с новой формой и свяжем его с нашим проектом (прописав Uses unit2 к примеру) . Для вновь созданной формы изменим свойство FormStyle на fsMDIChild и обязательно опишем для нее событие OnClose:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
Это необходимо для того, чтобы наша дочерняя форма исчезала при закрытии, иначе она просто свернется и ее снова можно будет восстановить (она закроется только при закрытии всего приложения) . Работа со второй формой завершена, возвращаемся к первой (в исходном проекте) . Итак, все, что нам осталось здесь сделать - описать событие OnClick для кнопки TToolButton, которую мы создали на компоненте TToolBar:
procedure TForm1.ToolButton1Click(Sender: TObject);
begin
TForm2.Create(application);
end;
Обязательно пишите перед именем дочерней формы букву "Т" (TForm2), иначе получите ошибку при нажатии на кнопку. Теперь наше простое MDI приложение готово - сохраняйтесь, компилируйте и запускайте приложение.
мышкой их подвинь там где хочешь чтоб они появлялись и скопилируй exe заново
так же в инспекторе объектов есть параметры где будет появляться окно
внутри главной формы:
1. Окно не выходит за пределы формы. . Обработай OnMove сравнивай позиции главной и текущей. .
2. Посмотри технологию Drag&Dock
На этом шаге мы рассмотрим создание MDI -приложений.
Термин MDI (Multiple Document Interface) дословно означает многодокументный интерфейс и описывает приложения, способные загрузить и использовать одновременно несколько документов или объектов. Примером такого приложения может служить диспетчер файлов (File Manager).
Обычно MDI -приложения состоят минимум из двух форм - родительской и дочерней . Свойство родительской формы FormStyle установлено равным fsMDIForm . Стиль дочерней формы - fsMDIChild .
Родительская форма служит контейнером, содержащим дочерние формы, которые заключены в клиентскую область и могут перемещаться, изменять размеры, минимизироваться или максимизироваться. В приложении могут быть дочерние формы разных типов, например одна - для обработки изображений, а другая - для работы с текстом.
В MDI-приложении, как правило, требуется выводить несколько экземпляров классов формы. Поскольку каждая форма представляет собой объект, она должна быть создана перед использованием и освобождена, когда в ней больше не нуждаются. Delphi может делать это автоматически, а может предоставить эту работу программисту.
Автоматическое создание форм
По умолчанию при запуске приложения Delphi автоматически создает по одному экземпляру каждого класса форм в проекте и освобождает их при завершении программы. Автоматическое создание обрабатывается генерируемым Delphi кодом в трех местах.
Первое - раздел интерфейса в файле модуля формы.
Вторым является место, в котором описывается переменная класса:
Здесь описана переменная Form1 , указывающая на экземпляр класса TForm1 и доступная из любого модуля. Обычно она используется во время работы программы для управления формой.
Третье место находится в исходном тексте проекта, доступ к которому можно получить с помощью меню View | Project Source . Этот код выглядит как:
Процесс удаления форм обрабатывается с помощью концепции владельцев объектов: когда объект уничтожается, автоматически уничтожаются все объекты, которыми он владеет. Созданная описанным образом форма принадлежит объекту Application и уничтожается при закрытии приложения.
Динамическое создание форм
Хотя автоматическое создание форм полезно при разработке однодокументных приложений, при создании MDI -приложении оно, как правило, неприемлемо.
Для создания нового экземпляра формы используйте конструктор Create класса формы. Приведенный ниже код создает новый экземпляр TForm1 во время работы программы и устанавливает его свойство Caption равным New Form :
Конструктор Create получает в качестве параметра-потомка объект типа TComponent , который будет владельцем формы. Обычно в качестве владельца выступает Application . Это делается для того, чтобы все формы были автоматически закрыты по окончанию работы приложения. Можно также в качестве параметра использовать значение Nil , создав, тем самым, форму без владельца. Однако в этом случае закрывать и уничтожать ее должен программист. В случае возникновения необрабатываемой ошибки такая форма останется в памяти.
Примечание . При разработке MDI -приложения метод Show не нужен, так как Delphi автоматически показывает все вновь созданные дочерние MDI -формы. В случае однодокументного приложения использование метода Show обязательно.
Даже при динамическом создании форм Delphi попытается "помочь" в создании экземпляра каждой формы. Чтобы отказаться от них, нужно в диалоговом окне Project Options (вызывается при выполнении пункта меню Project | Options ) удалить классы форм из списка Auto-create forms :
Рис.1. Окно Project | Options
Если требуется получить доступ к отдельному дочернему экземпляру класса, используйте свойство MDIChildren , описываемое в следующем разделе.
MDI-свойства TForm
Объект TForm имеет несколько свойств, специфичных для MDI -приложений. Перечислим их.
-
property ActiveMDIChild: TForm; . Это свойство возвращает дочерний объект TForm , имеющий в текущее время фокус ввода. Оно полезно, когда родительская форма содержит панель инструментов или меню, команды которых распространяются на открытую дочернюю форму. Например, представим, что проект использует дочернюю форму, содержащую элемент ТМеmо , названный memDailyNotes . Имя класса этой дочерней формы - TfrmMDIChild . Родительская форма содержит кнопку Clear в панели инструментов, которая удаляет содержимое memDailyNotes в активной дочерней форме. Вот как это реализуется:
В первой строке проверяется, равен ли ActiveMDIChild значению Nil , так как в этом случае обращение к объекту вызовет исключительную ситуацию.
Примечание . Свойство ActiveMDIChild равно Nil в том случае, если нет открытых дочерних форм или свойство FormStyle не равно fsMDIForm .
Поскольку ActiveMDIChild возвращает объект TForm , компилятор не имеет доступа к memDailyNotes - объекту TfrmMDIChild . Вторая строка проверят соответствие типов, то есть действительно ли свойство ActiveMDIChild указывает на объект TfrmMDIChild . Третья строка выполняет преобразование типа и вызывает метод Clear компонента memDailyNotes .
Обычно это свойство используется при выполнении какого-либо действия над всеми открытыми дочерними формами. Вот код сворачивания всех дочерних форм при щелчке на кнопке с именем Button1 :
MDI-события и MDI-методы TForm
В MDI -приложении событие OnActivate запускается только при переключении между дочерними формами. Если фокус ввода передается из не MDI -формы в MDI -форму, генерируется событие OnActivate родительской формы, хотя ее свойство Active никогда и не устанавливается равным True . Эта странность на самом деле строго логична: ведь, если бы OnActivate генерировался только для дочерних форм, не было бы никакой возможности узнать о переходе фокуса ввода от другого приложения.
- procedure ArrangeIcons; - выстраивает пиктограммы минимизированных дочерних форм в нижней части родительской формы;
- procedure Cascade - располагает дочерние формы каскадом, так что видны все их заголовки;
- procedure Next; procedure Previous; - переходит от одной дочерней формы к другой, как-будто нажаты клавиши Ctrl+Tab или Ctrl+Shift+Tab ;
- procedure Tile; - выстраивает дочерние формы так, что они не перекрываются.
Пример MDI-приложения
- Caption: Image Viewer;
- FormStyle: fsMDIForm;
- Name: frmMDIParent;
- ShowHint: True.
- Name: spbtnLoad;
- Hint: Load;
- Left: 8;
- Top: 8.
- Filter: Bitmaps (*.bmp)|*.bmp;
- Name: opndlgLoad;
- Options: [ofPathMustExist,ofFileMustExist].
- FormStyle: fsMDIChild;
- Name: frmMDIChild;
- Position: poDefaultPosOnly.
- выполним пункт меню Project | Options , и появится диалоговое окно Project Options , показанное на рисунке 1;
- выберем форму frmMDIChild в списке Auto-create forms ;
- щелкнем на кнопке ">" . Форма frmMDIChild при этом будет перенесена в список Available forms .
Создав интерфейс, перейдем к написанию исходного текста приложения.
Сначала загрузим изображение. Следующий код будет размещаться в обработчике события OnClick компонента spbtnLoad :
После запуска диалогового окна создается новый экземпляр дочерней формы и загружается файл изображения. После загрузки размеры дочерней формы изменяются так, чтобы можно было видеть все изображение.
Поскольку модуль ссылается на тип TfrmMDIChild , находящийся в модуле MDIChild , то после строки implementation следует добавить еще одну строку:
Теперь можно приступить к компиляции и запуску приложения. Однако по щелчку на кнопке Close дочерняя форма не закрывается, а сворачивается в пиктограмму. Чтобы заставить ее закрыться, следует в код обработчика OnClose класса TfrmMDIChild внести изменение свойства Action :
Существуют два основных стиля интерфейсов пользователя: интерфейс с одним документом (single-document interface, SDI) и интерфейс со многими документами (multiple-document interface, MDI). Текстовый редактор с интерфейсом SDI позволяет открыть только один документ - чтобы открыть другой, следует закрыть предыдущий. В приложении MDI Вы можете открыть сразу несколько документов.
Контейнер для форм
В приложение Visual Basic можно добавить MDI форму, которая будет служить контейнером для подчиненных форм. Подчиненная форма - это обычная форма, у которой значение свойства MDIChild равно True. В режиме выполнения подчиненные окна помещаются внутри родительского окна MDI формы. Меню команд MDI формы может быть общим для всех подчиненных окон, или, если подчиненная форма имеет собственное меню команд, оно замещает меню формы контейнера. При закрытии формы-контейнера закрываются все подчиненные формы.
В приложении MDI можно открыть много окон построенных по одному образцу. При этом в режиме проектирования создается один экземпляр формы. Для того чтобы в режиме выполнения открыть много окон в коде программы создаются новые экземпляры подчиненной формы.
Поскольку много подчиненных форм имеют одинаковое имя и одинаковый код, то не следует в коде программы (если код используется несколькими экземплярами формы) использовать имя формы. В модуле формы для ссылок на текущую форму используйте ключевое слово Me.
На форму MDI можно поместить управляющий элемент, если он имеет свойство Align (Выстроить) или является невидимым в режиме выполнения.
Создадим Текстовый редактор
Простой текстовый редактор имеет интерфейс MDI.
Создайте форму-контейнер командой Add => MDI Form, меню Project.
На форме Form1 создайте текстовое поле Text1 и установите для него свойство Multiline в True, Top и Left в 0.
Свойство MDIChild установите в True.
Создайте процедуру Form_Resize, чтобы размеры текстового окна изменялись при изменении размеров формы:
Создайте меню Файл для формы MDIForm1. В процедуру создания нового документа добавьте код:
Код дочерней формы Form1:
Создайте новый пункт в меню Файл => Окна. Установите свойство WindowList - для отображения списка доступных окон, это свойство доступно лишь для MDI и подчиненных форм.
Меню в приложениях MDI
Обычно используется несколько наборов меню. Когда закрыты все документы, отображается меню MDI формы. Когда пользователь открывает документ, меню команд подчиненной формы замещает меню MDI формы. Панель инструментов располагается всегда в MDI форме.
Таким образом, некоторые команды могут быть в меню формы контейнера, в меню подчиненной формы и на панели инструментов. Чтобы не дублировать код, нужно создать открытую процедуру в подчиненной форме и вызывать ее из процедуры обработки событий.
Форма-контейнер может содержать несколько типов документов.
В меню Файл, MDI формы добавим пункт Новый Документ.
Меню команд подчиненной формы также содержит эту команд. Нужно написать процедуру создания нового документа и процедуры обработки для команд меню.
Код подчиненной формы:
Загрузка и выгрузка форм MDI и подчиненных форм
При загрузке подчиненной формы автоматически загружается и форма MDI. Однако при загрузке формы MDI, подчиненные формы автоматически не загружаются. Это можно увидеть, установив в качестве стартового объекта MDI форму. Можно загрузить подчиненные формы как скрытые, установив значение свойства AutoShowChildren в True и отобразить их в нужный момент методом Show.
Выгрузка формы выполняется по команде Unload в коде программы или при закрытии окна.
При этом выполняются обработки событий QueryUnload и Unload для формы, в которых можно отследить сохранение введенных данных. При выгрузке MDI формы выгружаются и все подчиненные формы. Команда End вызывает немедленное завершение программы, при этом не выполняется процедуры обработки событий.
Проверка были ли сохранены данные
В приложении MDI отслеживается сохранение данных. Если есть не сохранные данные при завершении работы программы или при закрытии одного документа, то данные могут быть сохранены по умолчанию.
Для получения информации о состоянии документа в модуле подчиненной формы введем логическую переменную:
Переменная fs получает значение True при любых изменениях в текстовом поле.
Пусть сохранение документа выполняется в процедуре SaveFile. Переменная fs получает значение False после сохранения документа.
Если при закрытии документа fs равно True, то функцию MsgBox выводит вопрос и возвращает ответ пользователя. Если ответ был Yes, то выполняется процедура SaveFile.
Термин MDI (Multiple Document Interface) дословно означает многодокументный интерфейс и описывает приложения, способные загрузить и использовать одновременно несколько документов или объектов. Примером такого приложения может служить диспетчер файлов (File Manager).
Обычно MDI-приложения состоят минимум из двух форм — родительской и дочерней. Свойство родительской формы FormStyle установлено равным fsMDIForm. Для дочерней формы установите стиль fsMDIChild.
Родительская форма служит контейнером, содержащим дочерние формы, которые заключены в клиентскую область и могут перемещаться, изменять размеры, минимизироваться или максимизироваться. В вашем приложении могут быть дочерние формы разных типов, например одна — для обработки изображений, а другая — для работы с текстом.
Создание форм
В MDI-приложении, как правило, требуется выводить несколько экземпляров классов формы. Поскольку каждая форма представляет собой объект, она должна быть создана перед использованием и освобождена, когда в ней больше не нуждаются. Delphi может делать это автоматически, а может предоставить эту работу вам
.
Автоматическое создание форм
По умолчанию при запуске приложения Delphi автоматически создает по одному экземпляру каждого класса форм в проекте и освобождает их при завершении программы. Автоматическое создание обрабатывается генерируемым Delphi кодом в трех местах.
Первое — раздел интерфейса в файле модуля формы.
В данном фрагменте кода объявляется класс TForm1.
Вторым является место, в котором описывается переменная класса.
Здесь описана переменная Form1, указывающая на экземпляр класса TForm1 и доступная из любого модуля. Обычно она используется во время работы программы для управления формой.
Третье место находится в исходном тексте проекта, доступ к которому можно получить с помощью меню View/ Project Source. Этот код выглядит как:
Процесс удаления форм обрабатывается с помощью концепции владельцев объектов: когда объект уничтожается, автоматически уничтожаются все объекты, которыми он владеет. Созданная описанным образом форма принадлежит объекту Application и уничтожается при закрытии приложения.
Динамическое создание форм
Хотя автоматическое создание форм полезно при разработке SDI-приложений, при создании MDI-приложении оно, как правило, неприемлемо.
Для создания нового экземпляра формы используйте конструктор Create класса формы. Приведенный ниже код создает новый экземпляр TForm1 во время работы программы и устанавливает его свойство Caption равным 'New Form'.
Конструктор Create получает от вас в качестве параметра потомка TComponent, который и будет владельцем вашей формы. Обычно в качестве владельца выступает Application, чтобы все формы были автоматически закрыты по окончании работы приложения. Вы можете также передать параметр Nil, создав форму без владельца (или владеющую собой — как вам больше нравится), но тогда закрывать и уничтожать ее придется вам. В случае возникновения необрабатываемой ошибки такая форма останется в памяти, что не говорит о высоком профессионализме программиста.
В приведенном ниже коде Form1 указывает только на последнюю созданную форму. Если вам это не нравится, воспользуйтесь приведенным ниже кодом — возможно, он более точно отвечает вашим запросам:
Совет: При разработке MDI-приложения метод Show не нужен, так как Delphi автоматически показывает все вновь созданные дочерние MDI-формы. В случае SDI-приложения вы обязаны использовать метод Show.
Даже при динамическом создании форм Delphi попытается навязать вам свои услуги по созданию экземпляра каждой формы. Чтобы отказаться от них, воспользуйтесь диалоговым окном Project Options, изображенным на рис. 1.14, и удалите классы форм из списка Auto-create forms. Рис. 1.14. Диалоговое окно Project Options позволяет установить опции для текущего проекта
Если вы захотите получить доступ к отдельному дочернему экземпляру класса, используйте свойство MDIChildren, описываемое в следующем разделе.
MDI-свойства TForm
Объект TForm имеет несколько свойств, специфичных для MDI-приложений.
ActiveMDIChild
Это свойство возвращает дочерний объект TForm, имеющий в текущее время фокус ввода. Оно полезно, когда родительская форма содержит панель инструментов или меню, команды которых распространяются на открытую дочернюю форму.
Например, представим, что проект использует дочернюю форму, содержащую элемент TMemo, названный memDailyNotes. Имя класса этой дочерней формы— TfrmMDIChild. Родительская форма содержит кнопку Clear в панели инструментов, которая удаляет содержимое memDailyNotes в активной дочерней форме. Вот как это реализуется.
В первой строке проверяется, равен ли ActiveMDIChild значению Nil, так как в этом случае обращение к объекту вызовет исключительную ситуацию.
Совет: ActiveMDIChild равен Nil, если нет открытых дочерних форм или свойство FormStyle не равно fsMDIForm.
Поскольку ActiveMDIChild возвращает объект TForm, компилятор не имеет доступа к memDailyNotes — объекту TfrmMDIChild. Вторая строка проверят соответствие типов, т.е. действительно ли ActiveMDIChild указывает на объект TfrmMDIChild.
Третья строка выполняет преобразование типа и вызывает метод Clear компонента memDailyNotes.
MDIChildren и MDIChildCount
Свойство MDIChildren является массивом объектов TForm, предоставляющих доступ к созданным дочерним формам. MDIChildCount возвращает количество элементов в массиве MDIChildren.
Обычно это свойство используется при выполнении какого-либо действия над всеми открытыми дочерними формами. Вот код сворачивания всех дочерних форм командой Minimize All.
Если вы будете сворачивать окна в порядке возрастания элементов массива, цикл будет работать некорректно, так как после сворачивания каждого окна массив MDIChildren обновляется и пересортировывается, и вы можете пропустить некоторые элементы.
TileMode
Это — свойство перечислимого типа, определяющее, как родительская форма размещает дочерние при вызове метода Tile. Используются значения tbHorizontal (по умолчанию) и tbVertical для размещения форм по горизонтали и вертикали.
WindowMenu
Профессиональные MDI-приложения позволяют активизировать необходимое дочернее окно, выбрав его из списка в меню. Свойство WindowMenu определяет объект TMenuItem, который Delphi будет использовать для вывода списка доступных дочерних форм.
Для вывода списка TMenuItem должно быть меню верхнего уровня. Это меню имеет свойство Caption, равное swindow.
MDI-события TForm
В MDI-приложении событие OnActivate запускается только при переключении между дочерними формами. Если фокус ввода передается из не MDI-формы в MDI-форму, генерируется событие OnActivate родительской формы, хотя ее свойство Active никогда и не устанавливается равным True. Эта странность на самом деле строго логична: ведь, если бы OnActivate генерировался только для дочерних форм, не было бы никакой возможности узнать о переходе фокуса ввода от другого приложения.
MDI-методы TForm
Специфичные для MDI-форм методы перечислены ниже.
Arrangelcons выстраивает пиктограммы минимизированных дочерних форм в нижней части родительской формы.
Cascade располагает дочерние формы каскадом, так что видны все их заголовки.
Next и Previous переходит от одной дочерней формы к другой, как будто вы нажали или .
Tile выстраивает дочерние формы так, что они не перекрываются.
Пример MDI-приложения
В этом разделе мы расширим возможности созданной ранее программы просмотра изображений.
Создание интерфейса
Интерфейс MDI-приложения очень похож на интерфейс разработанного ранее SDI-приложения, но каждое изображение выводится в отдельной, а не в главной форме. Выполните следующие действия для создания родительской формы.
1. Выберите команду File/New Application, и появится пустое приложение.
2. Установите следующие свойства.
3. Поместите компонент TPanel в форму. Установите следующие его свойства.
4. Поместите три компонента TSpeedButton в TPanel и назовите их spbtnLoad, spbtnStretch и spbtnCenter. Установите следующие их свойства.
Свойства Glyph установите те же, что и для SDI-приложения.
5. Добавьте в форму компонент TOpenDialog и установите следующие его свойства.
Теперь создадим дочернюю форму.
1. Выберите из меню File/New Form, и появится пустая форма.
2. Установите следующие ее свойства.
3. Поместите компонент TImage во вновь созданную форму и установите его следующие свойства.
Удалите дочернюю форму из списка автоматически создаваемых форм следующим образом.
1. Выберите команду Project/ Options, и появится диалоговое окно Project Options, показанное на рис. 1.14.
2. Выберите frmMDIChild в списке Auto-create forms.
3. Щелкните на кнопке. Форма frmMDIChild при этом будет перенесена в список Available forms.
4. Щелкните на кнопке ОК.
Теперь самое время сохранить проект, выбрав команду File/Save Project As. Сохраните Unit1 как MDIParent, а проект — как EgMDIApp.
Написание кода
Создав интерфейс, перейдем к написанию исходного текста приложения, который будет очень похож на код для SDI-приложения.
Сначала загрузим изображение. Введите следующий код в обработчик события OnClick компонента spbtnLoad.
После запуска диалогового окна создается новый экземпляр дочерней формы и загружается файл изображения. После загрузки размеры дочерней формы изменяются так, чтобы можно было видеть все изображение.
Еще пара штрихов— и приложение заработает, как и предусматривалось. Поскольку модуль ссылается на тип TfrmMDIChild, находящийся в модуле MDIChild, после строки implementation следует добавить еще одну строку:
Теперь можно приступить к компиляции и запуску приложения. Однако заметьте, что, когда вы щелкаете на кнопке Close, дочерняя форма не закрывается, а сворачивается в пиктограмму. Чтобы заставить ее закрыться, следует добавить в код обработчика OnClose класса TfrmMDIChild маленькую деталь— изменить свойство Action:
Компоненты TSpeedButton Stretch и Center выполняют те же функции, что и в SDI-приложении, однако их обработчики события OnClick следует изменить следующим образом
Остается последняя проблема — состояния кнопок Stretch и Center одинаковы для всех дочерних форм Для решения этой задачи добавьте в обработчик события OnActivate класса TfrmMDIChild строки.
И, наконец, самый последний из последних штрихов— в модуле MDIChild добавьте после строки implementation строку.
Компилируйте, запускайте и смотрите. MDI-приложение создано!
ПРЕДОСТЕРЕЖЕНИЕ: В этом примере присвоение нового значения свойству Down класса TSpeedButton вызывало событие Оn-click. Будьте осторожны при написании кода обработчика события, который генерирует новое событие путем присвоения значения свойству, ведь при этом можно создать бесконечную рекурсию.
Читайте также: