Delphi 实用教程

27
第5第 第第 第MDI第 Delphi 实实实实 实 5 实 实实 MDI 实

description

Delphi 实用教程. 第 5 章 多窗体和 MDI 窗体. 5.1 多窗体基本概念. 一个应用程序能够同时打开多个文档窗体,而且这些窗体的外观基本一致,具有共同的系统菜单,每个文档窗体彼此之间可以相互切换,这种应用程序称为多文档程序。. 5.2 多窗体应用程序设计 5.2.1 窗体的创建. 新建一个项目时,项目中已包含了一个名为 Form1 的窗体。若要向项目中加入新的窗体,有两种方法 : 执行 File  New  Form 菜单命令,项目中会增加一个名为 Form2 的新窗体,按此方法,可以为程序加入多个窗体; - PowerPoint PPT Presentation

Transcript of Delphi 实用教程

Page 1: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

Delphi 实用教程

第 5 章 多窗体和 MDI 窗体

Page 2: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

5.1 多窗体基本概念 一个应用程序能够同时打开多个文档窗体,而且这些窗体的外观基本一致,具有共同的系统菜单,每个文档窗体彼此之间可以相互切换,这种应用程序称为多文档程序。

Page 3: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

5.2 多窗体应用程序设计 5.2.1 窗体的创建

新建一个项目时,项目中已包含了一个名为 Form1 的窗体。若要向项目中加入新的窗体,有两种方法 :

1. 执行 FileNewForm 菜单命令,项目中会增加一个名为 Form2 的新窗体,按此方法,可以为程序加入多个窗体;

2. 使用窗体模板, Delphi 7 的设计思想是代码重用性,所以系统提供了一些用户可重复应用的窗体模板。例 :

要为项目增加一个 About 对话框窗体,可以选择 FileOther 菜单命令,在 Forms 选项卡中选择 About Box 对话框,项目中会增加一个 About 窗体。

Page 4: Delphi 实用教程

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.

Page 5: Delphi 实用教程

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; end;

Page 6: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

5.2.2 窗体的调用 两种方法调用 :

Show 方法 : 调用模态窗体 ShowModal 方法 : 调用非模态窗体

两者的返回值用来表明对话框是如何关闭的。

Page 7: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

5.2.3 窗体的重用 1. 创建窗体模板

(1) 创建窗体样本。

(2) 在 (1) 所创建的窗体区域中单击鼠标右键,在快捷菜单中选择 Add To Repository 命令项,弹出 Add To Repository 对话框。

Page 8: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

5.2.3 窗体的重用(3) 设置所创建窗体模板的属性。(4) 单击 OK 按钮,在所弹出的确认对话框中单击 Yes 按钮,即 可将窗体 Form1 存储为模板。 (5) 通过选择主菜单的 NewOther… 命令项,打开 New Items 对

话框的 Dialogs 选项卡,可以看到新增了一个窗体模板,这样 就可以使用这个模板为项目增加新的窗体了。

选择窗体模板对话框

Page 9: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

5.2.3 窗体的重用2. 使用 Frame 对象

利用 Frame 对象可以将几个组件封装在一起,工作时可以像使用普通组件一样,将这个 Frame 组件放置在窗体上,可以设置这个 Frame 组件的属性和事件。

【例】使用 Frame 对象进行组件封装。 ( 1 )选择 FileNewFrame 菜单命令,将新建一个空的 Frame 窗体 ( 2 )在 Frame 窗体中放置一个 Memo 组件和三个 Button 组件,进一步

设置这些组件的属性,并编写组件事件的处理过程。

Page 10: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

5.2.3 窗体的重用( 3 )选择主菜单的 FileSave 命令项,保存这个 Frame 窗体的单 元文件。( 4 )将所创建的 Frame 对象加入到组件选项页中。在 Frame2窗体 区域,在弹出菜单的快捷菜单中选择 Add To Palette 菜单命 令,就会弹出对话框,在该对话框的 Component name 编辑框 中填入组件名,然后在下拉列表中选择希望加入的组件选项 页,最后可用 Change… 按钮选择一个合适的组件模板图标。

设置组件模板属性 新增加的

组件

Page 11: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

5.2.3 窗体的重用(5) 使用自己创建 Frame 对象就像使用其他组件一样。

Form 窗口中放置 Frame 对象 Frame 对

Page 12: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

5.3 MDI 窗体5.3.1 MDI 窗体基本概念

