delphi文本编辑器的设计
delphi7 foxit quick pdf library 案例
delphi7 foxit quick pdf library 案例Delphi7和Foxit Quick PDF Library:案例研究在处理PDF文档时,许多开发人员选择使用Delphi7集成Foxit Quick PDF Library。
下面是一个简单的案例,演示如何使用Delphi7和Foxit Quick PDF Library来创建、编辑和保存PDF文件。
案例背景:假设我们需要创建一个简单的应用程序,该程序能够创建一个包含文本、图像和表格的PDF文件。
用户可以从文本框中输入文本,从图像框中选择图像,并使用表格框输入数据。
最后,应用程序将所有这些元素合并到一个PDF文件中。
解决方案:1. 安装Delphi7和Foxit Quick PDF Library。
确保在安装过程中选择正确的组件和库。
2. 在Delphi7中创建一个新的项目,并在窗体上添加必要的控件,例如文本框、图像框和表格框。
3. 编写代码以实现用户输入和控件之间的交互。
例如,当用户在文本框中输入文本时,应用程序应该将该文本保存到一个变量中。
4. 使用Foxit Quick PDF Library将文本、图像和表格合并到一个PDF文件中。
这可以通过调用库中的函数来完成。
例如,可以使用库中的函数来创建新的PDF文件、添加文本、插入图像和创建表格。
5. 保存PDF文件到磁盘上,以便用户可以打开和查看它。
实现细节:以下是一个简化的代码示例,演示如何使用Delphi7和Foxit Quick PDF Library创建包含文本和图像的PDF文件:```delphiprocedure TForm1.Button1Click(Sender: TObject);varPdfDoc, PdfPage: Variant;PdfWriter: Variant;ImagePath: string;begin// 创建新的PDF文档PdfDoc := CreateOCPDFDocument();// 获取默认的PDF页面PdfPage := PdfDoc.Pages.Add();// 创建PDF写入器对象PdfWriter := TObject(PdfDoc.Writer);// 添加文本到PDF页面PdfWriter.Write('这是示例文本...');// 添加图像到PDF页面(假设ImagePath是图像文件的路径)PdfWriter.DrawImage(ImagePath, 100, 100, 200, 200); // 在(100,100)位置绘制200x200大小的图像// 保存PDF文件到磁盘上(例如,"example.pdf")PdfDoc.SaveToFile('example.pdf');// 释放PDF文档对象PdfDoc := Unassigned;end;```请注意,这只是一个简单的示例,用于说明如何使用Delphi7和Foxit Quick PDF Library创建包含文本和图像的PDF文件。
delphi记事本开发
Delphi程序设计第三节模仿制作windows 计算器首先:我们设置FORM1的窗口属性这样窗口就不可以随便拉大拉小了!用选中计算器的图标!把FORM1的caption属性设置为模仿的windows 计算器。
画一个EDIT组建(),并把他的TEXT属性里的字删除!使TEXT里边显示为空!好了,画好了,我们接着来画面板!点一下(panel)该组件只是为了好看没有多大的实际用途!拉到适当的大小的时候我们来设置他的属性!首先,我们把他的这个属性清空,是面板上不显示字!把设置为使面板下沉我们再画18个快速按钮,分别把CAPTION属性设置成如图好了,到此,我们的界面就画完了!我们先来讲讲本节用到的组件属性!Form1.caption (代表是FORM1的标题文本),我们可以在属性页里设置也可以用语句设置;Delphi里所有的组件属性都可以用语句设置,以后我就不重复了!例:form1.caption:=’哈哈,测试一下!’; //这时候则form1的标题为哈哈,测试一下!Edit1.text:=’看看你聪明不!’;//这时候edit1里边显示的文本为看看你聪明不!Panel 面板组件,无实际用途,主要用于界面美观·!Speedbutton 快速按钮!主要属性:checked 设置是否被选中flat 设置是否为OFFICE 2000风格Down 设置是否按下好了,接下来我们写代码!重点难点解析:edit1.text:=edit1.text + '1'; 此句话的意思是代表在原来的字符串后面加个字符串1例:假如说原来的edit1.text 为字符串123456 在执行上面的语句的话,edit1.text 的值则为1234561speedbutton12.caption = '关闭' 注意:等于号在Delphi中代表比较的意思,就是说此句的意思是比较speedbutton12.caption 的值和字符串关闭是不是相等的!case flag of1:temp2:=strtofloat(edit1.text)+ strtofloat(temp1);2:temp2:=strtofloat(temp1) - strtofloat(edit1.text);3:temp2:=strtofloat(edit1.text)* strtofloat(temp1);4:temp2:strtofloat(temp1) / strtofloat(edit1.text);end;edit1,text:=floattostr(temp2);strtofloat 把字符串转换为浮点数floattostr 和上面的相反case flag of 当FLAG的值和下面的符合时运行后面的表达式…..。
delphi trichedit用法
delphi trichedit用法Delphi Trichedit用法1. 什么是Delphi TricheditDelphi Trichedit是Delphi提供的一个组件,用于创建和编辑RTF格式的文本。
它支持丰富的文本格式设置和自定义功能,适用于开发各种文本编辑程序。
2. 创建Trichedit控件要使用Delphi Trichedit,首先需要在Delphi的窗体上创建一个Trichedit控件。
你可以在Delphi的组件面板上找到Trichedit控件,并将其拖放到窗体上。
3. 设置Trichedit的属性Trichedit控件具有许多属性,可以通过设置这些属性来控制文本的格式和行为。
以下是一些常用的属性及其说明:•Font:设置文本的字体、字号和样式。
•Color:设置文本的颜色。
•ReadOnly:设置是否只读,如果设置为True,则无法编辑文本。
•WordWrap:设置是否自动换行。
•ScrollBars:设置是否显示滚动条。
•PlainText:获取或设置文本的纯文本内容。
4. 设置文本格式通过Trichedit控件的属性和方法,可以对文本进行格式设置,例如:•SelAttributes:获取或设置当前选中文本的属性,例如字体、字号和颜色。
•Paragraph:设置段落的缩进、对齐方式和行距等属性。
•Lines:获取或设置文本的内容,可以通过添加、删除、插入和替换等方法来编辑文本。
5. 处理事件Trichedit控件还支持各种事件,可以在事件处理程序中编写代码来实现一些自定义功能。
以下是一些常用的事件:•OnChange:文本内容发生改变时触发的事件。
•OnKeyPress:按下键盘按键时触发的事件。
•OnSave:将文本保存到文件时触发的事件。
•OnLoad:从文件加载文本时触发的事件。
6. 导出和导入文本通过使用Trichedit控件的方法,可以将文本导出为RTF格式或纯文本格式,也可以从文件导入文本。
Delphi操作Word的方法
二、Delphi程序新建Word文稿
ToolsReviewRevisions 接受或拒绝修订
ToolsRevisionMarksAccept 接受修订
ToolsRevisionMarksReject 拒绝修订
ToolsRevisionMarksToggle 修订
ToolsMacro 宏
ToolsRecordMacroToggle 录制新宏
二、Word中内嵌的Com技术
可以说Word是对Com技术支持最好的软件,这样说似乎是太极端了一点,但是Word提供的强大的编程接口技术却能够是我们通过程序控制Word的任何一部分。无论是文件的打开、存盘、打印还是文档中表格的自动绘制。
通过编程软件,可以灵活的操纵word,这里只以Borland Delphi为例,进行详细描述:
这样,我们就可以屏弃Word自动执行的宏,通过Delphi直接调用相应宏来达到目的。
五、Word命令宏的详细描述
Word本身的命令函数包含很多,但是无论是word联机帮助还是MSDN帮助,都没有这方面的介绍,因此只能凭自己的实验取探索,初步探测的函数如下:
宏名 解释 注释
FileNew 新建
ViewSecurity 安全性
ViewVBCode 查看VB编辑器环境
FileTemplates 模板和可加载项
2024版Delphi程序设计[1]
数据库性能。
21
05
Delphi网络编程
Hale Waihona Puke 2024/1/2922
网络通信原理简介
客户端/服务器模型
网络通信通常采用客户端/服务器模型,其中 客户端发送请求,服务器响应请求并返回数据。
2024/1/29
套接字编程
网络通信基于套接字(socket)进行,套接字是不同 计算机之间进行通信的端点。
传输协议
常见的传输协议包括TCP和UDP。TCP提供可 靠的、面向连接的通信服务,而UDP提供无 连接的、不可靠的通信服务。
23
TCP/IP协议在Delphi中实现
2024/1/29
使用WinSock控件
Delphi中可以使用WinSock控件实现TCP/IP协议,通过设置控件 属性并调用相关方法即可建立客户端或服务器应用程序。
熟悉窗体的事件处理机制,如加载、关闭、大小改变 等事件。
2024/1/29
13
常用控件介绍
基本控件
学习Delphi中常用的基本控件,如按钮、标签、 文本框等。
高级控件
了解高级控件的使用,如列表框、树形视图、 表格等。
2024/1/29
控件属性与事件
掌握控件的常用属性和事件,如控件的名称、大小、颜色、单击事件等。
编译器异常
编译时检测到的错误,如语法错误或类型不匹配。通过编译器提 示信息进行修复。
自定义异常
用户自定义的异常类型,用于特定业务逻辑的错误处理。通过创 建自定义异常类实现。
33
自定义异常处理机制
创建自定义异常类
继承自Exception类或其子类,添加自定义 属性和方法。
抛出自定义异常
在适当的位置使用raise语句抛出异常,并传 递异常实例。
2024版Delphi程序设计实用教程第2版
Delphi程序设计实用教程第2版•Delphi程序设计概述•Delphi语言基础•面向对象编程基础•窗体和控件应用•文件操作与数据库访问技术•网络编程技术•调试、优化和发布部署•实战项目:XXX系统设计与实现Delphi程序设计概述Delphi是一种高级编程语言,由Borland公司开发,以Object Pascal为基础。
Delphi支持面向对象的程序设计,具有丰富的组件库和强大的开发环境。
Delphi广泛应用于Windows桌面应用程序、Web应用程序、数据库应用程序等开发领域。
Delphi语言简介下载并安装Delphi开发环境,选择合适的版本和组件库。
配置开发环境,包括设置编译器选项、调试器选项、代码编辑器风格等。
安装和配置数据库连接驱动,以便在Delphi中访问数据库。
Delphi开发环境安装与配置第一个Delphi程序创建一个新的Delphi项目,选择适当编译和运行程序,查看程序执行结果。
的项目类型和模板。
在代码编辑器中编写程序代码,实现简单的功能,如输出“HelloWorld”。
010204 Delphi程序结构Delphi程序由项目文件、单元文件和窗体文件等组成。
项目文件包含程序的整体设置和引用单元的信息。
单元文件包含程序中的代码和数据,是实现程序功能的基本单元。
窗体文件包含程序中的界面元素和事件处理代码,是实现用户交互的重要部分。
03Delphi语言基础包括Integer 、Boolean 、Char 、String 、Float 等常用类型。
标准数据类型如数组、记录、集合、文件等复合数据类型。
构造类型用于访问内存地址的特殊数据类型。
指针类型可存储不同类型数据的灵活数据类型。
变体类型Delphi 数据类型介绍如何在Delphi 中声明变量并为其赋值。
变量声明与赋值讲解常量的概念、定义方法及在程序中的应用。
常量定义与使用阐述局部变量、全局变量的概念及其作用范围。
变量作用域变量与常量运算符与表达式算术运算符介绍加、减、乘、除等基本算术运算。
简单文本编辑器——课程设计(delphi)
简单⽂本编辑器——课程设计(delphi)⽬录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组件。
文本编辑器Delphi课程设计报告书
目录课程设计任务书 (1)1、实验题目: (2)2、项目概述 (2)3、系统的功能需求 (2)3.1总体设计 (2)3.2系统功能 (2)3.3系统工作流程 (3)4、文本编辑器的详细设计 (3)4.1文本编辑器的界面设置 (3)4.1.1新建工程 (3)4.1.2修改窗口: (3)4.2文本编辑器的详细代码分析 (6)5.心得体会: (9)6.参考文献 (10)7.致 (10)8.附录 (10)课程设计任务书班级1、实验题目:文本编辑器2、项目概述程序大部分菜单都在窗体中对应有一个快捷图标。
包括新建、打开、保存、剪切、复制、粘贴、左对齐、右对齐、居中、文字加粗、文字倾斜、文字加下划线和文字大小等命令,在菜单中还包括字体颜色、窗体背景颜色等命令。
利用这些基本命令,可以很方便地处理很多文本文档。
该程序界面友好,当把鼠标放在快捷工具栏上时,程序会给出快捷菜单提示,同时,在窗体下方的中间,也有该快捷命令的说明文字。
首先要解决窗体的布局和设计问题。
然后给各个菜单和快捷工具栏中的按钮添加相关程序代码。
这个文本编辑器与一般的简易的文字编辑程序的制作有所不同。
首先,必须设置好菜单的属性及功能;其次,当所有的菜单都设计好之后,还必须对工具栏进行设计,工具栏的开发与设计是最具挑战性的工作,因为整个界面的美观都取决于工具栏的制作,而整个程序使用是否方便、快捷,也取决于工具栏的安排和属性的设置。
然后,还需进行一些细部的修饰,例如底部任务栏上的提示用语以及帮助菜单的设计等。
3、系统的功能需求3.1总体设计3.2系统功能该文本编辑器具有完整的菜单,大部分菜单都在窗体对应有一个快捷图标。
包括新建、打开、保存、剪切、复制、粘贴、做对齐、右对齐、居中、文字加粗、文字倾斜、文字下划线和文字大小等命令,在菜单中还包括字体颜色、窗体背景颜色。
利用这些命令,可以很方便地处理很多文本文档。
该程序界面有好,当把鼠标放在快捷工具栏上时,程序会给出快捷菜单提示,同时,在窗体下方的中间,也有该快捷命令的说明文字。
Delphi控制Word编程手记
Delphi控制Word编程手记前几日对软件“文件整理助手”进行了完善。
该软件有文本文件合并,文本文件内容的替换、插入、删除、为特定行首/尾添加字符、清理空行等,以及文件批量替换、改名等功能。
一同事见后,希望能对Word文件进行合并。
尽管Word的“插入文件”可以实现这个功能,但不能在插入文件时调整插入的顺序,也不能控制插入的新文件是否另起一页。
Word虽然功能强大,但还是有一定的局限性。
当然,通过VBA录入脚本、编写宏代码也许可以实现这些复杂的功能。
但囿于其缺乏通用性和移植性,对于不善于编程的人来说,还是存在诸多不便。
因此,打算做一个“Word文档合并器”。
刚做出这个决定时,以为很简单,因为Delphi的Servers组件页有WordApplication、WordDocument等控件,通过它们来控制全不是那么回事!以前做过涉及到Excel的小程序,没觉得有多难。
首次跟Word打交道,竟给我来了个大大的下马威。
以前用过函数,用过过程,也用过带参数的函数、带参数的过程。
见过参数多的,但没见过打开、保存Word时尽然要用多达15个、16个参数的函数、过程。
而且这些参数青一色地被定义为OleVariant类型,哪些应该是字符串,哪些应该是布尔型,或者专门为Word程序和文档定义的变量类型,没有详细的、系统的资料,只好摸着石头过河,慢慢研究了。
经过几翻碰壁、几翻查证、几翻试验,把要实现的功能一步步拆解,逐一进行调试,通过后再重新组合起来试验。
经过拆解、调试、组装三步曲之后,总算是完成了“Word文档合并器”这样一个小小的软件。
为避免下次还重复这种繁琐的基础工作,现将有关技术要点总结于下:(本程序在Word2003中调试通过,其他版本未进行测试。
网上找的一些资料在过程调用、函数语句及参数个数上有出入,可能与Word版本不一样有关。
)说明:主窗体中放置以下三个与Word有关的控件:Word: TWordApplication; //Word应用程序接口Document1: TWordDocument; //Word文档ole_ShowDoc: TOleContainer; //用以显示Word文档【一】相关Word组件这里仅整理Delphi通过自身所提供的Server组件连接Office (Word)的有关资料,其他方法暂不研究。
简单文本编辑器-设计报告
简易文本编辑器●需求分析该简易文本编辑器具有图形菜单界面,包括打开,查找,替换(等长,不等长),插入(插串,文本块的插入)、块移动(行块,列块移动),删除,显示文本信息,保存文本信息等等功能并可正确存盘、取盘,正确显示总行数。
●概要设计为实现数据的有序存储,该编辑器用字符数组来存储输入的信息。
数组是数据结构中线性表的一种,它是用一块地址连续的存储空间依次存储线性表的元素。
其特点为:在顺序表上逻辑关系相邻的俩个元素在物理位置上也相邻;在顺序表上可以随即存取表中的元素。
在编辑器的主界面中应有如下提示信息(包括功能的完成的基本思想):1) 清空以前的文本信息:将用数组存的数据内容全部置为0;2) 显示当前文本信息:遍历用数组存入的信息,并输入到外部显示器上;3) 编辑信息:通过对数组的直接输入操作得到字符数组,这要求数组有绝对大的空间,而且每一次的输入完毕必须有相应的数组下表地址的记录,应此建立一个全局变量ntext记录;4) 查找信息:通过循环在数组中找到所需要的信息;5) 替换文本信息:首先在数组中查找要被替换的信息,如果找到该信息,提示输入要替换的信息内容,否则提示未找到要被替换的信息;6) 插入文本信息:首先在数组中查找要插入点,如果找到该插入点,提示输入插入信息,确认插入信息后,提示选择向前插入信息还是向后插入信息,如果未找到插入点,显示未找到要插入的位置;7) 移动文本信息:首先在数组中查找要移动的信息,如果找到该信息,提示是进行列移动还是进行行移动,否则提示未找到要移动的信息;8) 删除文本信息:首先在数组中查找要删除的信息,如果找到该信息,提示是否确认删除该信息,通过确认来删除信息,如果未找到要删除的信息,提示未找到该信息;9) 退出编辑器:通过确认是否保存安全退出。
10)程序中主要的函数为:子串查找在朱串的位置,程序如下:int strindex(char text[],char t[],int i2,int l) //查找要操作的数据的位置(模式匹配){int i1=l,j=0;while (i1<ntext&&j<i2){if (text[i1]==t[j]) //继续匹配下一个字符{j++;i1++;//主串和子串依次匹配下一个字符}else //主串、子串指针回溯重新开始下一次匹配{i1=i1-j+1; //主串从下一个位置开始匹配j=0;//子串从头开始匹配}}if (j>=i2){return(i1-i2);} //返回匹配的第一个字符的下标elsereturn(-1); //模式匹配不成功}详细设计1.包括的头文件#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <time.h>#include <string.h>#define MAX 10000#define _CRT_SECURE_NO_DEPRECATE //在vs中取消warning的警告2.相关函数原型void menu();void shuru(char text[]);void bc(char text[]);void dakai(char text[]);void dayin(char text[]);void chazhao(char text[],int l);void tihan(char text[],int l);int strindex(char text[],char t[],int i2,int l);void shanchu(char p[],int l);void cs(char text[]);void charu(char text[],int l);void tuichu(int status);char text[MAX]=""; //文本编辑域char name[20]=""; //文件保存的位置int status=0; //显示是否保存过的状态int ntext; //文本编辑的位置3./*打开文件模块*/void dakai(char text[]){system("cls");FILE *fp;char pd,ch;char name[30];int i=0;printf("输入A:确定打开文件(未保存的数据将会丢失) M:返回主菜单");fflush(stdin);pd=getchar();if (pd=='A'||pd=='a'){printf("请输入要打开文件名字(例如c:\\a.txt)");scanf("%s",name);while ((fp=fopen(name,"r"))==NULL){printf("\n打开文件失败,请重新输入要打开的文件名:");scanf("%s",name);}cs(text);while(!feof(fp)){ch=fgetc(fp);text[i]=ch;i++;}text[i]='\0';ntext=i;fclose(fp);printf("\n文件读取成功\n文件内容为\n");dayin(text);}if (pd=='M'||pd=='m')menu();}4./*保存模块*/void bc(char text[]){system("cls");FILE *fp;char pd;char tmp;int i;printf("\n输入【A】保存;任意键返回主菜单不保存\n");fflush(stdin);pd=getchar();if (!(pd=='A'||pd=='a')){menu();}else{if(name[20]==NULL){printf("\n请输入保存文件名(例如: c:\\a.txt):");scanf("%s",name);}while ((fp=fopen(name,"w+"))==NULL){printf("文件不存在,请重新输入文件名:");scanf("%s",name);}printf("\nA:确定;B:取消:");while(scanf("%c",&tmp)!=EOF){if (tmp=='A' || tmp=='a'){for(i=0;i<ntext;i++)fprintf(fp,"%c",text[i]);fclose(fp);status=1;printf("\n文件保存成功\n");break;}if (tmp=='B' || tmp=='b'){break;}}}}5./*初始化模块*/void cs(char text[]){int i;for (i=0;i<ntext;i++){text[i]='\0';}ntext=0;status=0;}int strindex(char text[],char t[],int i2,int l) //查找要操作的数据的位置(模式匹配) {int i1=l,j=0;while (i1<ntext&&j<i2){if (text[i1]==t[j]) //继续匹配下一个字符{j++;i1++;//主串和子串依次匹配下一个字符}else //主串、子串指针回溯重新开始下一次匹配{i1=i1-j+1; //主串从下一个位置开始匹配j=0;//子串从头开始匹配}}if (j>=i2){return(i1-i2);} //返回匹配的第一个字符的下标elsereturn(-1); //模式匹配不成功}6./*菜单显示模块*/void menu(){system("cls");time_t timep;time (&timep);printf("%s",ctime(&timep));printf("\n\n\n\n\n\n\n\n\n\t\t\tWelcom to use our TXT edition system!\n");printf("\n\n\t\t\t 欢迎您使用文本编辑器软件!\n");printf("\n\n\n\n\n\n\n\n\npress Enter to continue...\n");getchar();loop:system("cls");printf("\n\n\n\n\t\t******************简易文本编辑器*****************\n\n");printf("\t\t\t\t----0.清空内容--\n");printf("\t\t\t\t----1.打开文件--\n");if (ntext==0){printf("\t\t\t\t----2.输入内容--\n");}else {printf("\t\t\t\t----2.继续输入--\n");}printf("\t\t\t\t----3.查找------\n");printf("\t\t\t\t----4.插入------\n");printf("\t\t\t\t----5.删除------\n");printf("\t\t\t\t----6.替换------\n");printf("\t\t\t\t----7.显示内容--\n");printf("\t\t\t\t----8.保存------\n");printf("\t\t\t\t----9.退出------\n");printf("\n\t\t*********************选项************************\n");printf("\n\t\t\t\t输入选项0-9:");char n;fflush(stdin);n=getchar();if(n>='0'&&n<='9'){switch (n){case '0': cs(text);break;case '1': dakai(text);break;case '2': shuru(text);break;case '3': chazhao(text,0);break;case '4': charu(text,1);break;case '5': shanchu(text,0);break;case '6': tihan(text,0);break;case '7': dayin(text);break;case '8': bc(text);break;case '9': tuichu(status);default : break;}}else{printf("\n输入有误,请重新输入:");fflush(stdin);n=getchar();}system("pause");goto loop;}7./*查找*/void chazhao(char text[],int l){system("cls");int i,t,a=-1;char pattern[20],bd,pd;printf("原文为:\n");dayin(text);printf("请输入您要查找的内容");scanf("%s",pattern);printf("您查找的内容是:%s\n",pattern);t=strlen(pattern);loop:a=strindex(text,pattern,t,l);if (a!=-1){l=a+t;}int hs=1,ls=0;for (i=0;i<=a;i++){ls++;if (text[i]=='\n'){hs++;ls=0;}}if (a==-1){printf("查找到结尾没有找到\n输入【R】将重头查找;任意键返回主菜单");l=0;fflush(stdin);pd=getchar();}else{printf("已经找到在第%d行第%d列,输入【R】继续查找下一处;任意键返回主菜单",hs,ls);fflush(stdin);bd=getchar();if (bd=='R'||bd=='r')goto loop;}if (pd=='R'||pd=='r'){l=0;chazhao(text,l);}}8./*显示模块*/void dayin(char text[]){system("cls");printf("现在文本的内容为:\n");printf("%s\n",text);int hs=1,i;for (i=0;i<ntext;i++){if (text[i]=='\n'){hs++;}}printf("\n文本共有%d行\n",hs);}9./*输入模块*/void shuru(char text[]){system("cls");printf("请输入内容(输入@结束输入并返回主菜单):\n");printf("%s",text);char c;int i=ntext,j=ntext;fflush(stdin);while ((c=getchar())!='@'){text[i]=c;i++;ntext=i;continue;}int cout=0,zf=0,h=1,hs=1,zfs=0;for(;cout<ntext;cout++){zf++;if(text[cout]=='\n'){h++;zf--;}if(text[cout]==' ')zf--;}for(cout=j;cout<ntext;cout++){zfs++;if(text[cout]=='\n'){hs++;zfs--;}if(text[cout]==' ')zfs--;}printf("统计:文本一共有%d个字符,%d行,本次输入了%d个字符,%d行\n",zf,h,zfs,hs);}10./*删除*/void shanchu(char p[],int l){int i,a=-1,t2=0;char x[20],px,pd,pdx,c;system("cls");printf("%s",p);printf("\n输入【A】执行查找删除内容;任意键返回主菜单:");fflush(stdin);px=getchar();if (px=='a'||px=='A'){printf("\n输入您要删除的内容,以@结束:");fflush(stdin);while ((c=getchar())!='@'){if (c=='@'){break;}else{x[t2]=c;t2++;continue;}}loop:a=strindex(p,x,t2,l);int hs=1,ls=0;for (i=0;i<=a;i++){ls++;if (p[i]=='\n'){hs++; ls=0;}}if (a==-1){printf("已查找结束,您要删除的内容不存在\n输入【R】重新输入要删除的内容;其他键将返回主菜单:");l=0;fflush(stdin);pdx=getchar();}else{printf("你要删除的内容在第%d行第%d列\n 输入【A】确定删除;输入【B】寻找下个词;其他键将返回主菜单:",hs,ls);fflush(stdin);pd=getchar();l=t2+a;if (pd=='a'||pd=='A'){for(i=a;i<ntext;i++){p[i]=p[i+t2];}ntext=ntext-t2;printf("删除成功,删除后的内容为:\n%s\n",text);}else if (pd=='b'||pd=='B')goto loop;}if(pdx=='r'||pdx=='R')shanchu(text,l);}}11./*插入*/void charu(char text[],int l) //向文本中插入内容{system("cls");int i=0,t=0,t2=0,a=-1,b;char cr[20]="",pd,x[500],c,d;printf("\n当前文本信息为:\n");printf("%s",text);printf("\n输入您要在哪个内容前插入,以@结束:");fflush(stdin);while ((c=getchar())!='@') //用一个数组接收要插入在哪个内容之前{if (c=='@'){break;}else{cr[t]=c;t++;continue;}}loop:a=strindex(text,cr,t,l); //查找并返回要插入的位置点int hs=1,ls=0;for (b=0;b<a;b++){ls++;if (text[b]=='\n'){hs++;ls=0;}}if (a==-1){printf("\n查找到结尾没有找到插入点,输入【R】查找其他;按其他键返回菜单:\n");l=0;fflush(stdin);d=getchar();fflush(stdin);}else{printf("\n您要插入的位置是第%d行,第%d列之前\n【A】.不是此位置向后继续找插入点\n【B】.在此位置插入\n按其他键返回菜单\n请选择:",hs,ls+1);fflush(stdin);pd=getchar();if (pd=='a'||pd=='A'){l=a+t;goto loop;}else if (pd=='b'||pd=='B'){printf("\n\n输入您要插入的内容,以@结束:");fflush(stdin);while ((c=getchar())!='@'){if (c=='@'){break;}else{x[t2]=c;t2++;continue;}}for (i=ntext;i>=a;i--){text[i+t2]=text[i];}for (i=0;i<t2;i++){text[i+a]=x[i];}ntext=ntext+t2;printf("\n当前文本信息为:\n");for (i=0;i<=ntext-1;i++)printf("%c",text[i]);printf("\n文本插入成功\n");fflush(stdin);getchar();}}if (d=='r'||d=='R'){l=0;charu(text,l);}status=0;}12./*替换*/void tihan(char p[],int l) //内容替换{int t=0,t1=0,i,a,b;char c,th[20],d,d1,bth[20];int i2;system("cls");printf("\n当前文本信息为:\n");for (i2=0;i2<=ntext-1;i2++)printf("%c",p[i2]);printf("\n输入要被替换的内容,以@结束:");fflush(stdin);while ((c=getchar())!='@') //t指替换前内容的长度{if (c=='@'){break;}else{bth[t]=c;t++;continue;}}loop:a=strindex(p,bth,t,l); //查找要被替换的内容的位置int hs=1,ls=0;for (b=0;b<a;b++){ls++;if (p[b]=='\n'){hs++;ls=0;}}if (a==-1){printf("\n查找到结尾没有找到要被替换的内容\n输入【R】查找其他内容,按其他键返回主菜单键\n");l=0;d=getchar();fflush(stdin);}else{printf("\n\n已经找到要查找的数据在第%d行第%d列\n输入【A】继续向后查找相同内容\n输入其他键将进行替换操作\n请选择:",hs,ls+1);fflush(stdin);l=t+a;char pd;pd=getchar();if (pd!='a'&&pd!='A'){printf("\n是否要替换该内容?\nA:替换给内容;其他键返回主菜单\n请选择:");fflush(stdin);d1=getchar();if (d1=='a'||d1=='A'){printf("\n输入要替换的内容,以@结束:");fflush(stdin);while ((c=getchar())!='@') //t1指替换后的内容长度{if (c=='@'){break;}else{th[t1]=c;t1++;continue;}}if (t==t1) //将要被替换的内容和替换后的内容进行长度比较{for (i=0;i<t1;i++)p[i+a]=th[i];}else{if (t>t1){for (i=0;i<t1;i++){p[i+a]=th[i];}for (i=a+t1;i<ntext;i++){p[i]=p[i+t-t1];}ntext=ntext+t1-t;}else{for (i=ntext;i>=a;i--){p[i+t1-t]=p[i];}for (i=0;i<t1;i++){p[i+a]=th[i];}ntext=ntext+t1-t;}}printf("替换成功");printf("\n当前文本信息为:\n");for (i2=0;i2<=ntext-1;i2++)printf("%c",p[i2]);getchar();status=0;}}elsegoto loop;}if(d=='r'||d=='R')tihan(text,l);}13./*退出*/void tuichu(int status){char pd;if(status)exit(0);elseprintf("还未保存文件,确定退出?(Q.直接退出;Y.保存后退出");fflush(stdin);pd=getchar();if(!(pd=='Q'||pd=='q'))bc(text);exit(0);}int main(){menu();return (0);}调试分析1.界面设计2.界面设计2主界面的设计如图,比较单调。
delphi操纵word(完整版)[精华]
一、Delphi程序启动Word采用CreateOleObjects的方法来启动Word,调用VBA代码,具体实现过程为:首先使用GetActiveOleObject('Word.Application')判断当前内存中是否存在Word程序,如果存在,则直接连接,如果没有Word程序,则使用CreateOleObject('Word.Application')启动Word二、Delphi程序新建Word文稿格式:WordDocuments.Add(Template,NewTemplate,DocumentType,Visible)Template:使用模板的名称,NewTemplate:新建文档的类型,True表示为模板,False表示为文档DocumentType:文档类型,默认为空白文档Visible:打捞的窗口是否可见举例:Doc_Handle:=Word_Ole.Documents.Add(Template:='C:\Temlate.dot',NewTemplate:=False );三、Delphi程序打开Word文稿格式:WordDocuments.Open(FileName,ConfirmConversions,ReadOnly,PassWordDocument,PasswordTemplate,Revent,WritePasswordDocument,WritePassWordTemplate,Format,Encoding,Visible)FileName:文档名(包含路径)Confirmconversions:是否显示文件转换对话框ReadOnly:是否以只读方式打开文档AddToRecentFiles:是否将文件添加到"文件"菜单底部的最近使用文件列表中PassWordDocument:打开此文档时所需要的密码PasswordTemplate:打开此模板时所需要的密码Revert:如果文档已经,是否重新打开文档WritePasswordDocument:保存对文档更改时所需要的密码WritePasswordTemplate:保存对模板进行更改时所需要的密码Format:打开文档时所需使用的文件转换器Encoding:所使用的文档代码页Visible:打开文档的窗口是否可见举例:Doc_Handle:=Word_Ole.Documents.open(FileName:=Doc_File,ReadOnly:=False,AddToRecentFiles:=False);四、Delphi程序保存Word文稿格式:WordDocuments.SaveAs(FileName, FileFormat, LockComments, Password,AddToRecentFiles, WritePassword, ReadOnlyRecommended,EmbedTrueTypeFonts, SaveNativePictureFormat, SaveFormsData, SaveAsAOCELetter)FileName:文件名。
delphihtml编辑器,如何...
delphihtml编辑器,如何...你可能会说,现在有很多在StackOverflow的这个讨论,但大部分都是比我需要的,多为其他语言更加复杂。
我有,我有一个“帮助”表,用于填充使用该数据库的动态网站的帮助页面的代码MySQL的远程数据库。
我决定做一个Delphi应用程序来管理,而不是由网站本身做更多的速度和安全性网站。
我想提出一个TRichEdit做出帮助文本并使用简单的事情像对齐,粗体,斜体和下划线样式。
我不想用图片和字体。
如何挑选丰富样式的文本,并将其转换为HTML把我的BLOB字段在远程数据库中,然后再转换成丰富的文本,如果我想再次编辑呢?Answer 1:想这并没有给出准确的结果,许多不同的解决方案后,我的灵感来自于该解决方案:转换RTF到HTML和HTML为RTF 。
这个想法是,TWebBrowser控制(设计/编辑模式)可以处理并转换成正确的富文本格式,当它被从剪贴板粘贴。
uses SHDocVw, MSHTML;function ClipboardToHTML(AParent: TWinControl): WideString;varwb: TWebBrowser;function WaitDocumentReady: Boolean;varStartTime: DWORD;beginStartTime := GetTickCount;while wb.ReadyState <> READYSTATE_COMPLETE dobeginApplication.HandleMessage;if GetTickCount >= StartTime + 2000 then // time-out of max 2 secbeginResult := False; // time-outExit;end;end;Result := True;end;beginResult := '';wb := TWebBrowser.Create(nil);trywb.Silent := True;wb.Width := 0;wb.Height := 0;wb.Visible := False;TWinControl(wb).Parent := AParent;wb.HandleNeeded;if wb.HandleAllocated thenbeginwb.Navigate('about:blank');(wb.Document as IHTMLDocument2).designMode := 'on';if WaitDocumentReady thenbegin(wb.Document as IHTMLDocument2).execCommand('Paste', False, 0);Result := (wb.Document as IHTMLDocument2).body.innerHTML;end;end;finallywb.Free;end;end;procedure TForm1.Button1Click(Sender: TObject);beginRichEdit1.SelectAll;RichEdit1.CopyToClipboard;ShowMessage(ClipboardToHTML(Self));end;Answer 2:如果你真的想使用生成RTF内容TRichEdit ,那么你应该保存它产生沿着转换的HTML原生RTF。
Delphi中用memo写的记事本程序
实验四 Delphi组件应用综合实验指导实验目的掌握公共对话框组件的属性、事件及应用方法。
掌握应用程序界面设计方法。
掌握基本组件的综合应用。
掌握常用函数的应用。
实验内容设计一个文本编辑器实验要求参照windows记事本程序,编写类似的程序。
要求应用公共对话框、菜单组件、工具栏组件、备注框组件,完成菜单设计,工具栏设计,实现文件打开、保存、关闭、文字编辑(修改、查找、替换),文字格式设置等功能,保证主菜单、弹出式菜单、工具栏同步。
此编辑器主要由一个主菜单,一个工具栏,和一个快捷菜单组成,主要功能如下:主菜单:文件(新建,保存,另存为,打开,打印,退出),编辑(剪切,复制,黏贴,删除,查找,替换),更改(字体,背景),关于(是对此程序的制造者说明)。
工具栏:保存,新建,打开,打印,字体,粗体,斜体,下划线。
此工具栏是让用户更方便地使用按键。
快捷菜单:复制,剪切,黏贴。
可以自行设计其他功能,完善文本编辑器。
1、代码实现unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, Menus, StdCtrls, ComCtrls, ImgList, ToolWin, ExtDlgs;typeTForm1 = class(TForm)MainMenu1: TMainMenu;E1: TMenuItem;O1: TMenuItem;V1: TMenuItem;N3: TMenuItem;C1: TMenuItem;P2: TMenuItem;F2: TMenuItem;R1: TMenuItem;W1: TMenuItem;N4: TMenuItem;N5: TMenuItem;N1: TMenuItem;N2: TMenuItem;O2: TMenuItem;S1: TMenuItem;A1: TMenuItem;U1: TMenuItem;P1: TMenuItem;X1: TMenuItem;N6: TMenuItem;N7: TMenuItem;PopupMenu1: TPopupMenu;Edit1: TEdit;ToolBar1: TToolBar;ImageList1: TImageList;ToolButton1: TToolButton; ToolButton2: TToolButton; ToolButton3: TToolButton; ToolButton4: TToolButton; ToolButton5: TToolButton; ToolButton6: TToolButton; ToolButton7: TToolButton; ToolButton8: TToolButton; ToolButton9: TToolButton; ToolButton10: TToolButton; ToolButton11: TToolButton; N8: TMenuItem;N9: TMenuItem;N10: TMenuItem;N11: TMenuItem;N12: TMenuItem;N13: TMenuItem;N14: TMenuItem;N15: TMenuItem;N16: TMenuItem;N17: TMenuItem;N18: TMenuItem;N19: TMenuItem;N20: TMenuItem; FontDialog1: TFontDialog; ColorDialog1: TColorDialog; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; PrintDialog1: TPrintDialog; FindDialog1: TFindDialog;ReplaceDialog1: TReplaceDialog;PageSetupDialog1: TPageSetupDialog;Memo1: TMemo;D1: TMenuItem;L1: TMenuItem;w2: TMenuItem;procedure ToolButton8Click(Sender: TObject);procedure ToolButton9Click(Sender: TObject);procedure ToolButton10Click(Sender: TObject);procedure N11Click(Sender: TObject);procedure N12Click(Sender: TObject);procedure N15Click(Sender: TObject);procedure N16Click(Sender: TObject);procedure N17Click(Sender: TObject);procedure N18Click(Sender: TObject);procedure N19Click(Sender: TObject);procedure N3Click(Sender: TObject);procedure C1Click(Sender: TObject);procedure P2Click(Sender: TObject);procedure Memo1MouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);procedure N8Click(Sender: TObject);procedure N9Click(Sender: TObject);procedure N10Click(Sender: TObject);procedure ToolButton11Click(Sender: TObject);procedure ToolButton3Click(Sender: TObject);procedure ToolButton5Click(Sender: TObject);procedure P1Click(Sender: TObject);procedure A1Click(Sender: TObject);procedure N20Click(Sender: TObject);procedure X1Click(Sender: TObject);procedure U1Click(Sender: TObject);procedure R1Click(Sender: TObject);procedure F2Click(Sender: TObject);procedure ToolButton2Click(Sender: TObject);procedure ToolButton1Click(Sender: TObject);procedure O2Click(Sender: TObject);procedure N2Click(Sender: TObject);procedure S1Click(Sender: TObject);procedure N14Click(Sender: TObject);procedure N13Click(Sender: TObject);procedure N5Click(Sender: TObject);procedure D1Click(Sender: TObject);procedure L1Click(Sender: TObject);// procedure N21Click(Sender: TObject);procedure FindDialog1Find(Sender: TObject);procedure ReplaceDialog1Replace(Sender: TObject);procedure ReplaceDialog1Find(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;filename:string;implementation{$R *.dfm}procedure TForm1.Memo1MouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer); //鼠标选中文本,剪切,复制,等按钮才生效beginif memo1.SelLength>0 thenbeginn3.Enabled:=true;C1.Enabled:=true;n8.Enabled:=true;n9.Enabled:=true;D1.Enabled:=true;L1.Enabled:=true;endelsebeginn3.Enabled:=false;C1.Enabled:=false;n8.Enabled:=false;n9.Enabled:=false;D1.Enabled:=false;L1.Enabled:=false;end;end;procedure TForm1.N2Click(Sender: TObject); //新建(主菜单)begin{if (memo1.Lines.Text)<>'' thenbeginif MessageDlg('记事本中还有文本内容未保存,是否保存?',mtWarning,[mbyes,mbno],0)=mrok thenToolButton1.Click ;end; }memo1.clear;end;procedure TForm1.O2Click(Sender: TObject); //打开(主菜单)beginif OpenDialog1.Execute thenmemo1.lines.LoadfromFile(OpenDialog1.Filename);//把在打开文件对话框中‘选中的文件装载到文本框中end;procedure TForm1.S1Click(Sender: TObject); //保存(主菜单)beginif filename='' thenbeginif savedialog1.Execute thenbeginmemo1.Lines.SaveToFile(savedialog1.FileName);filename:=savedialog1.filename;endendelse memo1.Lines.SaveToFile(savedialog1.FileName); // 把文件保存到已打开的文本中end;procedure TForm1.A1Click(Sender: TObject); // 另存为(主菜单)beginif savedialog1.Execute thenbeginmemo1.Lines.SaveToFile(savedialog1.FileName);filename:=savedialog1.filename;end;end;procedure TForm1.U1Click(Sender: TObject); //页面设置(主菜单)???beginPagesetupDialog1.Execute;end;procedure TForm1.P1Click(Sender: TObject); //打印(主菜单)beginPrintDialog1.Execute;end;procedure TForm1.X1Click(Sender: TObject); //退出beginclose;end;procedure TForm1.N3Click(Sender: TObject); //剪切(主菜单)beginmemo1.CutToClipboard;n3.Enabled:=false;C1.Enabled:=false;n8.Enabled:=false;n9.Enabled:=false;end;procedure TForm1.C1Click(Sender: TObject); //复制(主菜单)beginmemo1.CutToClipboard;n3.Enabled:=false;C1.Enabled:=false;n8.Enabled:=false;n9.Enabled:=false;end;procedure TForm1.P2Click(Sender: TObject); //粘贴(主菜单)beginmemo1.PasteFromClipboard;end;procedure TForm1.F2Click(Sender: TObject); //查找(主菜单)?????begin//FindDialog1.Execute;//FindDialog1.Position:=Point(memo1.Left+memo1.Top,memo1.Width);//memo1.Lines.Text:=FindDialog.FindText;end;procedure TForm1.R1Click(Sender: TObject); //替换(主菜单)?????beginReplaceDialog1.Execute;end;procedure TForm1.N11Click(Sender: TObject); //字体-粗体(主菜单)beginif memo1.font.Style*[fsbold]=[] thenbeginmemo1.font.Style:=memo1.Font.Style+[fsbold];n11.checked:=true;ToolButton8.Down:=true;endelsebeginmemo1.font.Style:=memo1.Font.Style-[fsbold];n11.checked:=false;ToolButton8.Down:=false;end;end;procedure TForm1.N12Click(Sender: TObject); //字体-斜体(主菜单)beginif memo1.font.Style*[fsitalic]=[] thenbeginmemo1.font.Style:=memo1.Font.Style+[fsitalic];n12.checked:=true;ToolButton9.Down:=true;endelsebeginmemo1.font.Style:=memo1.Font.Style-[fsitalic];n12.checked:=false;ToolButton9.Down:=false;end;end;procedure TForm1.N15Click(Sender: TObject); //背景色-银色(主菜单)beginmemo1.color:=clsilver;end;procedure TForm1.N16Click(Sender: TObject); //背景色-灰色(主菜单)beginmemo1.color:=clgray;end;procedure TForm1.N17Click(Sender: TObject); //背景色-黑色(主菜单)beginmemo1.color:=clblack;end;procedure TForm1.N18Click(Sender: TObject); //背景色-红色(主菜单)beginmemo1.color:=clred;end;procedure TForm1.N19Click(Sender: TObject); //背景色-白色(主菜单)beginmemo1.color:=clwhite;end;procedure TForm1.N20Click(Sender: TObject); //字体颜色(主菜单)beginwith ColorDialog1 doif execute thenmemo1.Font.Color:=ColorDialog1.Color;end;procedure TForm1.ToolButton1Click(Sender: TObject); //保存(工具栏)beginS1.Click;end;procedure TForm1.ToolButton2Click(Sender: TObject); // 新建文件(工具栏)beginif (memo1.Lines.Text)<>'' thenbeginif MessageDlg('记事本中还有文本内容未保存,是否保存?',mtWarning,[mbyes,mbno],0)=mrok thenToolButton1.Click ;end;memo1.clear;end;procedure TForm1.ToolButton3Click(Sender: TObject); //打开(工具栏)beginif OpenDialog1.Execute=true thenmemo1.lines.LoadfromFile(OpenDialog1.Filename);//把在打开文件对话框中‘选中的文件装载到文本框中end;procedure TForm1.ToolButton5Click(Sender: TObject); //打印(工具栏)beginPrintDialog1.Execute;end;procedure TForm1.ToolButton11Click(Sender: TObject);//字体(工具栏)beginFontDialog1.font:=memo1.Font;with FontDialog1 doif execute thenmemo1.Font:=FontDialog1.Font;end;procedure TForm1.ToolButton8Click(Sender: TObject); //粗体(工具栏)beginif memo1.font.Style*[fsbold]=[] thenbeginmemo1.font.Style:=memo1.Font.Style+[fsbold];n11.checked:=true;ToolButton8.Down:=true;endelsebeginmemo1.font.Style:=memo1.Font.Style-[fsbold];n11.checked:=false;ToolButton8.Down:=false;end;end;procedure TForm1.ToolButton9Click(Sender: TObject); //斜体(工具栏)beginif memo1.font.Style*[fsitalic]=[] thenbeginmemo1.font.Style:=memo1.Font.Style+[fsitalic];n12.checked:=true;ToolButton9.Down:=true;endelsebeginmemo1.font.Style:=memo1.Font.Style-[fsitalic];n12.checked:=false;ToolButton9.Down:=false;end;end;procedure TForm1.ToolButton10Click(Sender: TObject); //下划线(工具栏)beginif memo1.font.Style*[fsunderline]=[] thenbeginmemo1.font.Style:=memo1.Font.Style+[fsunderline];ToolButton10.Down:=true;endelsebeginmemo1.font.Style:=memo1.Font.Style-[fsunderline];ToolButton10.Down:=false;end;end;procedure TForm1.N8Click(Sender: TObject); //复制(弹出式菜单)beginmemo1.CutToClipboard;n3.Enabled:=false;C1.Enabled:=false;n8.Enabled:=false;n9.Enabled:=false;end;procedure TForm1.N9Click(Sender: TObject); //剪切(弹出式菜单)beginmemo1.CutToClipboard;n3.Enabled:=false;C1.Enabled:=false;n8.Enabled:=false;n9.Enabled:=false;end;procedure TForm1.N10Click(Sender: TObject); //粘贴(弹出式菜单)beginmemo1.PasteFromClipboard;end;procedure TForm1.N13Click(Sender: TObject); //查找(弹出式菜单)????beginFindDialog1.Execute;memo1.SelStart:=0;end;procedure TForm1.N14Click(Sender: TObject); //替换(弹出式菜单)?????beginReplaceDialog1.Execute;memo1.SelStart:=0;end;procedure TForm1.N5Click(Sender: TObject);beginshowmessage('欢迎使用本程序!'+#13'编者姓名:卢慧琳');end;procedure TForm1.D1Click(Sender: TObject);beginmemo1.SelText:='';end;procedure TForm1.L1Click(Sender: TObject);beginmemo1.SelText:='';end;procedure TForm1.FindDialog1Find(Sender: TObject); //查找Varselpos,startpos,toend:integer;t:string;beginstartpos:=memo1.SelStart+memo1.SelLength+1;toend:=Length(memo1.lines.Text)-startpos+1;t:=copy(memo1.Lines.Text,startpos,toend);selpos:=pos(finddialog1.FindText,t);if selpos>0 thenbeginselpos:=selpos+startpos-1;memo1.setfocus;memo1.SelStart:=selpos-1;memo1.SelLength:=Length(FindDialog1.FindText);endelseshowmessage('不能找到'+finddialog1.findtext);end;{ procedure TForm1.N21Click(Sender: TObject); //查找下一个beginif finddialog1.FindText='' thenfinddialog1.Executeelsefinddialog1Find(sender);end; }procedure TForm1.ReplaceDialog1Replace(Sender: TObject);var selpos:integer;beginselpos:=Pos(ReplaceDialog1.FindText ,Memo1.Lines.Text );if selpos>0 thenbeginMemo1.SelStart :=selpos-1;Memo1.SelLength :=Length(ReplaceDialog1.FindText );Memo1.SelText :=ReplaceDialog1.ReplaceText ;endelseshowmessage('不能找到'+ReplaceDialog1.FindText);end;procedure TForm1.ReplaceDialog1Find(Sender: TObject);beginForm1.FindDialog1Find(Sender);end;end.unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, StdCtrls, ComCtrls, ImgList, ToolWin, ExtDlgs;typeTForm1 = class(TForm)MainMenu1: TMainMenu;E1: TMenuItem;O1: TMenuItem;V1: TMenuItem;N3: TMenuItem;C1: TMenuItem;P2: TMenuItem;F2: TMenuItem;R1: TMenuItem;W1: TMenuItem;N4: TMenuItem;N5: TMenuItem;N1: TMenuItem;N2: TMenuItem;O2: TMenuItem;S1: TMenuItem;A1: TMenuItem;U1: TMenuItem;P1: TMenuItem;X1: TMenuItem;N6: TMenuItem;N7: TMenuItem; PopupMenu1: TPopupMenu; Edit1: TEdit;ToolBar1: TToolBar; ImageList1: TImageList; ToolButton1: TToolButton; ToolButton2: TToolButton; ToolButton3: TToolButton; ToolButton4: TToolButton; ToolButton5: TToolButton;ToolButton6: TToolButton; ToolButton7: TToolButton; ToolButton8: TToolButton; ToolButton9: TToolButton; ToolButton10: TToolButton; ToolButton11: TToolButton;N8: TMenuItem;N9: TMenuItem;N10: TMenuItem;N11: TMenuItem;N12: TMenuItem;N13: TMenuItem;N14: TMenuItem;N15: TMenuItem;N16: TMenuItem;N17: TMenuItem;N18: TMenuItem;N19: TMenuItem;N20: TMenuItem;FontDialog1: TFontDialog; ColorDialog1: TColorDialog; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; PrintDialog1: TPrintDialog; FindDialog1: TFindDialog; ReplaceDialog1: TReplaceDialog; PageSetupDialog1: TPageSetupDialog; Memo1: TMemo;D1: TMenuItem;L1: TMenuItem;w2: TMenuItem;procedure ToolButton8Click(Sender: TObject);procedure ToolButton9Click(Sender: TObject);procedure ToolButton10Click(Sender: TObject);procedure N11Click(Sender: TObject);procedure N12Click(Sender: TObject);procedure N15Click(Sender: TObject);procedure N16Click(Sender: TObject);procedure N17Click(Sender: TObject);procedure N18Click(Sender: TObject);procedure N19Click(Sender: TObject);procedure N3Click(Sender: TObject);procedure C1Click(Sender: TObject);procedure P2Click(Sender: TObject);procedure Memo1MouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);procedure N8Click(Sender: TObject);procedure N9Click(Sender: TObject);procedure N10Click(Sender: TObject);procedure ToolButton11Click(Sender: TObject);procedure ToolButton3Click(Sender: TObject);procedure ToolButton5Click(Sender: TObject);procedure P1Click(Sender: TObject);procedure A1Click(Sender: TObject);procedure N20Click(Sender: TObject);procedure X1Click(Sender: TObject);procedure U1Click(Sender: TObject);procedure R1Click(Sender: TObject);procedure F2Click(Sender: TObject);procedure ToolButton2Click(Sender: TObject);procedure ToolButton1Click(Sender: TObject);procedure O2Click(Sender: TObject);procedure N2Click(Sender: TObject);procedure S1Click(Sender: TObject);procedure N14Click(Sender: TObject);procedure N13Click(Sender: TObject);procedure N5Click(Sender: TObject);procedure D1Click(Sender: TObject);procedure L1Click(Sender: TObject);// procedure N21Click(Sender: TObject);procedure FindDialog1Find(Sender: TObject);procedure ReplaceDialog1Replace(Sender: TObject);procedure ReplaceDialog1Find(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;filename:string;implementation{$R *.dfm}procedure TForm1.Memo1MouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer); //鼠标选中文本,剪切,复制,等按钮才生效beginif memo1.SelLength>0 thenbeginn3.Enabled:=true;C1.Enabled:=true;n8.Enabled:=true;n9.Enabled:=true;D1.Enabled:=true;L1.Enabled:=true;endelsebeginn3.Enabled:=false;C1.Enabled:=false;n8.Enabled:=false;n9.Enabled:=false;D1.Enabled:=false;L1.Enabled:=false;end;end;procedure TForm1.N2Click(Sender: TObject); //新建(主菜单)beginif (memo1.Lines.Text)<>'' thenbeginif MessageDlg('记事本中还有文本内容未保存,是否保存?',mtWarning,[mbyes,mbno],0)=mrok thenToolButton1.Click ;end;memo1.clear;end;procedure TForm1.O2Click(Sender: TObject); //打开(主菜单)beginif OpenDialog1.Execute thenmemo1.lines.LoadfromFile(OpenDialog1.Filename);//把在打开文件对话框中‘选中的文件装载到文本框中end;procedure TForm1.S1Click(Sender: TObject); //保存(主菜单)beginif filename='' thenbeginif savedialog1.Execute thenbeginmemo1.Lines.SaveToFile(savedialog1.FileName);filename:=savedialog1.filename;endendelse memo1.Lines.SaveToFile(savedialog1.FileName); // 把文件保存到已打开的文本中end;procedure TForm1.A1Click(Sender: TObject); // 另存为(主菜单)beginif savedialog1.Execute thenbeginmemo1.Lines.SaveToFile(savedialog1.FileName);filename:=savedialog1.filename;end;end;procedure TForm1.U1Click(Sender: TObject); //页面设置(主菜单)beginPagesetupDialog1.Execute;end;procedure TForm1.P1Click(Sender: TObject); //打印(主菜单)beginPrintDialog1.Execute;end;procedure TForm1.X1Click(Sender: TObject); //退出beginclose;end;procedure TForm1.N3Click(Sender: TObject); //剪切(主菜单)beginmemo1.CutToClipboard;n3.Enabled:=false;C1.Enabled:=false;n8.Enabled:=false;n9.Enabled:=false;end;procedure TForm1.C1Click(Sender: TObject); //复制(主菜单)beginmemo1.CutToClipboard;n3.Enabled:=false;C1.Enabled:=false;n8.Enabled:=false;n9.Enabled:=false;end;procedure TForm1.P2Click(Sender: TObject); //粘贴(主菜单)beginmemo1.PasteFromClipboard;end;procedure TForm1.F2Click(Sender: TObject); //查找(主菜单)beginFindDialog1.Execute;memo1.SelStart:=0;end;procedure TForm1.R1Click(Sender: TObject); //替换(主菜单)beginReplaceDialog1.Execute;memo1.SelStart:=0;end;procedure TForm1.N11Click(Sender: TObject); //字体-粗体(主菜单)beginif memo1.font.Style*[fsbold]=[] thenbeginmemo1.font.Style:=memo1.Font.Style+[fsbold];n11.checked:=true;ToolButton8.Down:=true;endelsebeginmemo1.font.Style:=memo1.Font.Style-[fsbold];n11.checked:=false;ToolButton8.Down:=false;end;end;procedure TForm1.N12Click(Sender: TObject); //字体-斜体(主菜单)beginif memo1.font.Style*[fsitalic]=[] thenbeginmemo1.font.Style:=memo1.Font.Style+[fsitalic];n12.checked:=true;ToolButton9.Down:=true;endelsebeginmemo1.font.Style:=memo1.Font.Style-[fsitalic];n12.checked:=false;ToolButton9.Down:=false;end;end;procedure TForm1.N15Click(Sender: TObject); //背景色-银色(主菜单)beginmemo1.color:=clsilver;end;procedure TForm1.N16Click(Sender: TObject); //背景色-灰色(主菜单)beginmemo1.color:=clgray;end;procedure TForm1.N17Click(Sender: TObject); //背景色-黑色(主菜单)beginmemo1.color:=clblack;end;procedure TForm1.N18Click(Sender: TObject); //背景色-红色(主菜单)beginmemo1.color:=clred;end;procedure TForm1.N19Click(Sender: TObject); //背景色-白色(主菜单)beginmemo1.color:=clwhite;end;procedure TForm1.N20Click(Sender: TObject); //字体颜色(主菜单)beginwith ColorDialog1 doif execute thenmemo1.Font.Color:=ColorDialog1.Color;end;procedure TForm1.ToolButton1Click(Sender: TObject); //保存(工具栏)beginS1.Click;end;procedure TForm1.ToolButton2Click(Sender: TObject); // 新建文件(工具栏)beginN2.Click;end;procedure TForm1.ToolButton3Click(Sender: TObject); //打开(工具栏)beginO2.Click;end;procedure TForm1.ToolButton5Click(Sender: TObject); //打印(工具栏)beginPrintDialog1.Execute;end;procedure TForm1.ToolButton11Click(Sender: TObject);//字体(工具栏)beginFontDialog1.font:=memo1.Font;with FontDialog1 doif execute thenmemo1.Font:=FontDialog1.Font;end;procedure TForm1.ToolButton8Click(Sender: TObject); //粗体(工具栏)beginn11.Click;end;procedure TForm1.ToolButton9Click(Sender: TObject); //斜体(工具栏)beginif memo1.font.Style*[fsitalic]=[] thenbeginmemo1.font.Style:=memo1.Font.Style+[fsitalic];n12.checked:=true;ToolButton9.Down:=true;endelsebeginmemo1.font.Style:=memo1.Font.Style-[fsitalic];n12.checked:=false;ToolButton9.Down:=false;end;end;procedure TForm1.ToolButton10Click(Sender: TObject); //下划线(工具栏)beginif memo1.font.Style*[fsunderline]=[] thenbeginmemo1.font.Style:=memo1.Font.Style+[fsunderline];ToolButton10.Down:=true;endelsebeginmemo1.font.Style:=memo1.Font.Style-[fsunderline];ToolButton10.Down:=false;end;end;procedure TForm1.N8Click(Sender: TObject); //复制(弹出式菜单)beginC1.Click;end;procedure TForm1.N9Click(Sender: TObject); //剪切(弹出式菜单)beginN3.Click;end;procedure TForm1.N10Click(Sender: TObject); //粘贴(弹出式菜单)beginP2.Click;end;procedure TForm1.N13Click(Sender: TObject); //查找(弹出式菜单)beginF2.Click;end;procedure TForm1.N14Click(Sender: TObject); //替换(弹出式菜单)beginR1.Click ;end;procedure TForm1.N5Click(Sender: TObject);beginshowmessage('欢迎使用本程序!'+#13'编者姓名:*** ');end;procedure TForm1.D1Click(Sender: TObject); //删除(主菜单)beginmemo1.SelText:='';end;procedure TForm1.L1Click(Sender: TObject); //删除(弹出式菜单)beginmemo1.SelText:='';end;procedure TForm1.FindDialog1Find(Sender: TObject); //查找对话框Varselpos,startpos,toend:integer;t:string;beginstartpos:=memo1.SelStart+memo1.SelLength+1;toend:=Length(memo1.lines.Text)-startpos+1;t:=copy(memo1.Lines.Text,startpos,toend);selpos:=pos(finddialog1.FindText,t);if selpos>0 thenbeginselpos:=selpos+startpos-1;memo1.setfocus;memo1.SelStart:=selpos-1;memo1.SelLength:=Length(FindDialog1.FindText);endelseshowmessage('不能找到'+finddialog1.findtext);end;procedure TForm1.ReplaceDialog1Replace(Sender: TObject);//替换对话框替换功能var selpos:integer;beginselpos:=Pos(ReplaceDialog1.FindText ,Memo1.Lines.Text );if selpos>0 thenbeginMemo1.SelStart :=selpos-1;Memo1.SelLength :=Length(ReplaceDialog1.FindText );Memo1.SelText :=ReplaceDialog1.ReplaceText ;endelseshowmessage('不能找到'+ReplaceDialog1.FindText);end;procedure TForm1.ReplaceDialog1Find(Sender: TObject); //替换对话框查找功能beginForm1.FindDialog1Find(Sender);end;end.实验结果实验完成后,提交程序代码及简单的功能和操作说明。
第四章 文本编辑器的设计(一)
本章介绍多文本界面(MDI)、多页面界面(MPI)技术;VCL库中TMemo,TEdit 控件以及有关文本编辑的常用对话框的使用。
我们开发的MPIEdit.dpr是一个文本编辑的实用程序,可实现如下功能:● MDI的编辑环境● MPI的编辑环境●创建打开、编辑、保存文件●查找、替换文件中指定的字符串●复制、粘贴、剪切字符串●设置文件字体大小●打印文件本章将通过MPIEdit实用程序逐一介绍在Delphi中如何实现上述功能。
文本编辑器是一种常用的应用程序。
用户在编辑器中编辑多种文件,在多个文件之间进行数据交换,对文件进行各种属性设置,并按自己要求打印文件。
4.1 多文本界面多文本界面是一种在一个应用程序中同时打开两个或更多文件的界面形式。
例如在字处理程序可同时打开多个文件,用户可在多个文件中方便地进行切换.MDI应用程序提供了一种方便的方式,使得用户在同一工作区域内对多个文档进行观察和交换数据。
MDI工作区域可分为父窗体和子窗体,在Dephi的MDI应用程序中,父窗体通常是程序的主窗体。
在MDI中,父窗体之外的窗体称为子窗体,文档或其它数据在子窗体打开。
这些文档可以是相同的文件格式,或在应用程序支持下也可以是不同的文件格式。
在设计阶段,可创建 MDI 父窗体作为应用程序主窗体,亦可创建子窗体样板。
Delph i允许创建多个子窗体类型,但MDI应用程序只支持其中的一种。
本节讲述创建MDI应用程序的基本步骤:●创建主窗口●创建子窗口●创建主窗口菜单●融合菜单●运行时创建子窗口4.1.1 创建父窗口在MDI应用程序中,主窗口为应用文档提供一个工作区域。
这个区域可打开一个或多个子窗口,创建父窗口是建立MDI应用程序的第一步。
创建父窗口与其它窗口类似,不同之处在于设置窗体的FormStyle属性。
FormStyle属性可决定一个窗体是父窗口还是子窗口,或不是MDI类型。
只能在设计阶段确定FormStyle。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本章介绍多文本界面(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 创建应用程序菜单与菜单融合父窗口的菜单应作为应用程序主菜单。
如果子窗口有菜单,则当子窗口在运行获得焦点并最大化时,子窗口的菜单项将融合父窗口菜单。
创建父窗口与子窗口菜单的方法与创建普通窗体菜单类似,详细步骤见第一章。
菜单融合是指程序运行过程中,子菜单与父窗口菜单的相互作用。
如当子窗口获得焦点时,子窗口的菜单或插入主窗口的菜单中,或将替换部分或全部的父窗口菜单。
进行菜单融合需设置的两个属性:●窗体的Menu属性●菜单项的GroupIndex属性Menu属性定义窗体的活动菜单,而菜单融合只对活动菜单进行。
如果窗体有多个菜单部件,运行时可通过以下代码进行改变:Form1.Menu := SecondMenu;GroupIndex属性决定出现在菜单条中各菜单项的位置,在菜单融合中,GroupIndex 将决定融合菜单是插入还是替换主窗体菜单条中的菜单。
GroupIndex的缺省值是0,可以用下规则确定其值:1. 数值越小,菜单的位置越靠左。
例如:GroupIndex为0的菜单将出现在菜单条中的最左端。
随着GroupIndex数值的增大,菜单项依次向右排列。
2. 若需替换主菜单中的某一菜单项,则将子菜单相应菜单项的GroupIndex设为与之相等的值。
这条规则适合一个或多个菜单项。
例如,主菜单中的"Edit"菜单项的GroupIndex 的值为1。
将子菜单的一个或多个菜单项的GroupIndext的值设为1,则在运行时,这些菜单项替换主窗口的"Edit"菜单。
将同一窗体的多个菜单项的GroupIndex设为相同值,原有的排列顺序在菜单融合时将保持不变。
3. 若要在菜单融合时插入菜单项,需在主菜单中预留数值“位置”。
例如,主菜单的两菜单项数值为0,5,则子菜单GroupIndex数值为1,2,3,4的菜单在融合时将插入其中。
在使用MDI界面时,用户通常会打开多个窗体。
为了使用户方便地进行窗体切换,常设有一个进行切换的菜单项.此菜单列出了打开窗体的名称,当用户选择其中的一个时,程序进行相应的窗体切换。
在Delphi的MDI设计时,可非常方便地实现这一功能。
方法是将父窗口的WindowMenu设置成该菜单项的名字即可。
4.2 多页面界面多页面界面是一种非常友好的界面形式。
它由一个窗体和多个页面组成,关于每个页面的信息列在窗体底部的标签(Tabs)上,用户可通过选择标签来进行页面切换。
每次只有一个页面显示在窗体中。
MPI较MDI使用更为方便,且切换速度更快。
本章例程就是多页面界面的例子。
另外Delphi集成开发环境中的代码编辑(Code Editor)窗体是MPI应用在文本编辑中的实例。
在MPI中,一个窗体内的多个文件可以方便地进行切换和交换数据。
多页面界面分为静态MPI和动态MPI两种形式。
静态MPI的标签数量固定,用户在事先设计好的多个页面上进行切换。
象选择对话框(Option Dialog)就属于静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);…beginNotebook1.PageIndex := TabSet1.TabIndex;…end;设计静态MPI时,可在部件窗体(Component Palette)的WIN3。
1页面中选中TNotebook 部件,然后在Object inspector窗体中双击TNotebook的Pages属性,Dephi 将弹出对话框,用户可以在此确定Notebook的页数和字符串列表,如图4.6。
关闭对话框后,可对每一页进行设计,使用鼠标右按钮弹出快速菜单进行页面切换。
4.2.2 动态多页面界面使用Delphi进行静态MPI设计非常简单,进行动态MPI设计则需编写专门的代码。
对于一个多页面文本编辑器,应能实现以下功能:●动态生成页面,每个页面均能进行文本编辑●动态关闭页面,直到窗体中只有一个页面为止●页面切换不影响各种文本编辑操作为了实现以上功能,程序中使用了动态页面类(TDynaPage),其定义如下:type TDynaPage = Class(TObject);该类可根据需要动态的产生页面,每个页面上创建了可进行文本编辑的TMeno部件。
procedure...puclicCurPage : integer;FileList : TSringList;end;CurPage表示当前用户选择的页面数,用户切换、增加、删除页面均影响CurPage 的值,CurPage初如化为零页。
FileList存放打开或创建文件的名字以及与这些文件相关的编辑部件TMemo,页面动态创建、删除将影响FilstList的值。
TNotebook部件创建后至少有一个页面,因此Pages属性不是空值,只要往Pages中加入字符串,Delphi自动地把该字符串与TPage类对象相联系。
TPage类是TCustomEdit派生出来的,在对象浏览器(Object Browse)中可观察到TPage的数据成员和方法。
静态生成的页面也是 TPage类。
要创建多页面编辑器,必须从TPage的父件(Parent属件)创建相应编辑部件。
但在动态创建页面时,TPage只是一个与字符串相联系的TObject类,不能写成:MemoParent := Notebook1.Pages.Object[ ];在Delphi中,宣称对象和创建对象都是用指针来标识,因此可用无类型指针进行指针传递。
varPi : Pointer;beginPi := Notebook1.Pages.Object[];Memo.Parent := Pi;end;这样就可在TPage上动态创建编辑部件了。
往Notebook1中动态生成页面时,页面应所相应的切换,TDynaPage. Notebook1.Tabset1有关的属性要作相应的调整。
TDynaPage的DynaAdd方法定义如下:procedure TDynaPage.DynaAdd(Sender:TNotebook;FileName:String);varPi:Pointer;Memo:TMemo;beginSender.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);varMemo:TMemo;beginMemo:=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); varPi:pointer;beginSender.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;当用户在多个页面中进行切换时,程序应当保证对当前页面进行编辑。