注册通行证 用户名 密码
  • 文章投稿
  • 博客
  • 论坛
  • 设为首页
  • 加入收藏
jztop.com网络技术
  • 首页
  • | iT新闻
  • | 操作系统
  • | 组网建网
  • | 网络安全
  • | 程序开发
  • | 办公一族
  • | 工具软件
  • | 网页制作
  • | 多媒体制作
  • | 网吧技术
  • | 服务器
  • | 专题教程
Vista | 软件评测 | 系统备份 | 优化 | 进程 | 聊天 | 病毒 | Linux | 黑客 | 防火墙 | 数据库 | Web开发 | Java | Word | 游戏 | 32位开发 | 移动开发
当前位置:首页 > 程序开发 > 数据库 > Delphi 内容正文:Delphi文本编辑器的设计(一)

Delphi文本编辑器的设计(一)

发布时间:2006-03-15 16:17:57 来源:友佳学院(整理) 网友评论 0 条
Delphi文本编辑器的设计(一):

  本章介绍多文本界面(MDI)、多页面界面(MPI)技术;VCL库中TMemo,TEdit 控件以及有关文本编辑的常用对话框的使用。我们开发的MPIEdit.dpr是一个文本编辑的实用程序,可实现如下功能:

  ● MDI的编辑环境 MPI的编辑环境 创建打开、编辑、保存文件 查找、替换文件中指定的字符串 复制、粘贴、剪切字符串 设置文件字体大小 打印文件 MPIEdit实用程序逐一介绍在Delphi中如何实现上述功能。

  ●

  ●

  ●

  ●

  ●

  ●

  本章将通过

  文本编辑器是一种常用的应用程序。用户在编辑器中编辑多种文件,在多个文件之间进行数据交换,对文件进行各种属性设置,并按自己要求打印文件。 

4.1 多文本界面 

  多文本界面是一种在一个应用程序中同时打开两个或更多文件的界面形式。例如在字处理程序可同时打开多个文件,用户可在多个文件中方便地进行切换.

MDI应用程序提供了一种方便的方式,使得用户在同一工作区域内对多个文档进行观察和交换数据。MDI工作区域可分为父窗体和子窗体,在Dephi的MDI应用程序中,父窗体通常是程序的主窗体。MDI中,父窗体之外的窗体称为子窗体,文档或其它数据在子窗体打开。这些文档可以是相同的文件格式,或在应用程序支持下也可以是不同的文件格式。 MDI 父窗体作为应用程序主窗体,亦可创建子窗体样板。Delphi允许创建多个子窗体类型,但MDI应用程序只支持其中的一种。

  在

  在设计阶段,可创建

  本节讲述创建MDI应用程序的基本步骤: 创建主窗口 创建子窗口 创建主窗口菜单 融合菜单 运行时创建子窗口 

4.1.1 创建父窗口 MDI应用程序中,主窗口为应用文档提供一个工作区域。这个区域可打开一个或多个子窗口,创建父窗口是建立MDI应用程序的第一步。

  在

  创建父窗口与其它窗口类似,不同之处在于设置窗体的FormStyle属性。

  FormStyle属性可决定一个窗体是父窗口还是子窗口,或不是MDI类型。 只能在设计阶段确定FormStyle。在Object Inspector窗口中将FormStyle属性设置成fsMDIForm。值得注意的是应当把父窗口定义为应用程序的主窗体,否则程序编译会出错。 

4.1.2 创建子窗口 Delphi自动地创建。

  设计阶段可创建子窗口的样板,用户在运行进使用样板的实例。子窗口是缺省可见的,如果应用程序在运行进创建子窗口,不要让

  创建子窗口时将窗体的FormStyle属性设置为fsMDIChild。如果程序在运行时创建子窗口,则

  1. 选择OPtions|Project菜单,系统弹出自动创建列表对话框;

  2. 在自动创建列表中选中子窗口;3. 单击>按钮将子窗口移至可得到(Available)窗体列表;4. 并单击OK按钮退出。

