
Delphi文本编辑器的设计(一)
发布时间:2006-03-15 16:17:57 来源:友佳学院(整理) 网友评论 0 条 本章介绍多文本界面(MDI)、多页面界面(MPI)
● MDI的编辑环境 MPI的编辑环境 创建打开、编辑、保存文件 查找、替换文件中指定的字符串 复制、粘贴、剪切字符串 设置文件字体大小 打印文件 MPIEdit实用程序逐一介绍在Delphi
●
●
●
●
●
●
本章将通过
文本编辑器是一种常用的应用程序。用户在编辑器中编辑多种文件,在多个文件之间进行数据交换,对文件进行各种属性设置,并按自己要求打印文件。
4.1 多文本界面
多文本界面是一种在一个应用程序中同时打开两个或更多文件的界面形式。例如在字处理程序可同时打开多个文件,用户可在多个文件中方便地进行切换.
MDI应用程序提供了一种方便的方式,使得用户在同一工作区域内对多个文档进行观察和交换数据。MDI
在
在设计阶段,可创建
本节讲述创建MDI应用程序的基本步骤: 创建主窗口 创建子窗口 创建主窗口菜单 融合菜单 运行时创建子窗口
4.1.1 创建父窗口 MDI应用程序中,主窗口为应用文档提供一个工作区域。这个区域可打开一个或多个子窗口,创建父窗口是建立MDI
在
创建父窗口与其它窗口类似,不同之处在于设置窗体的FormStyle
FormStyle属性可决定一个窗体是父窗口还是子窗口,或不是MDI
4.1.2 创建子窗口 Delphi
设计阶段可创建子窗口的样板,用户在运行进使用样板的实例。子窗口是缺省可见的,如果应用程序在运行进创建子窗口,不要让
创建子窗口时将窗体的FormStyle属性设置为fsMDIChild
1. 选择OPtions|Project
2. 在自动创建列表中选中子窗口;3. 单击>按钮将子窗口移至可得到(Available)窗体列表;4. 并单击OK按钮退出。
4.1.3 创建应用程序菜单与菜单融合 则当子窗口在运行获得焦点并最大化时,子窗口的菜单项将融合父窗口菜单。
父窗口的菜单应作为应用程序主菜单。如果子窗口有菜单,
创建父窗口与子窗口菜单的方法与创建普通窗体菜单类似,
进行菜单融合需设置的两个属性:
●
●
菜单项的GroupIndexMenu属性定义窗体的活动菜单,而菜单融合只对活动菜单进行。如果窗体有多个菜单部件,运行时可通过以下代码进行改变:
GroupIndex属性决定出现在菜单条中各菜单项的位置,在菜单融合中,GroupIndex将Delphi
决定融合菜单是插入还是替换主窗体菜单条中的菜单。
GroupIndex的缺省值是0,可以用下规则确定其值:
1. 数值越小,菜单的位置越靠左。
例如:GroupIndex为0的菜单将出现在菜单条中的最左端。随着GroupIndex数值的增大,菜单项依次向右排列。
2. 若需替换主菜单中的某一菜单项,则将子菜单相应菜单项的GroupIndex设为与之相等的值。这条规则适合一个或多个菜单项。例如,主菜单中的"Edit"菜单项的GroupIndex的值为1。将子菜单的一个或多个菜单项的GroupIndext的值设为1,则在运行时,这些菜单项替换主窗口的"Edit"菜单。
将同一窗体的多个菜单项的GroupIndex设为相同值,原有的排列顺序在菜单融合时将保持
不变。
3. 若要在菜单融合时插入菜单项,需在主菜单中预留数值“位置”。例如,主菜单的两菜单项数值为0,5,则子菜单GroupIndex数值为1,2,3,4的菜单在融合时将插入其中。
在使用MDI界面时,用户通常会打开多个窗体。为了使用户方便地进行窗体切换,常设有一个进行切换的菜单项.此菜单列出了打开窗体的名称,当用户选择其中的一个时,程序进行相应的窗体切换。在
4.2 多页面界面 关于每个页面的信息列在窗体底部的标签(Tabs)
多页面界面是一种非常友好的界面形式。它由一个窗体和多个页面组成,
多页面界面分为静态MPI和动态MPI两种形式。静态MPI
4.2.1 静态多页面界面 TNotebook,TTabSet可用来开发静态多页面界面。TNotebook
另外,在TabSet
Notebook1.PageIndex := TabSet1.TabIndex;
…
end;
设计静态MPI时,可在部件窗体(Component Palette)的WIN3。1页面中选中TNotebook 部件,然后在Objectinspector窗体中双击TNotebook
4.2.2 动态多页面界面 Delphi进行静态MPI
使用
于一个多页面文本编辑器,应能实现以下功能:
●
●
●
为了实现以上功能,程序中使用了动态页面类
type TDynaPage = Class(TObject);
该类可根据需要动态的产生页面,
procedure...
CurPage : integer;
FileList : TSringList;
end;
CurPage表示当前用户选择的页面数,用户切换、增加、删除页面均影响CurPage的值,CurPage初如化为零页。FileList
TNotebook部件创建后至少有一个页面,因此Pages
要创建多页面编辑器,必须从TPage的父件(Parent属件)
MemoParent := Notebook1.Pages.Object[ ];
在Delphi中,宣称对象和创建对象都是用指针来标识,因此可用无类型指针进行指针传递。 var
Pi : Pointer;
begin
Pi := Notebook1.Pages.Object[];
Memo.Parent := Pi;
end;
这样就可在TPage上动态创建编辑部件了。Notebook1中动态生成页面时,页面应所相应的切换,TDynaPage.Notebook1.Tabset1有关的属性要作相应的调整。
往
TDynaPage
procedure TDynaPage.DynaAdd(Sender:TNotebook;FileName:String);
var
Pi:Pointer;
Memo:TMemo;
begin
Sender.Pages.add(FileName);
Pi:= Sender.Pages.Objects[Sender.Pages.Count-1];
DynaMemo(pi);
DynaPage.FileList.addObject(FileName,Memo1);
EditForm.TabSet1.Tabs := Sender.Pages;
EditForm.Tabset1.TabIndex:=Sender.Pages.Count-1;
EditForm.Notebook1.PageIndex := EditForm.Tabset1.TabIndex;
DynaPage.CurPage:= Sender.Pages.Count-1;
end;
procedure DynaMemo(Pi:Pointer);
var
Memo:TMemo;
begin
Memo:=TMemo.Create(Pi);
Memo.Parent:=Pi;
Memo.Align:=alClient;
Memo.borderStyle:=bsNone;
Memo.HideSelection:=False;
Memo1:=Memo;
end;
procedure TDynaPage.Del(Sender:TNotebook;No:integer);
var
Pi:pointer;
begin
Sender.Pages.delete(No);
EditForm.TabSet1.Tabs.delete(No);
Filelist.Delete(No);
DynaPage.CurPage:=EditForm.TabSet1.TabIndex;
Sender.PageIndex := EditForm.Tabset1.TabIndex;
Pi:=FileList.Objects[DynaPage.CurPage];
Memo1:=Pi;
EditForm.Caption:=Sender.Pages.Strings[DynaPage.CurPage];
end;
当用户在多个页面中进行切换时,程序应当保证对当前页面进行编辑。
定义了
TDynaPage后,只需在Open,Closeprocedure TEditForm.Close1Click(Sender: TObject);
begin
if DynaPage.CurPage<>0 then
DynaPage.Del(Notebook1,DynaPage.CurPage);
if Notebook1.Pages.count = 1 then
Close1.Enabled:=False;
end;
procedure TEditForm.Open1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
if not(OpenFile or NewFile) then
begin
OpenFile:=true;
Open(OpenDialog1.FileName);
Notebook1.Pages.Strings[0]:=ExtractFileName( OpenDialog1.FileName);
TabSet1.Tabs:=Notebook1.Pages;
end
else
begin
DynaPage.DynaAdd( Notebook1, ExtractFileName(OpenDialog1.FileName));
Open(OpenDialog1.Filename);
if Notebook1.Pages.count > 1 then
Close1.Enabled:=True;
end;
end;
end;
4.3 文本编辑部件及应用
例如在多页编辑器中,用户选中某一页面,即可对该页面中的文件进行编辑、寻找、设置、打印等。为了实现这一功能,定义了一个TMemoForm1.Menu := SecondMenu;
详细步骤见第一章。菜单融合是指程序运行过程中,子菜单与父窗口菜单的相互作用。如当子窗口获得焦点时,子窗口的菜单或插入主窗口的菜单中,或将替换部分或全部的父窗口菜单。 窗体的Menu
●
●
●
●
●
- 用Delphi实现24位真彩色图标
- 数据库系统 防止黑客入侵之技术综述
- Delphi面向对象的编程方法(二)
- Oracle数据库集中复制方法浅议
- Delphi中为TreeView添加单选和复选框
- VFP9.0中设计与使用表单和报表
- 游戏项目中的自动化测试和持续集成
- 系统构架设计应考虑的因素
- 基于Delphi的“八皇后”问题动态实现
- NoahWeb应用——模组资源
- 1.全面剖析Delphi 2006新增特性
- 2.用Delphi开发视频聊天软件
- 3.用Win32 API枚举应用程序窗口和进程
- 4.软件的架构与设计模式之什么是架构
- 5.软件的架构与设计模式之模式的种类
- 6.Delphi中为TreeView添加单选和复选框
- 7.用Delphi实现24位真彩色图标
- 8.VS.NET2005 Beta2初体验之感受2005
- 9.程序界面设计模式慨述
- 10.没落的奇迹 谁会买下Delphi?
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册
- Picasa中文版_Picasa教程 专题:清除流氓软件
- Firefox专题 seo搜索引擎优化专区
- 重装Windows必知的事情 装机之必备软件大行动
