Разработка SDI и MDI приложений (исходники, документация)

 В delphi реализован шаблон mdi application, позволяющий быстро построить начальный код приложения mdi. Рассмотрим основные функции этого инструментального средства.

Чтобы использовать шаблон mdi application, примените команду file/new меню delphi, из раскрывшегося диалогового окна выберите страницу projects, а затем mdi application. Определите каталог для проекта, и delphi произведет копирование файлов, которые вам необходимы для простого приложения mdi с инструментальной линейкой, строкой состояния и меню. При формировании этих составных частей шаблона будут производиться запросы.

На полученной форме размещены следующие компоненты: opendialog, imagelist, actionlist.

Форма, порожденная шаблоном, содержит стандартные элементы: главное меню, панель, используемую как инструментальная линейка, компонент statusbar1 и некоторые системные диалоговые панели. Программный код главной формы имеет следующее содержание:

uses childwin, about;

procedure tmainform.createmdi child(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.helpabout1 execute(sender: tobject);
begin
aboutbox.showmodal;
end;

procedure tmainform.fileexit1execute(sender: tobject);
begin
close;
end;

end.
Программный код для дочерней формы:
implementation

{$r *.dfm}

procedure tmdichild.formclose (sender: tobject; var action: tcloseaction);
begin
action:= cafree;
end;

end.

Как вы видите, программный код почти не отличается от того, какой вы создавали сами. Запустите приложение на компиляцию и попробуйте произвести необходимые действия, вы можете добавить нужные вам компоненты и программный код.

Приложения sdi

Название интерфейса одного документа (sdi) подразумевает, что эти приложения состоят из единственного окна. Многооконные приложения sdi могут выглядеть очень похожими на приложения mdi, но требуют больших усилий при программировании в зависимости от степени сложности, реализуемой в управлении окнами.

Примером сложного sdi-приложения является среда delphi. Оно допускает существование многих окон, которые привязаны к области клиента родительского окна. Приложение sdi обычно имеет окно, считающееся главным и состоящее часто из линейки меню.

Когда вы закрываете главное окно, сворачиваете или разворачиваете на весь экран, то вначале выполняются необходимые действия с родственными окнами. Например, прежде чем свернуть свое главное sdi-окно, среда delphi сворачивает все свое семейство окон.

Многооконные приложения sdi требуют некоторых усилий, если от них ожидаются действия подобные поведению mdi-приложений. Примером может служить поддержка меню главного окна во всем приложении, даже когда фокус ввода находится в другой форме. Например, главное окно может содержать меню file, которое вы хотите сделать доступным своему семейству окон sdi. В приложении mdi родительское меню доступно всегда, это не требует никаких программных затрат, поскольку является свойством родительского меню по определению. В приложении sdi по умолчанию меню - это просто меню текущего окна sdi. Если в текущем окне sdi нет меню (как, например, в инспекторе объекта), то по умолчанию, нажатие alt+f для вызова меню file не производит никакого действия. В данном случае должен быть написан дополнительный программный код, чтобы процесс главного окна обрабатывал запрошенный выбор меню.

Управление семейством окон sdi

Управление окном sdi отличается от управления окном mdi. В sdi нет специфических свойств, таких как activemdichild, помогающих управлять окнами. Здесь необходимо разрабатывать собственные средства управления.

Для того чтобы достичь функциональных возможностей sdi, как в delphi, необходимо идентифицировать каждое окно в качестве главного либо члена семейства. Причем члены семейства ведут себя так же, как обычные окна, позволяющие их открывать, свертывать, разворачивать на весь экран и закрывать по своему усмотрению. Но когда вы выполняете любую из этих операций на главном окне, то необходимо пересылать управляющие запросы членам семейства, например, закрывать окна членов семейства перед закрытием основного окна. В результате этого получается интерфейс, похожий на приложения mdi, но обладающий большей гибкостью. Конечно, расплатой за это будет дополнительный программный код.

Ключом к управлению окнами sdi является поддержка переменных - дескрипторов форм (form - handle) для тех окон sdi, которые являются управляемыми.
Манипуляция объектами главного окна sdi со стороны членов семейства достигается выполнением следующих действий: главное окно sdi обычно создает окна членов семейства во время выполнения программы; для этого необходимо включать ссылку на модуль окна - члена семейства в секцию uses главного окна, эта ссылка должна присутствовать как в mdi, так и в sdi для управления соответственно дочерними окнами и членами семейства.

Окно члена семейства sdi, которое требует доступа к объектам главной формы, таким как меню, должно включать ссылку на файл главного модуля. Правильное обслуживание окон членов семейства главным окном - это задача программирования на уровне главной формы.

В Репозитории имеется основная скелетная структура sdi. Этот шаблон уже снабжен набором компонентов визуальных и не визуальных, сконфигурированных так, чтобы у вас имелся исходный пункт для разработки приложения. По умолчанию на шаблоне приложения устанавливается меню, компонент opendialog, savedialog, imagelist, actionlist. В шаблоне организована строка состояния и окно about.

Программный код шаблона показан ниже:

procedure tsdiappform.filenew1 execute(sender: tobject);
begin
{ do nothing }
end;

procedure tsdiappform.fileopen1 execute(sender: tobject);
begin
opendialog.execute;
end;

procedure tsdiappform.filesave1 execute(sender: tobject);
begin
savedialog.execute;
end;

procedure tsdiappform.fileexit1 execute(sender: tobject);
begin
close;
end;

procedure tsdiappform.helpabout1 execute(sender: tobject);
begin
aboutbox.showmodal;
end;

end.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=3707