4.1.3 创建应用程序菜单与菜单融合 则当子窗口在运行获得焦点并最大化时,子窗口的菜单项将融合父窗口菜单。

  父窗口的菜单应作为应用程序主菜单。如果子窗口有菜单,

  创建父窗口与子窗口菜单的方法与创建普通窗体菜单类似,

  进行菜单融合需设置的两个属性:

  ●

  ● 菜单项的GroupIndex属性

       Menu属性定义窗体的活动菜单,而菜单融合只对活动菜单进行。如果窗体有多个菜单部件,运行时可通过以下代码进行改变:

        GroupIndex属性决定出现在菜单条中各菜单项的位置,在菜单融合中,GroupIndex将Delphi的MDI设计时,可非常方便地实现这一功能。方法是将父窗口的WindowMenu设置成该菜单项的名字即可。

决定融合菜单是插入还是替换主窗体菜单条中的菜单。

  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较MDI使用更为方便,且切换速度更快。本章例程就是多页面界面的例子。另外Delphi集成开发环境中的代码编辑(Code Editor)窗体是MPI应用在文本编辑中的实例。在MPI中,一个窗体内的多个文件可以方便地进行切换和交换数据。

  多页面界面是一种非常友好的界面形式。它由一个窗体和多个页面组成,

       多页面界面分为静态MPI和动态MPI两种形式。静态MPI的标签数量固定,用户在事先设计好的多个页面上进行切换。象选择对话框(OptionDialog)就属于静MPI。动态MPI的标签数量不固定,由程序根据需要动态的产生或消除,象代码编辑窗体就是动态MPI,程序可根据用户的需要产生多个文本页面,也可以动态地关闭页面。利用Delphi的TNotebook和Ttabset可十分方便地设计静态MPI。设计动态MPI则需要编写专门的代码。

4.2.1 静态多页面界面 TNotebook,TTabSet可用来开发静态多页面界面。TNotebook部件能显示多页, 每页都有相应的控制。通常TNotebook与TTabset配合进行控制。TTabset有一组水平的标签,每个标签可通过创建字符串列表进行某种控制。MPIEDit例程中的主窗体中有一个TNotebook部件和 TTabSet 部件。把两个部件的Aglin属性设置成bsTop和bsBotton,使它们分别处在窗体的上下两部分。为了使TTabSet与TNotebook配合工作,使用下代码: TabSet1.Tabs := Notebook1.Page; 

  

  

  

       另外,在TabSet的OnClick事件中定义下如下代码,可使用户在选择标签时开打相应的页。 procedure TEditForm.TabSetClick(Sender : TObject);…

  

  

Notebook1.PageIndex := TabSet1.TabIndex;

…

end; 

        设计静态MPI时,可在部件窗体(Component Palette)的WIN3。1页面中选中TNotebook 部件,然后在Objectinspector窗体中双击TNotebook的Pages属性,Dephi将弹出对话框,用户可以在此确定Notebook的页数和字符串列表,如图4.6。关闭对话框后, 可对每一页进行设计,使用鼠标右按钮弹出快速菜单进行页面切换。

4.2.2 动态多页面界面 Delphi进行静态MPI设计非常简单,进行动态MPI设计则需编写专门的代码。 对 动态生成页面,每个页面均能进行文本编辑 动态关闭页面,直到窗体中只有一个页面为止 页面切换不影响各种文本编辑操作 (TDynaPage),其定义如下: 

  使用

于一个多页面文本编辑器,应能实现以下功能:

  ●

  ●

  ●

  为了实现以上功能,程序中使用了动态页面类

  type TDynaPage = Class(TObject); 

该类可根据需要动态的产生页面, 每个页面上创建了可进行文本编辑的TMeno部件。 

  procedure...

 

CurPage : integer;

