目录1内容简介 (3)2程序设计流程及方法 (3)2.1 设计思路 (3)2.2 事件响应方法 (4)3测试结果 (5)3.1调试方法 (5)3.2调试过程 (5)3.3调试结果 (6)4分析与探讨 (8)4.1 函数的使用 (8)4.2 人性化设计 (9)独立性声明 (11)一个简单的文本编辑器一、内容简介为满足个人的个性需求,为此设计一个有着自己特色的文本编辑器,实现自己的特定用途。
本实例程序可以对文本进行基本的编辑;能执行基本的文件操作;同时它的状态栏具有提示信息、显示时间及当前光标位置的功能。
而重点在于熟悉Delphi中ObjectTreeView、ObjectInspector等的用法及相应的属性设置以及一些插件的使用。
源代码的编写是重中之重。
开发的这个类似于“写字板”的程序,不过功能要相对简单一些。
该程序的主要功能包括:1、能执行基本的文件操作,包括新建、打开、保存一个文本文件2、能对文本进行基本的编辑操作,包括剪切、复制、粘贴、删除、选择及查找3、能对文本进行简单的格式化操作,包括改变文本的字体、字号、对其方式等4、可以在状态栏显示提示信息、当前光标位置以及系统日期和时间二、程序设计流程及方法(一)、设计思路基本思路:先创建一个窗体,添加菜单栏,工具栏以及状态栏,然后利用ActionManger建立一些基本指令,通过修改基本指令的属性来制作菜单和快捷键,并把它们放到菜单栏和工具栏边上。
然后再添加一个ComboEx和Edit来作为字体的模式和大小的设置项,这样就建立起了一个用户界面和完成了部分功能,对于不能直接通过属性设置的功能,则通过编写时间的源代码来实现。
按照面向对象程序的设计方法,在应用程序框架下,利用VCL(Visual Compoment Library,可视化组件)进行填充,本程序将用到Delphi7提供的RichEdit、ImageList、ActionManger、ActionMainMenuBar、ActionToolBar和StatusBar组件。
在ActionManger组件中,将使用Delphi 7提供的一些标准的指令,这样可以省去不少手工编写代码的时间。
ImageList组件可以管理一系列相同尺寸的图像列表。
ActionManger组件中的每一个指令都有一个ImageIndex(图像索引属性)通过为指令制定该属性值,指令变可以拥有相应的图像。
这样当用指令建立菜单和工具条时,菜单和工具条上便可以显示图像,类似像Microsoft Office 风格的菜单和工具条。
直接拖动ActionManger组件中的指令到菜单和指定工具条上,可以快速建立程序界面,且个菜单项和工具按钮具有相应指令的功能。
(二)事件响应方法Windows操作系统是基于“时间驱动”的机制来运行的。
事件是指外界的“激发”获状态的改变,例如,鼠标单击、移动,按下某个键等。
当一个事件发生时,程序会执行相应的操作。
若没有事件发生,程序会处于等待事件发生的状态。
而此程序中需要编写的事件代码如下:FileNew指令、FileOpen指令、FileSave指令、帮助文件、About指令、主窗体、ComboxEx和Edit的指令编写代码。
FileNewExecute过程中通过MessageDlg函数判断,若修改过则返回索引值6(代表Yes),清空文本,新建一个空页面。
若取消则原文件保持不变。
FileSaveExecute过程中,当点击Save时,判断保存文件的后缀,再通过定义f1文件变量一写的方式打开,将所要保存的文件用writeln函数写进去。
HelpContents1Execute过程以及HelpIndexExecute过程直接调用Application.HelpCommand函数实现。
其作用就是提供帮助系统。
HelpAboutExecute过程利用自带的模板并以showmodal模式显示,在上面可以加入坐着自己的个性元素。
MouseDown,KeyUp事件直接调用ShowCurpos函数显示当前的行列值,将变量取为string类型并在StatusBar1.Panels[1]上显示。
其中OnCreat事件是在程序运行后窗体显示时响应,通常使用这一事件来初始化窗体。
一些属性的设置不仅可以通过ObjectInspector来设置,也可以通过代码直接设置。
实例中初始化的Form完成提示信息的显示并调用GetFontNames 函数并加载字体。
三、测试结果(一)调试方法1、使用Project菜单中的Compile命令。
该命令编译当前项目中所有修改过的文件,生成可执行的EXE文件。
或使用Project菜单中的Build命令。
该命令编译当前项目中的所有文件,而不管这些文件是否经过修改生成可执行的EXE 文件。
而使用Run菜单中的Run命令(或按键盘上的功能键F9,或单击加速条上Run按钮),将程序编译和运行一步到位。
2、如果遇到错误,Delphi在代码编辑器的状态行报告错误,并把光标定位在包含错误代码的程序行上。
改正错误后重新编译,一直到没有错误了才会生成可执行的EXE文件。
(二)调试过程在完成了整个窗体的设计以及整体的布局之后,采用步步为营的方法,选中需要编写事件的组件,在其对应的代码编辑框输入相应代码。
当编写完一个组件的响应事件代码后,及时运行与调试,若无错误,保存退出,这是就可以运行程序了。
所遇到的疑点、错误与解决方法:1、运行后无错误,但是ToolBar上的一些图标显示不出来,检查对应图标的属性,在visible选择“True”就好了2、运行后撤销按钮显示的是灰色,检查其Action属性为空,在Action属性下拉列表框中找对应的指令,发现没有。
原来撤销指令属于Undo标准按钮。
通过添加就可以得到,不需用户自行创建3、ToolBar工具条上Separator起分割的作用,新建的Button在Action 属性上选择对应的动作,运行时将自动生效4、RichEdit1滚动条的设置,可以通过ScrollBars属性选择,ssVertical 指设置垂直滚动条5、若在设计界面删除控件(添加了过程),则在代码编辑器中需手动删除6、在字体的设置中,带@的字体会使输入、显示的字体倾斜,只要选择正常显示的字体即可7、文件的新建过程中需要对原文件进行判断,若原文件存在并修改则新建8、在保存文件的时候,对扩展名的要求,因为是保存为文本文件,在保存时对文件名进行判断,自动添加后缀则避免文件格式的错误(三)调试结果调试无误后,测试各功能的运行情况,包括文件、编辑、格式里的各项功能。
部分截图如下:四、分析与探讨本应用程序完成了基本的文本编辑的功能,并且还实现了状态栏显示当前所在的行列数,更多的字体的设置、滚动条的设置。
但是功能也不尽完善,其中也遇到了些难题,如不能撤销步骤只能是重复上一步以及更加人性化的设计等等。
(一)函数的使用本应用程序中字库的装载通过function EnumFontsProc(var LogFont: TLogFont; var TextMetric: TTextMetric;FontType: Integer; Data: Pointer): Integer; stdcall函数实现。
Delphi中还有一个MessageDlg函数,也是一个信息对话框函数,。
此函数可以根据使用的位置来设置对话框中的按钮和图标。
其原型为:Function MessageDlg(const Msg:String;DlgType:TmsDlgType;Buttons: TmsgDlgButtons;HelpCtx:Longint):Integer;其中参数Msg常量是用于输入提示信息;DlgType参数用于设置对话框的图标,此参数取值如表1;Buttons参数用于设置对话框中的按钮,此参数取值如表2;HelpCtx参数显示帮助信息,可取一整数值,如0。
MessageDlg函数返回一整数值。
DlgType参数取值表1Buttons参数取值计函数返回值表2此外在Object Pascal语言中已经为文本类型的文件定义了一个标准的类型标识符TextFile,在使用时可直接用TextFile类型声明文本变量。
Assignfile 函数用于建立指定的文件与文件变量之间的联系,此函数原型为AssignFile (filename,str),其中filename参数是定义的文件变量,str参数用于指导文件路径和名称的字符串变量或常量。
通过AssignFile函数,文件变量filename 就可以与代码str表示的外部文件建立联系。
因此在文件输入输出上Assign函数是必定存在的。
而在文件的读出与写入问题上,函数的功能都不一样。
Rewrite 函数用于创建新文件,并以写的方式打开。
而writeln函数是往已存在的文件中追加数据。
当然在读取即打开文件是,也可以使用ReadLn函数,此函数用于读取文件中某行文件。
(二)人性化的设计快闪界面,其本质也是一个窗体,利用图片填充,再利用一个定时器实现其快闪的功能。
时间参数通过Interval属性设置,当时间到点后,主窗口显示,界面隐藏,再释放所占有的资源。
ShowMessage对话框函数,用于显示一些提示信息,将所要显示的信息用单引号括起来即可。
此函数的原型为:Procedure Showmessage(const Msg:srting),其中参数Msg为字符型常量,在使用时直接输入此函数,并在括号内输入要显示的信息,如实例中的“欢迎使用本软件!”,信息用单引号括起来即可显示。
在StatusBar上加入了显示系统日期与时间的功能。
TimeToStr函数是将时间转换为字符串的函数,其基本形式为Function TimeToStr(const DataTime:TDateTime):string;其中DataTime参数为时间常量;TimeToStr函数返回以字符串值。
DateToStr是将日期转化为字符串的函数。
其原型为Function DateToStr(const DataTime:TDateTime):string; 其中DataTime参数为日期常量。
因此可以直接显示在StatesBar1工具条上。
因为其返回值都一样,因此可以直接赋值给StatusBar1.SimpleText。
主菜单的设计,利用ControlBar控件实现菜单栏、工具栏的移动。
ControlBar控件的DragKind属性用于设置添加到该控件中的其他控件是否可以作为一个面板拖出。
该属性有两个取值dkDock和dkDrag时,ControlBar控件作为一个船坞,课自由拖进和拖出改控件中的面板;当该属性值设置为dkDock 时,只能在ControlBar控件中拖动面板。