Delphi实用教程 第5章 多窗体和MDI窗体 第5章 多窗体和MDI窗体
5.1 多窗体基本概念 一个应用程序能够同时打开多个文档窗体,而且这些窗体的外观基本一致,具有共同的系统菜单,每个文档窗体彼此之间可以相互切换,这种应用程序称为多文档程序。 第5章 多窗体和MDI窗体
5.2 多窗体应用程序设计 5.2.1 窗体的创建 新建一个项目时,项目中已包含了一个名为Form1的窗体。若要向项目中加入新的窗体,有两种方法: 执行FileNewForm菜单命令,项目中会增加一个名为Form2的新窗体,按此方法,可以为程序加入多个窗体; 使用窗体模板,Delphi 7的设计思想是代码重用性,所以系统提供了一些用户可重复应用的窗体模板。 例: 要为项目增加一个About对话框窗体,可以选择FileOther菜单命令,在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 窗体的创建 可以动态地创建该窗体对象,而当该窗体关闭时,即将该窗体清除出内存。 要实现这种操作,首先使用ProjectOptions菜单命令打开Form 选项卡。将AboutBox窗体移动到右侧的列表框,即不允许系统 自动创建AboutBox窗体。 添加代码实现动态创建: procedure TForm1.AboutExecute(Sender: TObjict); var About:TAboutBox; begin About:=TAboutBox.Create(Self); try About.ShowModal; finally About.Free; end; 第5章 多窗体和MDI窗体
5.2.2 窗体的调用 两种方法调用: Show方法:调用模态窗体 ShowModal方法:调用非模态窗体 两者的返回值用来表明对话框是如何关闭的。 第5章 多窗体和MDI窗体
5.2.3 窗体的重用 创建窗体模板 创建窗体样本。 在(1)所创建的窗体区域中单击鼠标右键,在快捷菜单中选择Add To Repository命令项,弹出Add To Repository对话框。 第5章 多窗体和MDI窗体
5.2.3 窗体的重用 (3) 设置所创建窗体模板的属性。 (4) 单击OK按钮,在所弹出的确认对话框中单击Yes按钮,即 可将窗体Form1存储为模板。 (5) 通过选择主菜单的NewOther…命令项,打开New Items对 话框的Dialogs选项卡,可以看到新增了一个窗体模板,这样 就可以使用这个模板为项目增加新的窗体了。 选择窗体模板对话框 第5章 多窗体和MDI窗体
5.2.3 窗体的重用 2. 使用Frame对象 利用Frame对象可以将几个组件封装在一起,工作时可以像使用普通组件一样,将这个Frame组件放置在窗体上,可以设置这个Frame组件的属性和事件。 【例】使用Frame对象进行组件封装。 (1)选择FileNewFrame菜单命令,将新建一个空的Frame 窗体 (2)在Frame窗体中放置一个Memo组件和三个Button组件,进一步 设置这些组件的属性,并编写组件事件的处理过程。 第5章 多窗体和MDI窗体
5.2.3 窗体的重用 (3)选择主菜单的FileSave命令项,保存这个Frame窗体的单 元文件。 (4)将所创建的Frame对象加入到组件选项页中。在Frame2窗体 区域,在弹出菜单的快捷菜单中选择Add To Palette菜单命 令,就会弹出对话框,在该对话框的Component name编辑框 中填入组件名,然后在下拉列表中选择希望加入的组件选项 页,最后可用Change…按钮选择一个合适的组件模板图标。 新增加的组件 设置组件模板属性 第5章 多窗体和MDI窗体
5.2.3 窗体的重用 (5) 使用自己创建Frame对象就像使用其他组件一样。 Frame对象 Form窗口中放置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)选择FileNewForm菜单项,新建窗体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)选择FileNewOther…菜单命令,打开New Items对 话框。 (2)在New Items对话框中选择Projects选项卡,双击其中 的MDI Application,将弹出Select Directory对话框, 在其中选择保存路径,单击OK。 Select Directory对话框 第5章 多窗体和MDI窗体
两个子窗体,可通过选择主菜单的ViewForms菜单命令,打开View Form对话框,从中选择它们来查看。 创建MDI应用程序界面框架 两个子窗体,可通过选择主菜单的ViewForms菜单命令,打开View Form对话框,从中选择它们来查看。 新创建MDI应用程序 View Form对话框 第5章 多窗体和MDI窗体
5.3.3 合并菜单 合并父子菜单项 如果子窗体的某菜单项的GroupIndex属性与主窗体的某菜单 单项将插入到主窗体菜单条上。 第5章 多窗体和MDI窗体
5.3.3 合并菜单 【例】对应用程序进行菜单合并。 首先,双击该组件 设置GroupIndex值分别为为1,2,3,8 然后,选中File菜单项 第5章 多窗体和MDI窗体
5.3.3 合并菜单 子窗口菜单的处理: 设置GroupIndex值为1 设置GroupIndex值为4 自动生成的File菜单 添加Setup菜单项后的子窗体 第5章 多窗体和MDI窗体
子窗体的File菜单取代了主窗体的File菜单 5.3.3 合并菜单 运行程序: 增加了Setup菜单项 主窗体菜单 子窗体的File菜单取代了主窗体的File菜单 子窗体菜单,新的主窗体菜单 第5章 多窗体和MDI窗体
5.3.3 合并菜单 要调用主窗体过程,只需引用该单元即可,即在MDIChild单元文件接口部分添加以下行: (1) 添加组件 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的 OnExecute事件的处理过程。 Action编辑框属性设置 第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); If FontDialog1.Execute then Font:=FontDialog1.Font; Procedure TMDIFileChild.FilesaveExecute(Sender:Tobject); Var Filename:String; Filename:=SaveDialog1.FileName; Memo1.Lines.SaveToFile(FileName); 第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); PrinterSetupDialog1.Execute 第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窗体