FileList : TSringList;

end; 

        CurPage表示当前用户选择的页面数,用户切换、增加、删除页面均影响CurPage的值,CurPage初如化为零页。FileList存放打开或创建文件的名字以及与这些文件相关的编辑部件TMemo,页面动态创建、删除将影响FilstList的值。

  TNotebook部件创建后至少有一个页面,因此Pages属性不是空值,只要往Pages中加入字符串,Delphi自动地把该字符串与TPage类对象相联系。TPage类是TCustomEdit派生出来的,在对象浏览器(ObjectBrowse)中可观察到TPage的数据成员和方法。静态生成的页面也是 TPage类。

  要创建多页面编辑器,必须从TPage的父件(Parent属件)创建相应编辑部件。但在动态创建页面时,TPage只是一个与字符串相联系的TObject类,不能写成: 

  MemoParent := Notebook1.Pages.Object[ ]; 

在Delphi中,宣称对象和创建对象都是用指针来标识,因此可用无类型指针进行指针传递。 var

  

Pi : Pointer;

begin

Pi := Notebook1.Pages.Object[];

Memo.Parent := Pi;

end; 

这样就可在TPage上动态创建编辑部件了。Notebook1中动态生成页面时,页面应所相应的切换,TDynaPage.Notebook1.Tabset1有关的属性要作相应的调整。

  往

            TDynaPage的DynaAdd方法定义如下: 

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,Close菜单项中加入如下代码,即可方便的在用户打开关闭文件时创建成删除页面。 

 procedure 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 文本编辑部件及应用 

例如在多页编辑器中,用户选中某一页面,即可对该页面中的文件进行编辑、寻找、设置、打印等。为了实现这一功能,定义了一个TMemo类型的变量:Memo1,该变量没有实例化,每次调用DynaAdd,DynaDel方法均定把TabIndex指定页面的Memo指针传给Memo1。这样在程序运行中,始终有一个实例化的Memo指针赋给Memo1,而菜单中的文本编辑功能均对Memo1进行操作。这种指针传递就能保证对当前页进行操作。

puclicbegin

  Form1.Menu := SecondMenu; 

详细步骤见第一章。菜单融合是指程序运行过程中,子菜单与父窗口菜单的相互作用。如当子窗口获得焦点时,子窗口的菜单或插入主窗口的菜单中,或将替换部分或全部的父窗口菜单。 窗体的Menu属性

  

  

  ●

  ●

  ●

  ●

  ●

相关文章
  • Delphi快速入门(二)
  • Delphi快速入门(一)
  • Delphi快速入门(四)
  • Delphi快速入门(三)
  • Delphi快速入门(六)
【评论】【收藏本文】【打印】【关闭】
上一篇文章:全面剖析Delphi 2006新增特性
下一篇文章:Delphi字符串列表及应用(二)
讨论区
查看
已有 0 位对此新闻感兴趣的网友发表了看法
匿名发表
注册通行证 登陆
图文阅读推荐
推荐阅讯
  • 用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必知的事情 装机之必备软件大行动
病毒专杀栏
  • 杀毒软件反被病毒杀 连"救命"都不能喊
  • 金山ARP防火墙
  • 还原卡神话破灭“机器狗”病毒来势汹汹
  • cctv经济半小时:你的手机现在安全吗?
  • 新挂马方式开始流行 ARP挂马称雄局域网
  • 木马和病毒清除的通用解法
  • IP地址不再冲突 查找ARP攻击者元凶
  • 教你几招识别和防御Web网页木马
  • 分析:封杀BT只是暂时的止痛药
  • QQ爆危险漏洞,“QQ游戏邀请大盗”邀请你玩病
关于我们 | 诚聘英才 | 联系我们 | 版权声明 | 网站大事 | 网站地图 | 意见建议
CopyRight 2005-2007 Jztop.Com 版权所有 未经许可 请勿转载