MDI ( Multiple Document Interface )多文档界面是一个能够同时处理多重文档的应用程序的用户界面和窗体结构。 MDI 中包含一个父窗体与多个子窗体,他们之间是一种隶属关系,而子窗体之间是一种平等的关系。每个子窗体都是一个独立的窗体,但它们没有菜单,只有父窗体才有菜单,不过这些菜单项同时也可以被用于子窗体,一次只有一个子窗体被激活,子窗体不能移动到父窗体以外的区域。

Page 13: Delphi 实用教程

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 键运行程序。

Page 14: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

5.3.2 建立 MDI 父子窗体

运行结果

Page 15: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

创建 MDI 应用程序界面框架【例】使用 Delphi 7 的创建 MDI 应用程序向导,创建一个 MDI应用程序。 ( 1 )选择 FileNewOther…菜单命令,打开 New Items 对

话框。( 2 )在 New Items 对话框中选择 Projects 选项卡,双击其中

的 MDI Application ,将弹出 Select Directory对话框, 在其中选择保存路径,单击 OK。

Select Directory 对话框

Page 16: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

创建 MDI 应用程序界面框架新创建 MDI 应用程序 两个子窗体,可通

过选择主菜单的 ViewForms 菜单

命令,打开 View Form 对话框,从中选择它们来查看。

View Form 对话框

Page 17: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

5.3.3 合并菜单 1. 合并父子菜单项

如果子窗体的某菜单项的 GroupIndex 属性与主窗体的某菜单项的 GroupIndex 属性值相同,则子窗体的菜单项将替代主窗体的菜单项;而子窗体中某个菜单项的 GroupIndex值与主窗体的所有菜单项的 GroupIndex 属性值都不相同,则子窗体菜单项将插入到主窗体菜单条上。

Page 18: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

5.3.3 合并菜单【例】对应用程序进行菜单合并。

首先,双击该组件

然后,选中 File 菜单项

最后,设置 GroupIndex值为 1

设 置 GroupIndex 值分别为为 1,2,3,8

Page 19: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

5.3.3 合并菜单子窗口菜单的处理 :

自动生成的 File 菜单 添加 Setup 菜单项后的子窗体

设置 GroupI

ndex值为 1 设置 GroupI

ndex值为 4

Page 20: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

5.3.3 合并菜单运行程序 : 增加了 Setup

菜单项

子窗体的 File 菜单取代了主窗体的 File 菜单

主窗体菜单

子窗体菜单 , 新的主窗体菜单

Page 21: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

5.3.3 合并菜单2. 调用父窗体

要调用主窗体过程,只需引用该单元即可,即在 MDIChild 单元文件接口部分添加以下行:

implementationuses Main;($R *.DFM)

3. 创建子窗体事件处理过程(1) 添加组件

将 Actionlist 组件放置到窗体左下方,用它来管理针对子窗体 的事件处理过程,然后在其旁边依次放置 SaveDialog、

FontDialog、 ColorDialog、 PrintDialog、 PrintersetupDialog 对 话框组件。

Page 22: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

5.3.3 合并菜单(2) 添加代码

双击 Actionlist 组件,在弹出的 Action 编辑器中选择“新建”,

在 Action 编辑器窗体中,双击右栏中的 Action 对象即可创建 Action 对象的事件处理过程。在这里仅给出相应 Action的 OnExecute 事件的处理过程。

Action 编辑框属性设置

Page 23: Delphi 实用教程

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;

Page 24: Delphi 实用教程

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;

Page 25: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

5.3.3 合并菜单(3) 建立连接

建立了代码,还必通过相应的连接,使菜单项能够调用这些 程序代码,双击子窗体中的 Mainmenu 组件,在 Action属性 中选择相应的子菜单项事件代码。(4) 按 F9 运行程序

打开一个子窗体,会发现 File 菜单项中不但具有相应的图标, 并且具备了文件保存、打印及设置功能。在 Setup 菜单项中, 或以设置文本字体,也可以更改文本编辑框背景颜色。

Page 26: Delphi 实用教程

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;

Page 27: Delphi 实用教程

5 MDI 第 章 多窗体和 窗体

5.3.4 排列与存取 MDI 子窗体4. ArrangeIcons 方法

重新排列最小化的图标.●在 Delphi 自动创建的 MDI 程序中,利用 Actionlist 提供的标准窗体事件都可以轻松完成。包括MDI 程序中的子窗体的层叠、平铺、重排、最小化及关闭动作,它们都是 TWindowAction 的派生类,并且只能作用于MDI 程序中的子窗体。

TWindowAction 对象的方法及说明