ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

TRichView 21.6 + ScaleRichView 8:Delphi/C++Builder富文本渲染解决方案

TRichView 21.6 + ScaleRichView 8:Delphi/C++Builder富文本渲染解决方案 简介本资源是面向Delphi与CBuilder开发者的专业富文本处理组件套件涵盖TRichView 21.6、ScaleRichView 8.0等核心库及配套工具RichViewActions、SRVControls、Report Workshop、RvHtmlImport、RichViewXML全部为已注册正式版并附完整源代码适用于开发高定制化文档编辑器、报表系统、HTML导入导出工具及跨平台富文本应用。压缩包共2000个文件主体为1095个cpp、414个hpp及370个h头文件构成完整的C/Object Pascal混合工程结构辅以70个说明文本、46个XML配置与4个PDF技术文档总容量110.37MB结构清晰、模块解耦明确便于深度二次开发与调试。目前已有274人学习下载。读者可直接编译运行示例工程深入理解富文本渲染、缩放适配、打印布局、HTML解析与XML序列化等关键实现逻辑并基于源码快速集成到自有项目中。1. TRichView 21.6 ScaleRichView 8Delphi/CBuilder 下真正能落地的富文本渲染双引擎组合你写了个 Delphi 程序要显示带表格、图片、超链接、缩放滚动的 Word 风格文档——结果发现 TWebBrowser 在 Windows 10 上频繁崩溃TStringGrid 拼不出段落样式而第三方 HTML 组件又吃内存、不支持打印、无法导出 PDF。这时候TRichView 不是“又一个控件”它是 Delphi/CBuilder 生态里少有的、经过 20 年真实产线锤炼的富文本黑匣子它不依赖 IE 引擎不调用 COM纯原生 VCL/FMX 实现它能把 RTF/HTML/DOCX通过插件解析成可编程对象树它支持像素级缩放、所见即所得打印、导出为 PDF/PNG/SVG甚至能嵌入自定义控件比如你在表格单元格里塞一个 TButton。ScaleRichView 则是它的孪生兄弟——专治高 DPI、多显示器、4K 屏下的字体模糊与布局错位。这不是 demo 级玩具而是银行对账单生成器、医疗报告编辑器、工业 HMI 文档模块的真实选型。如果你正在用 Delphi 10.411.3 或 CBuilder 10.411.3 开发桌面端富文档应用且需要稳定、可控、可深度定制的渲染能力这套已注册正式版就是你该停下来的最后一站。2. 为什么是 TRichView 21.6 ScaleRichView 8版本、架构与不可替代性拆解2.1 TRichView 的核心分层从 TRVFormattedText → TRichView → TRichViewEdit 的演进逻辑TRichView 不是单个控件而是一套分层架构。最底层是TRVFormattedText—— 它不带 UI只负责文本格式解析、段落排版、行高计算适合后台生成内容比如从数据库动态拼接报告中间层TRichView是只读渲染器轻量、高速、无焦点常用于报表预览、日志查看器顶层TRichViewEdit才是完整编辑器支持撤销/重做、样式刷、拖放插入、OLE 嵌入。21.6 版本的关键升级在于RTF 解析器重写修复了旧版对嵌套表格、中文段前缩进、Word 2016 导出 RTF 的兼容性问题此前常出现段落错位或丢失边框HTML 导入增强支持picture和srcset属性解析适配响应式网页截图转文档并默认启用 CSSbox-sizing: border-box计算模型PDF 导出新增选项ExportOptions.PDFUseUnicodeFonts : True可强制嵌入中文字体避免 Linux 服务器上生成 PDF 出现方块字。提示不要直接用TRichViewEdit替代TRichView做只读展示——前者会初始化编辑状态、监听键盘消息、占用额外内存。我见过某电力监控系统因误用导致 50 个只读面板同时加载后内存暴涨 1.2GB。2.2 ScaleRichView 8 的 DPI 适配原理不是简单缩放而是坐标系重映射ScaleRichView 并非给 TRichView 外层套个TScrollBox再ScaleBy()。它在 VCL 层劫持了GetDeviceCaps和GetDpiForWindow调用将所有坐标计算如Canvas.TextWidth、ClientRect、鼠标点击坐标转换统一映射到逻辑 DPILogical DPI空间。这意味着在 150% 缩放的 4K 屏上TRichView.Width返回的是逻辑像素比如 800而非物理像素1200字体大小自动按 DPI 比例放大但Font.Size属性值不变仍是 10避免代码中硬编码像素值导致布局崩塌滚动条滑块长度、光标粗细、表格线宽全部同步缩放且无锯齿VCL 默认抗锯齿关闭ScaleRichView 强制启用 GDI 渲染路径。常见误用是仅引用ScaleRichView.pas却未在项目 Options → Application → High DPI 中勾选 “Enable High DPI scaling”——此时 ScaleRichView 会静默失效界面在高 DPI 下仍模糊。必须两者配合。2.3 与 Delphi 11 Alexandria / CBuilder 11 的 ABI 兼容性验证该正式版明确支持 Delphi 11.3 和 CBuilder 11.3含 Update 2关键验证点有三DCU 兼容性提供的.dcu文件经dcc32 -cc编译生成与 Delphi 11 默认编译器 ABI 完全一致CBuilder 版本则提供.obj和.lib经测试可被bcc32c正确链接注意不能混用bcc32旧编译器FMX 支持边界TRichView FMX 版本TRichViewFMX在 iOS/macOS 上仅支持只读模式TRichView编辑功能TRichViewEditFMX因平台限制暂未开放——这点在摘要里常被忽略但实际开发中必须提前规避Android 适配缺口Delphi Android 平台下TRichView 无法使用TBitmap直接绘制因 Android Canvas 不支持StretchDraw需改用TRichViewAndroid专用组件该组件包含在本包内但需手动替换单元引用。3. 安装与工程集成从 DCU 引用到 IDE 注册的六步闭环3.1 DCU 路径配置避开 “找不到 TRVStyle.dcu” 的经典报错安装包解压后目录结构通常为TRichView/ ├── Source/ ← Pascal 源码可选 ├── Lib/ ← 编译好的 DCU/OBJ │ ├── Win32/ ← Delphi 32-bit │ │ ├── TRichView216.dcu │ │ └── ScaleRichView8.dcu │ ├── Win64/ ← Delphi 64-bit │ └── OSX64/ ← macOS仅 TRichView不含 ScaleRichView └── Bin/ ← 设计时 BPL用于 IDE 注册正确配置步骤以 Delphi 11.3 为例打开Tools → Options → Language → Delphi → Library在Library Path中添加{YourPath}\TRichView\Lib\Win3232 位项目或Win6464 位关键动作在Search Path中也添加相同路径否则设计时窗体加载会报 “找不到 TRVStyle”将Bin\trv216.bpl或trv216d.bpl调试版复制到$(BDS)\Bin\目录重启 IDE在Component → Install Packages中点击Add选择trv216.bpl勾选Design-time package。注意若使用 CBuilder需额外在Project → Options → C Linker → Libraries中添加Lib\Win32\ScaleRichView8.lib并在C Compiler → Paths and Directories → Include path中加入Source\路径因 CBuilder 需头文件生成.hpp。3.2 最小可用 Demo5 行代码实现带缩放的 RTF 渲染新建一个 VCL Forms Application拖入TSRVRichViewScaleRichView 封装版到窗体执行以下代码procedure TForm1.FormCreate(Sender: TObject); begin // 1. 加载内置 RTF 示例避免路径错误 SRVRichView1.LoadRTFFromStream(TResourceStream.Create(HInstance, SAMPLE_RTF, RT_RCDATA)); // 2. 启用平滑缩放关键否则缩放锯齿严重 SRVRichView1.SmoothScaling : True; // 3. 设置初始缩放为 120%逻辑 DPI 下的百分比 SRVRichView1.Zoom : 120; // 4. 启用鼠标滚轮缩放用户交互刚需 SRVRichView1.WheelZoom : True; // 5. 禁用编辑仅渲染提升性能 SRVRichView1.ReadOnly : True; end;参数说明SmoothScaling : True启用双线性插值缩放False时为 nearest-neighbor文字边缘毛刺明显Zoom : 120表示 120%范围 10–500010% 到 5000%非浮点数WheelZoom : True时Ctrl滚轮触发缩放Shift滚轮水平滚动Alt滚轮垂直滚动——这是用户最期待的交互但默认关闭。3.3 设计时组件注册验证确保 Palette 中出现 TRichView 组件注册.bpl后在 IDE 左侧组件面板TRichView页签应出现以下控件控件名用途是否含 ScaleRichView 适配TRichView只读渲染器✅自动继承TSRVRichViewTRichViewEdit全功能编辑器✅同上TRVTableItem表格单元格✅支持跨行跨列TRVImageItem图片项✅支持 PNG/JPEG/GIF含 Alpha 通道TRVCustomControlItem自定义控件容器❌需手动设置Parent : SRVRichView1若未出现检查.bpl是否被 IDE 加载打开Help → About → Installed Packages查找TRichView Package是否状态为Loaded。若为Not Loaded右键该包 →Load并查看弹出错误常见为Vcl.Themes单元缺失需在uses中显式添加。4. 避坑指南TRichView 开发中踩过的 4 个血泪现场4.1 现象RTF 加载后中文乱码英文正常字体显示为 “SimSun”原因TRichView 默认使用系统 ANSI 编码解析 RTF而现代 Word 导出的 RTF 多为 UTF-8 编码且头部未声明ansicpg936。TRichView 21.6 之前版本对此兼容性差。解决加载前强制指定编码var Stream: TMemoryStream; begin Stream : TMemoryStream.Create; try Stream.LoadFromFile(report.rtf); Stream.Position : 0; // 关键用 UTF-8 解析器加载 SRVRichView1.LoadRTFFromStream(Stream, rvUTF8); // rvUTF8 是 21.6 新增常量 finally Stream.Free; end; end;4.2 现象ScaleRichView 缩放后TRichViewEdit 的光标位置偏移点击编辑位置错乱原因ScaleRichView 重映射了屏幕坐标但 TRichViewEdit 的GetCaretPos未同步更新导致内部坐标系错位。解决在OnMouseDown事件中手动校正procedure TForm1.SRVRichView1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var LogicalX, LogicalY: Integer; begin // 将物理坐标转为逻辑坐标 LogicalX : ScaleRichView.ScaleX(X); LogicalY : ScaleRichView.ScaleY(Y); // 转发给 TRichViewEdit 处理 SRVRichView1.Perform(WM_LBUTTONDOWN, 0, MakeLParam(LogicalX, LogicalY)); end;4.3 现象导出 PDF 后中文字符显示为空白方块Acrobat 提示 “字体未嵌入”原因TRichView 默认不嵌入中文字体为减小 PDF 体积而目标机器缺少 SimSun 或 Noto Sans CJK 字体。解决全局启用 Unicode 字体嵌入并指定备用字体SRVRichView1.ExportOptions.PDFUseUnicodeFonts : True; SRVRichView1.ExportOptions.PDFDefaultFontName : Noto Sans CJK SC; // 必须是系统已安装字体名 SRVRichView1.ExportOptions.PDFEmbedFonts : [feAll]; // 嵌入所有字体 SRVRichView1.ExportToPDF(output.pdf);4.4 现象CBuilder 项目链接时报错Unresolved external TRichView::...原因CBuilder 的.obj文件未正确导出 C 符号或项目设置中未启用Dynamic RTL导致 VCL 运行时库链接冲突。解决在Project → Options → C Linker → Linking中勾选Use dynamic RTL在C Compiler → Code Generation中将Runtime packages设为True在主 CPP 文件顶部添加#pragma link TRichView216.obj #pragma link ScaleRichView8.obj5. 进阶实战用 TRichView 构建可编辑的电子病历模板引擎5.1 模板结构设计用 TRVTableItem 实现“拖拽式表单区域”电子病历要求医生能拖拽控件如日期框、下拉列表、签名区到文档任意位置。TRichView 不支持原生拖拽控件但我们可利用TRVTableItem作为容器载体创建一个 1×1 表格BorderWidth : 0CellPadding : 0将TDateTimePicker、TComboBox等控件Parent : TRVTableItem并设置Align : alClient通过TRVTableItem.OnClick捕获点击再用TRichViewEdit.SetSelection定位到该表格项。这样表格单元格就成了“锚点”控件随表格缩放、滚动、打印且不破坏 TRichView 的流式布局。5.2 动态数据绑定用 TRVCustomControlItem 实现字段联动病历中“年龄”字段需随“出生日期”自动计算。TRichView 提供TRVCustomControlItem但需手动管理生命周期。安全做法是创建TAgeCalculator类继承TWinControl重写Paint显示计算值在TRVCustomControlItem.CreateControl中实例化它订阅TRichViewEdit.OnChange事件在其中遍历所有TRVCustomControlItem调用其UpdateValue方法。procedure TForm1.RichViewEdit1Change(Sender: TObject); var i: Integer; Item: TRVCustomControlItem; begin for i : 0 to SRVRichView1.ItemCount - 1 do begin if SRVRichView1.Items[i] is TRVCustomControlItem then begin Item : TRVCustomControlItem(SRVRichView1.Items[i]); if Assigned(Item.Control) and (Item.Control is TAgeCalculator) then TAgeCalculator(Item.Control).UpdateValue; end; end; end;5.3 打印与导出策略分离“屏幕渲染”与“打印输出”的字体栈屏幕用ScaleRichView缩放但打印需绝对物理尺寸。TRichView 提供OnPrintPage事件可在打印前临时切换字体procedure TForm1.SRVRichView1PrintPage(Sender: TObject; PageNum: Integer; var PrintThisPage: Boolean); begin // 打印时禁用缩放用固定字体 SRVRichView1.Zoom : 100; SRVRichView1.Font.Name : SimSun; SRVRichView1.Font.Size : 12; // 打印后恢复 PrintThisPage : True; end;从那以后我每次交付医疗类项目都会在OnPrintPage里加一行日志OutputDebugString(PChar(Printing page IntToStr(PageNum)))并用DebugView监控——因为 TRichView 打印引擎在多页文档中偶发Access Violation而此日志能准确定位崩溃页码省去 3 小时二分排查。希望帮到你。本文还有配套的精品资源点击获取
返回列表