
简介在桌面应用程序开发中富文本编辑、所见即所得排版与报表打印往往需要多套技术组件协同工作。TRichView作为一款底层自绘的VCL富文本控件不依赖系统RichEdit具备稳定的排版表现与精细的样式控制能力配合ScaleRichView可实现页面分栏、页眉页脚等Word级排版再加上Report Workshop将模板与数据绑定即可构建从文档编辑到报表导出的完整链路。针对Delphi环境下的控件安装与工程集成源码路径配置、设计时包安装、平台编译兼容都是常见难题尤其在32位与64位目标同时编译时更需要分别处理运行时包。本文围绕TRichView、ScaleRichView、Report Workshop三件套的版本匹配、Library Path设置、典型代码集成和PDF导出中文乱码等高频问题梳理了一套可复用的实践方案帮助开发者高效完成文档处理模块的落地。 玩Delphi的老伙计应该对TRichView这套控件不陌生。这两天整理工程环境正好装了一版比较新的三件套——TRichView v24.1.2、ScaleRichView v12.5.2、Report Workshop v7.0.2拿到的是常见的.7z压缩包格式。很多人对这三件套的理解还停留在“能编辑富文本”这个层面实际上它们组合起来基本能覆盖一套桌面程序里最棘手的文档编辑、页面排版、打印预览、报表生成这条完整链路。这篇文章把安装、配置、集成和几个容易踩的坑一次性说清楚新手可以照着抄老手也能看看有没有漏掉的细节。1. 这套控件组合到底解决了什么问题先说结论TRichView是核心编辑器ScaleRichView是负责“所见即所得”的排版外壳Report Workshop是拿同一套文档引擎做报表。三个控件用同一套数据模型学过其中一个其他两个上手成本就很低。1.1 TRichView富文本编辑的底层基石TRichView是一个纯VCL的富文本显示与编辑控件底层不依赖Windows系统自带的RichEdit控件完全自绘。这一点很关键自绘意味着排版行为在各Windows版本上完全一致不会出现Win10上显示正常、Win7上字体间距全乱的情况。它支持段落样式、字符样式、超链接、书签、表格、嵌入图片、项目符号、撤销重做等核心数据结构是RVF格式。很多OA系统里的正文编辑器、合同编辑器、标书编制工具底层用的就是TRichView或它的升级版。因为它在处理长文档时性能比自带的RichEdit稳定很多而且可以精确控制每个字符和段落的样式这是原生控件做不到的。TRichView还支持把文档导出为RTF、HTML、PDF、图片导入RTF、HTML、纯文本等格式做数据交换很方便。1.2 ScaleRichView把“所见即所得”真正落地如果只用TRichView你会发现它做的是“流式排版”也就是文本流组织模式没有真实的页面概念。但业务上经常需要像Word那样有A4页面、页边距、页眉页脚、分栏、多页连续滚动打印出来的效果就是屏幕看到的效果。ScaleRichView就是干这个的。它在TRichView之上实现了完整的页面视图支持文档分页显示、页面缩放、页眉页脚、分节符、脚注尾注、连续预览打印时用自家引擎对页面内容做精确输出。像那种需要“编辑完之后直接发到打印”的程序或者想要一个轻量Word的软件用ScaleRichView能省掉大量自己写排版引擎的时间。1.3 Report Workshop报表模板与打印的配套方案Report Workshop是同一家公司出的报表模块和很多传统报表控件不一样它的核心思路是“报表模板就是一份文档”。你可以在设计器里像编辑Word文档一样画模板然后嵌入数据库字段、变量、循环区域、子报表、图表等动态内容。模板里可以精确控制字体、行距、边框、间距生成出来的报表效果比Grid套打那种方式灵活太多。这套方案最大的价值在于不需要同时维护“文档编辑器”和“报表设计器”两套体系。你已经在用TRichView做内容编辑了那报表模板自然也用同一套解析和打印引擎学习成本低、视觉一致、维护方便。对做ERP、MIS、订制管理系统的团队来说这个组合替换掉QuickReport、Rave这类老报表控件非常顺。2. 安装部署与版本验证安装这个三件套本身不复杂但Delphi控件安装的坑通常不在“安装”而在“路径”和“缓存”。我按照实际操作的顺序把要点列一遍版本环境是RAD Studio 13.1Delphi。2.1 环境准备与版本匹配动手之前先确认三件事。第一确认你的Delphi版本能装这套控件。TRichView系列官方支持范围很广从老Delphi 7一直到新版RAD Studio都在维护但不同版本对应不同的源代码分支和包文件下载之前务必看清楚。这个压缩包的版本号是TRichView v24.1.2、ScaleRichView v12.5.2、Report Workshop v7.0.2属于比较新的更新RAD Studio 13.1下直接编译没有问题。第二确认你打算编译的目标平台。如果是纯32位Windows程序直接装一套32位的包即可。如果工程要同时出32位和64位版本那两套平台都需要编译安装一遍。这个后面第4部分专门讲。第三想清楚用运行时包Runtime Package还是静态链接。TRichView是可以用运行时包的但如果你的程序是给客户分发单个exe通常建议关闭运行时包静态链接进exe里。安装时两者不冲突编译包的时候会同时生成设计时包和运行时包安装时把设计时包装上就行工程编译时根据需要选择是否引用运行时包。2.2 解压目录结构与配置要点拿到的是.7z压缩包先用7-Zip解压到一个不容易被误删的目录比如D:\Libs\TRichView。解压后目录里通常包括Source源码、Packages各版本安装包、Demos示例、Lib历史编译产物、Docs文档等。注意源码目录不要放在带中文或空格的路径里也别放到桌面。Delphi的Library Path一旦配错或项目文件被移动编译时经常出现“找不到单元”的问题。一个非常重要的配置步骤是把Source目录加入Delphi的Library Path。打开Tools Options Delphi Options Library在Library Path里把源码目录加进去。注意要加的是包含.dcu生成目标的源文件目录不是包文件目录。这里有个顺序问题如果之前装过其他版本的TRichView新的源码路径最好放在靠前的位置避免编译器先搜到旧版头文件。还有一个细节如果机器上同时装了不同版本的Delphi比如老工程用Delphi 7新工程用RAD Studio 13.1不要直接把同一个解压目录给两个版本共用。不同版本的包文件编译后会混在一起路径一乱就是一系列版本冲突。建议分别解压到不同目录各管各的。2.3 编译安装包的完整步骤进入Packages目录里面一般按Delphi版本分好子目录找对应RAD Studio 13.1的子目录打开打包好的工程组文件.groupproj或者按顺序打开运行时包、设计时包的.dproj文件。操作顺序是“先编译运行时包后安装设计时包”。右键单击运行时包通常名字里不带Design执行Build确认编译输出成功生成.bpl和.dcp文件。然后右键单击设计时包通常名字里带Design比如RichViewDesign.dproj先Build再Install。Install过程中Delphi会提示注册组件到IDE工具栏完成后你会看到工具面板里多出RichView、ScaleRichView、Report Workshop相关组件页。有个比较常见的现象安装时弹出“Cant load package”错误十次里有八次是*.bpl找不到八成是编译输出的路径不在系统PATH里或者Library Path没包含.bpl所在目录。把Packages目录下输出.bpl的位置加到环境变量PATH里重启IDE再试基本能解决。提示安装过程中建议先关闭杀毒软件和“受控文件夹访问”之类的东西编译和Install时会大量生成文件偶尔会被拦截导致包安装不完整。这个问题排查起来很隐蔽我遇到过两次都是最后查出来文件根本没释放。2.4 验证安装成功的三个小办法安装完先别急着写代码用三个小方法快速验证一下。第一新建一个VCL工程在工具面板里找到RichView相关组件页试着把一个TRichViewEdit拖到窗体上。如果能拖放、能调整说明设计时包基本正常。第二在窗体上放一个TSRichViewEdit运行一下在编辑器里输入文字、插入图片。如果能正常操作且界面不崩说明运行时包和组件资源没缺失。第三打开压缩包自带的Demos目录找几个复杂示例工程比如带表格、带页眉页脚、带报表的逐个编译运行。示例工程能跑过就说明当前环境没问题。这三个验证做完环境才算真正可用。很多人装完发现编译demo报错其实不是控件问题是bpl没搜到或者路径没配对。3. 三件套的典型集成路径控件装好了接下来看怎么用。我不打算贴完整大段源码重点讲集成思路和关键配置代码片段只给核心部分。3.1 用TRichView搭建一个轻量富文本编辑器建一个VCL工程放一个TRichViewEdit设置Align为alClient再把工具条按钮绑到对应方法上一个简易富文本编辑器就出来了。最基本的加载和保存代码大概是这样的uses RVStyle, RVScroll, RichView, RVFuncs; procedure TForm1.LoadDoc(AFileName: string); begin RichViewEdit1.Clear; RichViewEdit1.LoadRTF(AFileName); end; procedure TForm1.SaveDoc(AFileName: string); begin RichViewEdit1.SaveRTF(AFileName); end; procedure TForm1.SetBold; begin RichViewEdit1.ApplyStyleConversion( RichViewEdit1.GetCurrentStyle, RVStyle1, [], []); RichViewEdit1.SetSelectionBold(not RichViewEdit1.GetSelectionBold); end;注意这里涉及一个非常重要的对象TRVStyle。它负责管理所有字符样式和段落样式的定义相当于一份样式表。你可以预先把正文、标题、列表等样式在TRVStyle里配好编辑时通过ApplyStyleConversion方法切换避免代码里硬编码字体名和字号。这套思路和CSS很像习惯了之后效率很高。插入图片用RichViewEdit1.InsertPictureFromFile(C:\temp\logo.png, 0);保存文档时如果要保留全部分类信息用RVF格式。RVF是TRichView的私有格式保存和恢复速度比RTF快信息保留更完整。如果是要给外部系统用再导出RTF或HTML。3.2 ScaleRichView里的页面排版配置当你把TRichViewEdit换成TSRichViewEdit就等于从“流式文档”切到了“页面文档”。ScaleRichView直接继承自TRichViewEdit所以之前的所有编辑方法和事件依然能用同时多了页面、分节、缩放、打印预览等能力。页面排版的几个高频配置项// 设置页面尺寸和页边距 SRichViewEdit1.RVData.GetViewProperty.PageWidth : 11906; // A4宽单位是twips SRichViewEdit1.RVData.GetViewProperty.PageHeight : 16838; // A4高 SRichViewEdit1.RVData.GetViewProperty.LeftMargin : 1440; // 左右边距各2.54cm SRichViewEdit1.RVData.GetViewProperty.RightMargin : 1440; SRichViewEdit1.RVData.GetViewProperty.TopMargin : 1440; SRichViewEdit1.RVData.GetViewProperty.BottomMargin : 1440;twips这个单位需要说明一下1英寸等于1440 twipsA4纸宽210mm、高297mm换算过来就是11906和16838。很多人在写打印和布局代码时习惯用像素结果不同DPI下显示错乱。TRichView系列内部统一用twips这点务必记住。ScaleRichView的视图模式也值得说。它支持普通模式、页面模式、连续模式、全屏模式等几种页面模式下能看到纸张边界旁边有灰色阴影区域连续模式下多页连排更像网页阅读。在程序里可以动态切换SRichViewEdit1.TopMarginVisible : True; SRichViewEdit1.Options : SRichViewEdit1.Options [rvoPageBreakLines];页眉页脚可以设置成“每节独立”或“全篇一致”。设置页眉内容时直接用普通的AddText方法但必须先选择对应的页眉页脚编辑区域。具体来说// 编辑页眉 SRichViewEdit1.PageProperty.Header.Text : 合同编号xxx; SRichViewEdit1.PageProperty.Header.Visible : True;这在做合同、公文类软件时非常有用。打印的时候ScaleRichView直接用自带的打印引擎输出调用方式很简单SRichViewEdit1.Print(文档名)。如果要打印预览有个TSRichViewPrintPreview组件配合使用界面效果和Word差不多。3.3 基于Report Workshop做一个带数据绑定的报表模板Report Workshop的用法稍微绕一点因为它把“模板设计”和“数据填充”分得很开。你先要做一批模板再用代码或运行时操作填充数据。如果你用设计器建模板过程类似Word里插入域。模板中的动态内容用特殊标记表示比如[[CompanyName]]、[[Items]]这种。运行时代码会把这些标记替换成真实数据并把循环区域展开成多行。填数据的一个典型做法是把TDataSet绑定到报表组件上。以表格循环为例模板中定义一个循环节代码里把DataSource指过去报表生成时会自动遍历记录集。RepGen1.TemplateFile : report_template.rvf; RepGen1.DataSet : ADODataSet1; // 绑定数据源 RepGen1.Generate; RepGen1.ExportToPDF(report_output.pdf);ReportWorkshop导出PDF不需要借助第三方PDF组件库它内置了PDF输出模块中文字体需要指定支持中文的TTF否则容易导出乱码。这个算是用得比较多的问题之一后面排查部分再细说。4. 常见问题与排查技巧实录用这套控件几年我整理了一批出现频率非常高的问题大部分在官方文档里讲得都比较浅这里直接把排查思路说全。4.1 “每次打开IDE都丢控件”的版本冲突问题这个话题在很多搜索热词里反复出现症状是今天装好了三件套关闭IDE时控件还正常第二天打开工程一看窗体上所有控件都显示为未知类或者每次进入IDE都要重新放置控件保存后再打开还是丢。这种问题十有八九出在“重复安装”和“包缓存混乱”。机器上装过多个版本的TRichView或者安装新版本时没有卸载旧版本IDE加载组件图标时加载的是旧版报告。排查步骤关闭所有Delphi进程打开Component Install Packages查看已安装的RichView系列包把旧的、你不用的包卸载掉。在系统里搜一下有没有多个RichView相关.bpl文件尤其是Delphi的默认搜索目录、Windows的System32里如果有残留清理掉。删除工程目录下的*.dproj.local、*.dsk文件这些文件会缓存本机组件状态缓存损坏后表现就是控件丢失。最后重启IDE重新打开.dpr看窗体上控件是否正常。心得不要为了“保留旧版兼容”把同一控件的多个版本同时装进IDE。TRichView组件内部有一套版本校验逻辑一旦检测到混装轻则控件消失重则IDE启动报错。真正需要多版本共存时用不同Delphi版本隔离别在同一个IDE里混。4.2 编译报错“Unit RichView was compiled with a different version”这个错字面意思是“某个单元是用不同版本编译的”常见于以下场景你把源码目录加进Library Path后编译器找到了旧版源码或旧版.dcu但IDE里安装的设计时包是新版。两边版本号不一致编译时单元校验对不上。处理方式有两步。第一步彻底清理旧编译缓存。Delphi的Library Path里通常有多个目录旧的.dcu可能散落在各处的库路径里。打开Tools Options Library Library Path检查所有路径是否指向当前解压目录尤其是有没有老版本的Source路径残留在列表里。第二步删除所有*.dcu后重新编译。这里提供一个快速思路直接进源码目录把当前编译输出目录清空然后重新打开组工程先编译运行时包再编译设计时包最后重新编译你自己的工程。编译过程中忽略IDE提示的“加载缓存.dcu”信息确保用的都是新编译产物。4.3 32位和64位目标平台编译失败如果你的程序要同时出32位和64位版本只安装一套控件会直接导致其中一个平台编译失败。原因是设计时包运行在IDE所在的32位进程中但64位目标平台需要单独的运行时包。操作建议在Packages目录中把32位的包和64位的包都编译一遍。具体流程是先切换到Win32平台编译并安装设计时包然后切换到Win64平台再次编译运行时包不需要安装设计时包。这样IDE里会存在两套运行时库编译32位和64位工程时分别走对应平台。另外64位工程里如果用了第三方PDF导出或打印相关动态库也要确认这些库是否带64位版本。TRichView的PDF导出内置了实现一般没问题但如果用C Builder或老版本包就要额外验证。4.4 导出PDF中文乱码这个太常见了。ReportWorkshop和ScaleRichView导出PDF时需要读取系统字体文件来嵌入文档。如果你在模板里用了“宋体”而环境下找不到这个字体或者字体名字写成了中文别名导出的PDF就是方框或乱码。解决办法在导出前显式设置字体映射。把模板中的字体名映射成一个实际存在的TTF文件路径或者直接指定字体目录// 设置PDF导出时字体目录 RepGen1.PDFOptions.FontFileName : C:\Windows\Fonts\msyh.ttc; RepGen1.PDFOptions.FontCharset : 134; // GB2312有一点要提醒TTF和TTC都能用但有些字体文件比如部分思源黑体子集嵌入时跟PDF阅读器兼容性一般实测下来用微软雅黑替换宋体是最稳的组合。4.5 打印预览内容与屏幕显示不一致ScaleRichView做打印预览时偶尔会出现行位置错位、表格线变粗等情况。多数是缩放算法和屏幕DPI惹的祸。预览时尽量把缩放设置为“100%”如果预览窗口按比例缩放先调用ValidateUserMargins刷新边距再重新排版。高DPI屏幕比如150%缩放的笔记本上如果程序没有调用Delphi的PerMonitorV2设置预览比例会偏。建议在.dpr里加入Application.Printer.SetPrinter(...); // 手动同步打印机参数这个属于老生长谈但确实能消掉一半显示错位问题。5. 一点实操心得这几年的感受是TRichView系列最值钱的地方不在“能不能编辑富文本”而在它把“编辑”、“排版”、“打印”、“报表”统一到了一套模型里。项目里用这套组合代码量并不会少太多但维护成本是真的低——改一个字体样式文档、预览、报表、PDF全部同步不用再盯着排版结果逐项去对。还有一个小技巧写模板时尽量用RVF格式不要用RTF当模板载体。RTF的字体名记录方式在各操作系统上容易出偏差RVF是控件自己的格式字体、段落、图片引用关系都保存得很干净。客户那边每次换字体就把模板重新生成一份RVF比拿RTF反复试错省心得多。最后升级版本之前一定要看Release Notes。TRichView版本迭代时会改不少内部接口跨大版本升级比如从20.x升到24.x时老的Demo和第三方封装代码经常会报缺参数。这个控件的优势是有足够多的历史资料和示例真遇到版本兼容问题去官方论坛搜关键字基本都能找到答案。本文还有配套的精品资源点击获取