第05章多窗体和MDI窗体

Download Report

Transcript 第05章多窗体和MDI窗体

Delphi实用教程
第5章 多窗体和MDI窗体
第5章 多窗体和MDI窗体
5.1 多窗体基本概念
一个应用程序能够同时打开多个文档窗体,而且这些窗体的外观
基本一致,具有共同的系统菜单,每个文档窗体彼此之间可以相
互切换,这种应用程序称为多文档程序。
第5章 多窗体和MDI窗体
5.2 多窗体应用程序设计
5.2.1 窗体的创建
新建一个项目时,项目中已包含了一个名为Form1的窗体。若
要向项目中加入新的窗体,有两种方法:
1. 执行FileNewForm菜单命令,项目中会增加一个名为
Form2的新窗体,按此方法,可以为程序加入多个窗体;
2. 使用窗体模板,Delphi 7的设计思想是代码重用性,所以系统
提供了一些用户可重复应用的窗体模板。
例:
要为项目增加一个About对话框窗体,可以选择FileOther菜
单命令,在Forms选项卡中选择About Box对话框,项目中会
增加一个About窗体。
第5章 多窗体和MDI窗体
5.2.1 窗体的创建
在默认情况下,工程中所有的窗体在程序运行时都是自动创建的,
这是因为工程文件在执行时,由系统执行了创建窗体的过程。
例如包含了两个窗体的工程文件代码清单如下:
Program Project1;
uses
Forms,
Unit1 in 'Unit1.pas'{Form1},
Unit2 in 'Unit2.pas' {AboutBox};
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TForm1,Form1);
Application.CreateForm(TAboutBox,AboutBox);
Application.Run;
End.
第5章 多窗体和MDI窗体
5.2.1 窗体的创建
可以动态地创建该窗体对象,而当该窗体关闭时,即将该窗体清
除出内存。
要实现这种操作,首先使用ProjectOptions菜单命令打开Form
选项卡。将AboutBox窗体移动到右侧的列表框,即不允许系统
自动创建AboutBox窗体。
添加代码实现动态创建:
procedure
TForm1.AboutExecute(Sen
der: TObjict);
var About:TAboutBox;
begin
第5章 多窗体和MDI窗体
About:=TAboutBox.Create
(Self);
try
About.ShowModal;
finally
About.Free;
end;
end;
5.2.2 窗体的调用
两种方法调用:
Show方法:调用模态窗体
ShowModal方法:调用非模态窗体
两者的返回值用来表明对话框是如何关闭的。
第5章 多窗体和MDI窗体
5.2.3 窗体的重用
1.
创建窗体模板
(1) 创建窗体样本。
(2)
在(1)所创建的窗体区域中单击鼠标右键,在快捷菜单中选
择Add To Repository命令项,弹出Add To Repository对话框。
第5章 多窗体和MDI窗体
5.2.3 窗体的重用
(3) 设置所创建窗体模板的属性。
(4) 单击OK按钮,在所弹出的确认对话框中单击Yes按钮,即
可将窗体Form1存储为模板。
(5) 通过选择主菜单的NewOther…命令项,打开New Items对
话框的Dialogs选项卡,可以看到新增了一个窗体模板,这样
就可以使用这个模板为项目增加新的窗体了。
选择窗体模板对话框
第5章 多窗体和MDI窗体
5.2.3 窗体的重用
2. 使用Frame对象
利用Frame对象可以将几个组件封装在一起,工作时可以像使用普
通组件一样,将这个Frame组件放置在窗体上,可以设置这个Frame
组件的属性和事件。
【例】使用Frame对象进行组件封装。
(1)选择FileNewFrame菜单命令,将新建一个空的Frame 窗体
(2)在Frame窗体中放置一个Memo组件和三个Button组件,进一步
设置这些组件的属性,并编写组件事件的处理过程。
第5章 多窗体和MDI窗体
5.2.3 窗体的重用
(3)选择主菜单的FileSave命令项,保存这个Frame窗体的单
元文件。
(4)将所创建的Frame对象加入到组件选项页中。在Frame2窗体
区域,在弹出菜单的快捷菜单中选择Add To Palette菜单命
令,就会弹出对话框,在该对话框的Component name编辑框
中填入组件名,然后在下拉列表中选择希望加入的组件选项
页,最后可用Change…按钮选择一个合适的组件模板图标。
设置组件模板属性
第5章 多窗体和MDI窗体
新增加的
组件
5.2.3 窗体的重用
(5) 使用自己创建Frame对象就像使用其他组件一样。
Form窗口中放置Frame对象
Frame对
象
第5章 多窗体和MDI窗体
5.3 MDI窗体
5.3.1 MDI窗体基本概念
MDI(Multiple Document Interface)多文档界面是一个能够同时
处理多重文档的应用程序的用户界面和窗体结构。 MDI中包含一
个父窗体与多个子窗体,他们之间是一种隶属关系,而子窗体之
间是一种平等的关系。每个子窗体都是一个独立的窗体,但它们
没有菜单,只有父窗体才有菜单,不过这些菜单项同时也可以被
用于子窗体,一次只有一个子窗体被激活,子窗体不能移动到父
窗体以外的区域。
第5章 多窗体和MDI窗体
5.3.2 建立MDI父子窗体
1.创建父窗体
普通窗体的FormStyle属性设置为fsMDIForm即可
2. 创建子窗体
普通窗体的FormStyle属性设置为fsMDIChild即可。
【例】本例创建一个MDI应用程序,父窗体中含有3个子窗体。
(1)新建一个项目,将Form1窗体的Caption属性改为“父窗体”,
FormStyle属性设置为fsMDIForm。
(2)选择FileNewForm菜单项,新建窗体Form2,将Form2
的Caption属性改为“子窗体1”,FormStyle属性设置为fsMDIChild。
(3)按第2步的方法,再新建两个子窗体Form3和Form4,Canption属性
分别设置为“子窗体2”、“子窗体3”,FormStyle属性设置为
fsMDIChild均设置为fsMDIChild。
(4)按F9键运行程序。
第5章 多窗体和MDI窗体
5.3.2 建立MDI父子窗体
运行结果
第5章 多窗体和MDI窗体
创建MDI应用程序界面框架
【例】使用Delphi 7的创建MDI应用程序向导,创建一个MDI
应用程序。
(1)选择FileNewOther…菜单命令,打开New Items对
话框。
(2)在New Items对话框中选择Projects选项卡,双击其中
的MDI Application,将弹出Select Directory对话框,
在其中选择保存路径,单击OK。
Select Directory对话框
第5章 多窗体和MDI窗体
创建MDI应用程序界面框架
两个子窗体,可通
过选择主菜单的
ViewForms菜单
命令,打开View
Form对话框,从中
新创建MDI应用程序
选择它们来查看。
View Form对话框
第5章 多窗体和MDI窗体
5.3.3 合并菜单
1.
合并父子菜单项
如果子窗体的某菜单项的GroupIndex属性与主窗体的某菜单
项的GroupIndex属性值相同,则子窗体的菜单项将替代主窗
体的菜单项;而子窗体中某个菜单项的GroupIndex值与主窗
体的所有菜单项的GroupIndex属性值都不相同,则子窗体菜
单项将插入到主窗体菜单条上。
第5章 多窗体和MDI窗体
5.3.3 合并菜单
【例】对应用程序进行菜单合并。
首先,双击
该组件
设置GroupIndex值分
别为为1,2,3,8
最 后 , 设 置
GroupIndex值为1
然后,选中
File菜单项
第5章 多窗体和MDI窗体
5.3.3 合并菜单
子窗口菜单的处理:
设置
GroupIndex
设置
GroupIndex
值为1
值为4
自动生成的File菜单
第5章 多窗体和MDI窗体
添加Setup菜单项后的子窗体
5.3.3 合并菜单
运行程序:
增加了Setup
菜单项
主窗体菜单
子窗体的File菜单取代了
主窗体的File菜单
子窗体菜单,新的主
窗体菜单
第5章 多窗体和MDI窗体
5.3.3 合并菜单
2. 调用父窗体
要调用主窗体过程,只需引用该单元即可,即在MDIChild单元文
件接口部分添加以下行:
implementation
uses Main;
($R *.DFM)
3. 创建子窗体事件处理过程
(1) 添加组件
将Actionlist组件放置到窗体左下方,用它来管理针对子窗体
的事件处理过程,然后在其旁边依次放置SaveDialog、
FontDialog、ColorDialog、PrintDialog、PrintersetupDialog对
话框组件。
第5章 多窗体和MDI窗体
5.3.3 合并菜单
(2) 添加代码
双击Actionlist组件,在弹出的Action编辑器中选择“新建”,
Action编辑框属性设置
在Action编辑器窗体中,双击右栏中的Action对象即可创建
Action对象的事件处理过程。在这里仅给出相应Action的
OnExecute事件的处理过程。
第5章 多窗体和MDI窗体
5.3.3 合并菜单
Procedure TMDIFileChild.ColorSetupExecuse(Sender:Tobject)
Begin
If ColorDialog1.Execute then
Memo1.Color:=ColorDialog1.Color;
End;
Procedure TMIFileChild.FontSetupExecute(Sender:Tobject);
Begin
If FontDialog1.Execute then
Font:=FontDialog1.Font;
End;
Procedure TMDIFileChild.FilesaveExecute(Sender:Tobject);
Var Filename:String;
Begin
Filename:=SaveDialog1.FileName;
Memo1.Lines.SaveToFile(FileName);
End;
End;
第5章 多窗体和MDI窗体
5.3.3 合并菜单
Procedure TMDIFileChild.FilePrintExecute(Sender:Tobject);
Var
Line:Integer;
PrintText:System.text;
Begin
If PrintDialog1.Execute then
AssignPrn(PrintText);
Rewrite(PrintText);
Printer.Canvas.Font:=Memo1.Font;
For Line:=0 to Memo1.Lines.Count –1 do
Writeln(PrintText,Memo1.lines[Line]);
System.Close(PrintText);
End;
Procedure TMDIFileChild.PrintSetupSetup1Clicd(Sender: Tobject);
Begin
PrinterSetupDialog1.Execute
End;
第5章 多窗体和MDI窗体
5.3.3 合并菜单
(3) 建立连接
建立了代码,还必通过相应的连接,使菜单项能够调用这些
程序代码,双击子窗体中的Mainmenu组件,在Action属性
中选择相应的子菜单项事件代码。
(4)按F9运行程序
打开一个子窗体,会发现File菜单项中不但具有相应的图标,
并且具备了文件保存、打印及设置功能。在Setup菜单项中,
或以设置文本字体,也可以更改文本编辑框背景颜色。
第5章 多窗体和MDI窗体
5.3.4 排列与存取MDI子窗体
常用排列子窗体方法:
1. Cascade方法
子窗体的层叠排列
2. Tile方法
子窗体的平铺排列
TileMode属性,它有两种取值:
①tbHorizontal方式排列可使每个子窗体的
宽度扩展到父窗体的宽度
②tbVertical方式可使每个子窗体高度扩展
到父窗体的高度。
3. 关闭子窗体
窗体增加OnClose事件处理程序
procedureTMDIChild.FormClose(Sender:Tobject;var
Action:TcloseAction);
begin
Action:=caFree;
End;
第5章 多窗体和MDI窗体
5.3.4 排列与存取MDI子窗体
4. ArrangeIcons方法
重新排列最小化的图标.
●在Delphi自动创建的MDI程序中,利用Actionlist提供的标准窗
体事件都可以轻松完成。包括MDI程序中的子窗体的层叠、平
铺、重排、最小化及关闭动作,它们都是TWindowAction 的
派生类,并且只能作用于MDI程序中的子窗体。
TWindowAction对象的方法及说明
第5章 多窗体和MDI窗体