Delphi 13 Florence 下 TRichView v23.0.1 全源码包安装与富文本开发实战
简介本资源为Delphi 13.1Florence平台下的TRichView v23.0.1完整源码包面向使用Object Pascal进行富文本编辑器、报表系统开发的Delphi开发者尤其适合需要深入组件内部机制或做二次定制的中高级人员。压缩包共约2000个文件以1416个cpp、292个hpp、188个h等C源码与头文件为主体另含19个pas单元、14个dcu编译单元、6个dproj工程文件及dfm、dpk、dpr等Delphi工程资源并附带chm帮助文档与pdf说明整体约47.18MB。TRichView支持字体、颜色、段落、页边距等高级格式化可插入图片、表格、超链接与嵌入对象并能导出HTML、PDF等格式。完整源码便于研究、调试、修改与扩展帮助开发者快速构建功能完备的文档编辑与报表模块。目前已有39人学习下载。1. Delphi 13 Florence 下拿到 TRichView v23.0.1 全源码包先想清楚三件事Delphi 13 Florence 发布之后VCL 生态里被问得最多的一类问题就是富文本控件怎么选。TRichView v23.0.1 for Delphi 13 Florence Full Source 这个包本质上是把一套成熟的 Delphi 富文本渲染与编辑控件连同完整源码一起交到你手里。它解决的不是「显示一段带颜色的字」这种小需求而是文档级排版多级样式、表格嵌套、图片浮动、页眉页脚、RTF/DOCX 导入导出、超链接与书签、打印分页。适合谁做 OA、医疗病历、合同模板、报表批注、聊天记录富文本回显的 Delphi 团队。Full Source 意味着你能改底层、能跟版本、能在出问题时自己下断点而不是对着 DCU 干瞪眼。这一章先把「值不值得投入」讲透后面再动手。很多人第一次接触这个包是被「Full Source」四个字吸引但真正决定项目成败的是三个前置判断你的 Delphi 13 Florence 是 32 位还是 64 位目标、你的文档是「编辑态」还是「只读渲染态」、你的输出格式是 RTF 还是 DOCX。这三个问题没想清楚装完控件就会在编译期和运行期各翻一次车。我见过太多人把源码包解压后直接 Install结果包路径里混着旧版本 DCU编译报一堆找不到单元最后怀疑是包坏了。其实不是包的问题是安装顺序和搜索路径没理干净。TRichView 的定位和普通 Memo、RichEdit 不一样。VCL 自带的 TRichEdit 走的是 Windows RichEdit 控件受系统版本影响大样式能力有限64 位下还有一堆历史包袱。TRichView 是自己实现渲染管线样式模型、段落模型、表格模型都是自己的类所以它能做到 RichEdit 做不到的嵌套表格和精确分页。代价是学习曲线你得理解它的 Style、ParaStyle、Item 三层结构。这一章不展开代码先把心智模型立住从第 2 章开始一步步落地。2. 把 Full Source 包在 Delphi 13 Florence 里装干净路径、包组与编译顺序2.1 解压后的目录该看哪几个别一股脑全加进搜索路径拿到 rar 先解压到一个短路径比如D:\Components\TRichView\不要放在桌面或带中文、带空格的路径下。Delphi 的包编译对路径里的空格和中文容忍度很低这是血泪经验。解压后典型会看到几个关键目录源码单元目录一堆.pas、设计期包目录.dpk、Demo 目录、帮助文档目录。你要做的第一件事不是打开 Delphi而是先用资源管理器确认.dpk文件在哪以及源码.pas是否和.dpk在同一层或相邻层。常见做法是只把「源码单元目录」加进 Library Path把「设计期包目录」单独用于 Install Packages不要把 Demo 目录也加进搜索路径。Demo 里经常有同名单元或旧版本残留一旦进了全局搜索路径编译时 Delphi 会优先命中 Demo 里的旧文件报出莫名其妙的「方法签名不匹配」。我一般会在加路径之前先在整个解压目录里搜一遍有没有重复的.pas文件名重复的先记下来后面排错用得上。提示解压后先别急着 Install先确认包里是否有针对 Delphi 13 Florence 的包组文件。不同大版本对应的.dpk可能不同用错版本会在编译期报「unit not found」或「incompatible type」。2.2 在 IDE 里加 Library Path 与 Install 包组的正确顺序顺序错了是新手最常见的翻车点。正确顺序是先配 Library Path再编译运行期包最后 Install 设计期包。运行期包Runtime Package负责实际功能单元设计期包Design Package负责把控件注册到 Tool Palette。如果先 Install 设计期包而运行期包还没编译IDE 会提示找不到依赖单元。具体操作打开 Delphi 13 FlorenceTools → Options → Language → Delphi → Library在Library Path对应目标平台Win32 和 Win64 要分别配里加入源码单元目录。然后File → Open打开运行期包的.dpk右键Compile确认无错。再打开设计期包.dpk右键Install。安装成功后 Tool Palette 上会出现 TRichView 相关控件页。// 安装完成后用一个最小工程验证单元能否被引用 // 新建 VCL Application在 Unit1 的 uses 里加入核心单元 uses Vcl.Forms, RVStyle, // 样式与段落样式定义单元 RVMain, // 主渲染与编辑控件单元 RVTable; // 表格支持单元用到表格才需要 procedure TForm1.FormCreate(Sender: TObject); begin // 这里只做编译期验证不创建控件 // 能编译通过说明 Library Path 配对了 end;上面这段代码的作用不是跑功能而是验证搜索路径。RVStyle、RVMain、RVTable是 TRichView 体系里最常被引用的三个单元如果这三个都能被编译器找到说明路径基本正确。参数说明RVStyle管样式RVMain管控件主体RVTable管表格按需引用不要无脑全加否则编译变慢还容易撞名。如果这一步报「unit not found」回去检查 Library Path 是不是加在了错误的平台节点下——Win32 的路径不会自动作用于 Win64。2.3 编译顺序与平台目标Win32 和 Win64 要各来一遍Delphi 13 Florence 默认可能只配了一个平台。TRichView 的源码是跨平台的但包编译是按平台分开的。你如果在 Win32 下 Install 成功切到 Win64 编译工程时可能又报找不到单元因为 Win64 的 Library Path 和包二进制是独立的。常见做法是在Project Manager里把目标平台切到 Win64重新对运行期包Compile一次再确认设计期包在 Win64 下也 OK。这里有个容易忽略的点设计期包通常只需要在一个平台下 Install 给 IDE 用但运行期包必须每个目标平台都编译。如果你只做 Win32 应用可以跳过 Win64但只要工程里出现过 64 位目标就必须补上。我一般会在装完后立刻建两个空工程一个 Win32 一个 Win64各引用一次核心单元确认都能编译再开始写业务。这一步花五分钟能省后面半小时的排查。3. TRichView 的样式模型怎么落地Style、ParaStyle 与 Item 三层结构3.1 为什么不能像 RichEdit 那样直接塞文本三层模型到底解决什么TRichView 和 RichEdit 最大的区别在于它把「字符样式」「段落样式」「内容项」拆成了三层。字符样式TextStyle管字体、颜色、粗斜体段落样式ParaStyle管对齐、缩进、行距、段前段后内容项Item是文档流里的最小单位可以是一段文字、一张图片、一个表格、一个控件占位。你往文档里加内容本质是往 Item 列表里追加不同类型的 Item每个 Item 再引用自己的样式索引。这个模型的好处是改一处样式所有引用该样式的 Item 一起变不用遍历文本。坏处是你不能像 RichEdit 那样SelAttributes.Color : clRed直接改必须先有样式再让 Item 指向它。新手最容易犯的错就是「想临时改一个字颜色」结果去改全局样式把整篇文档都改了。正确做法是新建一个 TextStyle只让目标 Item 用它。// 初始化一个 TRichView 的样式体系通常在窗体创建时做一次 procedure TForm1.InitRVStyles; begin // 清空默认样式避免和设计期残留冲突 RVStyle1.TextStyles.Clear; RVStyle1.ParaStyles.Clear; // 正文样式宋体 10.5黑色 with RVStyle1.TextStyles.Add do begin FontName : 宋体; Size : 10; // 单位是 pt 的十分之一10 表示 1pt注意这里按控件约定 Color : clBlack; end; // 强调样式红色加粗索引为 1 with RVStyle1.TextStyles.Add do begin FontName : 微软雅黑; Size : 12; Color : clRed; Style : [fsBold]; end; // 段落样式左对齐首行缩进两个字符 with RVStyle1.ParaStyles.Add do begin Alignment : taLeftJustify; FirstIndent : 20; // 单位与控件约定一致按实际文档调整 end; end;逻辑说明TextStyles.Add返回一个样式对象索引从 0 开始。后面往文档加 Item 时用索引指定样式。参数说明Size的单位在不同版本里可能是 pt 或十分之一 pt务必用 Demo 里的实际效果校准不要凭记忆写。FirstIndent同理单位不对会导致缩进看起来「玄学」——明明设了 20 却几乎没缩进或者缩进到屏幕外。我一般会先做一个只有一行字的测试文档把缩进调到肉眼合适再记下这个数值用到正式代码里。3.2 往文档里追加带样式的段落AddText、AddPicture 与换行控制有了样式就可以往文档里加内容。TRichView 的追加 API 是流式的先AddText加文字再AddPicture加图片段落结束时用AddText(#13)或专门的换行方法。注意#13在 TRichView 里是否被当作段落分隔取决于版本和配置稳妥做法是用它提供的段落结束方法而不是硬塞回车符。// 往文档追加一段正文 一段强调文字 一张图片 procedure TForm1.BuildDocument; begin RVMain1.Clear; // 清空现有内容 // 第一段正文样式索引 0段落样式索引 0 RVMain1.AddText(这是正文第一段使用默认样式。, 0); RVMain1.AddText(#13, 0); // 段落结束具体以控件文档为准 // 第二段强调样式索引 1 RVMain1.AddText(这是红色加粗的强调内容。, 1); RVMain1.AddText(#13, 1); // 追加一张图片图片本身不依赖文字样式 RVMain1.AddPicture(D:\test.png, 0); end;逻辑说明AddText的第二个参数是 TextStyle 索引不是 ParaStyle 索引。段落样式通常在段落级 API 里设置或者通过ParaStyleNo属性控制。参数说明图片路径必须是绝对路径或工程能解析的相对路径路径不存在时不会抛异常而是静默不显示这是排查「图片不出现」时的第一检查点。Clear会释放已有 Item频繁重建文档时要注意性能大文档建议用增量更新而不是每次 Clear。3.3 表格与嵌套TRichView 表格模型和普通 Grid 的本质差别TRichView 的表格是文档流的一部分不是独立的 Grid 控件。这意味着表格可以嵌在段落之间单元格里还能再放文字、图片甚至另一个表格。这和 StringGrid、DBGrid 完全不是一个思路。做合同、病历这类「表格里套表格」的文档这是它最值钱的地方。// 在文档中插入一个 2x2 表格并往单元格写内容 procedure TForm1.InsertTable; var Table: TRVTableItemInfo; begin // 创建表格对象2 行 2 列 Table : TRVTableItemInfo.CreateEx(2, 2, RVMain1.RVData); try // 往单元格写文字样式索引 0 Table.Cells[0, 0].AddText(姓名, 0); Table.Cells[0, 1].AddText(张三, 0); Table.Cells[1, 0].AddText(科室, 0); Table.Cells[1, 1].AddText(内科, 0); // 把表格作为 Item 追加到文档 RVMain1.AddItem(, Table); except Table.Free; raise; end; end;逻辑说明CreateEx创建表格Cells[row, col]访问单元格单元格本身也是一个小文档容器所以能继续AddText。参数说明行列索引从 0 开始AddItem把表格挂到主文档流。注意异常处理里Table.Free的位置——如果AddItem成功表格所有权转移给文档不能再 Free只有失败时才需要自己释放。这个所有权细节是 TRichView 里最容易内存泄漏的地方我一般会在AddItem前后各打一个日志确认所有权转移时机。4. 富文本导入导出与打印RTF、DOCX 和分页的边界在哪4.1 RTF 导入导出格式保真度和样式映射的取舍TRichView 支持 RTF 读写但「支持」不等于「无损」。RTF 本身是个老格式样式表达能力有限TRichView 的高级特性比如某些嵌套表格、自定义 Item导出成 RTF 会丢。常见做法是如果文档只在你的系统内部流转用 TRichView 自己的格式存如果要和 Word 互通用 RTF 或 DOCX并接受一定程度的样式简化。// 导出当前文档为 RTF 文件 procedure TForm1.ExportRTF(const AFileName: string); begin RVMain1.SaveRTF(AFileName, False); // 第二个参数控制是否包含某些扩展信息 end; // 从 RTF 文件导入 procedure TForm1.ImportRTF(const AFileName: string); begin RVMain1.LoadRTF(AFileName); end;逻辑说明SaveRTF和LoadRTF是最简单的出入口。参数说明第二个布尔参数在不同版本里含义可能不同常见是控制是否写入兼容性标记建议先用 Demo 里的默认值确认 Word 打开正常后再调。导入时如果 RTF 里用了系统没装的字体TRichView 会回退到默认字体不会报错所以「导入后字体变了」通常不是控件 bug是字体缺失。4.2 DOCX 导出的现实预期哪些能带过去哪些一定丢DOCX 导出比 RTF 新但同样不是无损。能稳定带过去的是文字、基本字符样式、段落对齐、简单表格、图片。容易丢的是TRichView 特有的 Item 类型、复杂嵌套表格的边框细节、自定义绘制。我的经验是把 DOCX 导出当成「给外部看的快照」不要当成「可再编辑的工程文件」。如果业务要求 Word 里改完再导回来还能完全还原那要提前做格式能力评估别等上线才发现。4.3 打印与分页为什么屏幕上好好的打印就断行错位打印错位是富文本控件的经典坑。屏幕上按像素排版打印按物理尺寸排版两者的字体度量、边距、DPI 都不一样。TRichView 提供了打印相关的分页控制但需要你显式设置页面尺寸和边距不能指望它自动和屏幕一致。// 打印前设置页面参数示意具体属性名以控件版本为准 procedure TForm1.SetupPrint; begin RVMain1.PrintPageWidth : Round(21.0 * 96 / 2.54); // A4 宽约 21cm 换算成像素 RVMain1.PrintPageHeight : Round(29.7 * 96 / 2.54); // A4 高 RVMain1.PrintMargins.Left : 100; RVMain1.PrintMargins.Right : 100; RVMain1.PrintMargins.Top : 100; RVMain1.PrintMargins.Bottom : 100; end;逻辑说明把物理尺寸换算成打印像素再设边距。参数说明96是屏幕 DPI 假设值实际打印 DPI 可能不同所以更稳的做法是用控件提供的物理单位 API而不是自己硬算。如果打印出来每页行数不对先检查PrintPageHeight和边距是否把可用高度算错。我一般会先打一份只有页码的测试文档确认分页点再放正式内容。5. 避坑与排查TRichView 在 Delphi 13 下最容易翻车的五个点5.1 安装后 Tool Palette 有控件但拖到窗体就报「Class not found」现象包 Install 成功控件图标也在但一拖到 Form 上就弹异常提示类未注册或找不到。原因设计期包和运行期包的平台不匹配或者 IDE 里残留了旧版本的同名包。解决Component → Install Packages里把所有 TRichView 相关包先 Remove重启 IDE再按「先运行期后设计期」的顺序重装并确认两个包的目标平台一致。5.2 编译报「Unit RVMain was compiled with a different version of RVStyle」现象明明只装了一个版本却报单元版本不一致。原因Library Path 里同时存在两份源码或者某处残留了旧 DCU。解决在 IDE 的Tools → Options → Library里检查路径顺序把旧路径删掉再全盘搜索RVStyle.dcu把非当前版本的 DCU 清掉然后 Rebuild 整个包。5.3 文档里图片显示为空白但文件确实存在现象AddPicture调用没报错文档里就是没图。原因路径是相对路径运行时工作目录和你想的不一样或者图片格式不被当前版本支持。解决改用绝对路径先验证确认格式常见是 BMP、JPEG、PNG具体支持列表看 Demo如果是网络路径先拷到本地测试。5.4 大文档编辑卡顿输入延迟明显现象文档超过几十页后每次输入都卡。原因每次修改触发了全文档重排或者样式对象被频繁创建销毁。解决批量修改时用BeginUpdate/EndUpdate包起来样式对象在初始化时建好复用不要在循环里反复Add如果只是只读展示考虑用渲染模式而不是编辑模式。5.5 导出 RTF 后在 Word 里打开表格边框全没了现象TRichView 里表格有边框导出 RTF 后 Word 里看不到。原因RTF 的表格边框表达方式和 TRichView 内部模型不完全对应部分边框属性没被写出。解决导出前把表格边框设成 RTF 能表达的标准样式或者改用 DOCX 导出如果必须 RTF接受简化并在文档规范里写明。6. 把 TRichView 用进真实项目的两个进阶习惯第一个习惯是「样式集中管理」。不要在业务代码里到处TextStyles.Add而是建一个样式注册表启动时一次性建好业务代码只引用索引或常量。这样后期改视觉规范只改一个地方。我吃过亏一个病历项目里样式散落在十几个单元改一次字体颜色花了一整天。第二个习惯是「文档构建与渲染分离」。把「生成文档内容」和「把内容显示到控件」拆成两步中间用一个中间结构比如自定义的段落列表过渡。这样同一份内容可以渲染到 TRichView、导出 RTF、导出 DOCX、打印而不用为每种输出写一遍逻辑。验证方法是写一个单元测试构造中间结构分别跑四种输出检查关键字段是否一致。输出目标建议路径主要丢失项内部存储TRichView 原生格式无Word 互通DOCX 导出自定义 Item、复杂嵌套边框老系统互通RTF 导出高级表格、部分样式打印打印 API 分页设置屏幕与纸张度量差异最后一个技巧调试文档问题时先把文档SaveRTF到磁盘用文本编辑器打开看结构。RTF 是纯文本样式和内容都在里面比在 IDE 里猜快得多。这个习惯帮我定位过好几次「样式没生效」的问题——一看 RTF 就知道样式索引根本没写进去。希望帮到你。本文还有配套的精品资源点击获取