本章介绍多文本界面(MDI)多页面界面(MPI)技术VCL库中TMemoTEdit 控件以及有关文本编辑的常用对话框的使用我们开发的MPIEditdpr是一个文本编辑的实用程序可实现如下功能
● MDI的编辑环境
● MPI的编辑环境
● 创建打开编辑保存文件
● 查找替换文件中指定的字符串
● 复制粘贴剪切字符串
● 设置文件字体大小
● 打印文件
本章将通过MPIEdit实用程序逐一介绍在Delphi中如何实现上述功能
文本编辑器是一种常用的应用程序用户在编辑器中编辑多种文件在多个文件之间进行数据交换对文件进行各种属性设置并按自己要求打印文件
多文本界面
多文本界面是一种在一个应用程序中同时打开两个或更多文件的界面形式例如在字处理程序可同时打开多个文件用户可在多个文件中方便地进行切换
MDI应用程序提供了一种方便的方式使得用户在同一工作区域内对多个文档进行观察和交换数据MDI工作区域可分为父窗体和子窗体在Dephi的MDI应用程序中父窗体通常是程序的主窗体
在MDI中父窗体之外的窗体称为子窗体文档或其它数据在子窗体打开这些文档可以是相同的文件格式或在应用程序支持下也可以是不同的文件格式
在设计阶段可创建 MDI 父窗体作为应用程序主窗体 亦可创建子窗体样板Delphi允许创建多个子窗体类型但MDI应用程序只支持其中的一种
本节讲述创建MDI应用程序的基本步骤
● 创建主窗口
● 创建子窗口
● 创建主窗口菜单
● 融合菜单
● 运行时创建子窗口
创建父窗口
在MDI应用程序中主窗口为应用文档提供一个工作区域这个区域可打开一个或多个子窗口创建父窗口是建立MDI应用程序的第一步
创建父窗口与其它窗口类似不同之处在于设置窗体的FormStyle属性
FormStyle属性可决定一个窗体是父窗口还是子窗口或不是MDI类型 只能在设计阶段确定FormStyle在Object Inspector窗口中将FormStyle属性设置成fsMDIForm值得注意的是应当把父窗口定义为应用程序的主窗体否则程序编译会出错
创建子窗口
设计阶段可创建子窗口的样板用户在运行进使用样板的实例子窗口是缺省可见的如果应用程序在运行进创建子窗口不要让Delphi自动地创建
创建子窗口时将窗体的FormStyle属性设置为fsMDIChild如果程序在运行时创建子窗口则
选择OPtions|Project菜单系统弹出自动创建列表对话框
在自动创建列表中选中子窗口
单击>按钮将子窗口移至可得到(Available)窗体列表
并单击OK按钮退出
创建应用程序菜单与菜单融合
父窗口的菜单应作为应用程序主菜单如果子窗口有菜单 则当子窗口在运行获得焦点并最大化时子窗口的菜单项将融合父窗口菜单
创建父窗口与子窗口菜单的方法与创建普通窗体菜单类似 详细步骤见第一章菜单融合是指程序运行过程中子菜单与父窗口菜单的相互作用 如当子窗口获得焦点时子窗口的菜单或插入主窗口的菜单中或将替换部分或全部的父窗口菜单
进行菜单融合需设置的两个属性
● 窗体的Menu属性
● 菜单项的GroupIndex属性
Menu属性定义窗体的活动菜单而菜单融合只对活动菜单进行如果窗体有多个菜单部件运行时可通过以下代码进行改变
FormMenu := SecondMenu;
GroupIndex属性决定出现在菜单条中各菜单项的位置在菜单融合中GroupIndex 将
决定融合菜单是插入还是替换主窗体菜单条中的菜单
GroupIndex的缺省值是可以用下规则确定其值
数值越小菜单的位置越靠左
例如GroupIndex为的菜单将出现在菜单条中的最左端随着GroupIndex数值的增大菜单项依次向右排列
若需替换主菜单中的某一菜单项则将子菜单相应菜单项的GroupIndex设为与之相等的值这条规则适合一个或多个菜单项例如主菜单中的Edit菜单项的GroupIndex 的值为将子菜单的一个或多个菜单项的GroupIndext的值设为则在运行时这些菜单项替换主窗口的Edit菜单
将同一窗体的多个菜单项的GroupIndex设为相同值原有的排列顺序在菜单融合时将保持不变
若要在菜单融合时插入菜单项需在主菜单中预留数值位置例如主菜单的两菜单项数值为则子菜单GroupIndex数值为的菜单在融合时将插入其中
在使用MDI界面时用户通常会打开多个窗体为了使用户方便地进行窗体切换常设有一个进行切换的菜单项此菜单列出了打开窗体的名称当用户选择其中的一个时程序进行相应的窗体切换在Delphi的MDI设计时可非常方便地实现这一功能方法是将父窗口的WindowMenu设置成该菜单项的名字即可
多页面界面
多页面界面是一种非常友好的界面形式它由一个窗体和多个页面组成 关于每个页面的信息列在窗体底部的标签(Tabs)上用户可通过选择标签来进行页面切换 每次只有一个页面显示在窗体中MPI较MDI使用更为方便且切换速度更快本章例程就是多页面界面的例子另外Delphi集成开发环境中的代码编辑(Code Editor)窗体是MPI应用在文本编辑中的实例在MPI中一个窗体内的多个文件可以方便地进行切换和交换数据
多页面界面分为静态MPI和动态MPI两种形式静态MPI的标签数量固定用户在事先设计好的多个页面上进行切换象选择对话框(Option Dialog)就属于静MPI动态MPI的标签数量不固定由程序根据需要动态的产生或消除象代码编辑窗体就是动态MPI程序可根据用户的需要产生多个文本页面也可以动态地关闭页面利用Delphi的TNotebook和Ttabset 可十分方便地设计静态MPI设计动态MPI则需要编写专门的代码
静态多页面界面
TNotebookTTabSet可用来开发静态多页面界面TNotebook部件能显示多页 每页都有相应的控制通常TNotebook与TTabset配合进行控制TTabset 有一组水平的标签每个标签可通过创建字符串列表进行某种控制
MPIEDit例程中的主窗体中有一个TNotebook 部件和 TTabSet 部件 把两个部件的Aglin属性设置成bsTop和bsBotton使它们分别处在窗体的上下两部分为了使TTabSet与TNotebook配合工作使用下代码
TabSetTabs := NotebookPage;
另外在TabSet的OnClick事件中定义下如下代码可使用户在选择标签时开打相应的页
procedure TEditFormTabSetClick(Sender : TObject)…
begin
NotebookPageIndex := TabSetTabIndex;
…
end;
设计静态MPI时可在部件窗体(Component Palette)的WIN页面中选中TNotebook 部件然后在Object inspector窗体中双击TNotebook的Pages属性Dephi 将弹出对话框用户可以在此确定Notebook的页数和字符串列表如图关闭对话框后 可对每一页进行设计使用鼠标右按钮弹出快速菜单进行页面切换
动态多页面界面
使用Delphi进行静态MPI设计非常简单进行动态MPI设计则需编写专门的代码 对于一个多页面文本编辑器应能实现以下功能
● 动态生成页面每个页面均能进行文本编辑
● 动态关闭页面直到窗体中只有一个页面为止
● 页面切换不影响各种文本编辑操作
[] [] []