ARTICLE DETAIL

资讯详情

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

TMS VCL UI Pack v13.5.6.0实战:从Delphi 7到13的安装配置与避坑指南

TMS VCL UI Pack v13.5.6.0实战:从Delphi 7到13的安装配置与避坑指南 简介TMS VCL UI Pack是Delphi与C Builder平台广泛使用的商业界面组件套件新版v13.5.6.0完整支持Delphi 7到13与C Builder 7到13各版本包含Florence新环境。压缩包整合了约2000个文件以pas源代码、dfm窗体定义、dpr及dproj工程文件为主同时包含ico图标、jpg/png图片预览、pdf说明文档与res资源文件整体容量123.56MB便于开发者直接解压查阅或集成到现有项目。控件覆盖面板、按钮、表格、树视图、列表、编辑器等常用界面元素多数支持皮肤化定制可快速构建外观统一、交互现代的桌面应用减少手写底层绘图与事件逻辑的重复工作。包内附完整工程源码、演示项目与官方文档既能直接调用组件也便于阅读内部实现、二次扩展控件对需要自定义界面或深入排查集成问题的中高级开发者尤其合适也可作为项目立项时评估组件能力的参考。目前已有124人学习下载。1. 为什么还在买/用 TMS VCL UI Pack老 Delphi 项目的新引擎第一次看到“Delphi 13控件之TMS VCL UI Pack v13.5.6.0 for Delphi CB 7-13 Florence Full Source.rar”这个压缩包名字时我下意识把“Delphi 13”当成某代集成开发环境后来才明白重点是后面那串v13.5.6.0 是 TMS 控件包的版本而“Delphi CB 7-13”才是覆盖范围。从 Delphi 7 到最新 RAD StudioTMS VCL UI Pack 一直是用 VCL 做重客户端的团队绕不开的组件库。它把表格、编辑框、工具栏、皮肤、导航等几十种界面件揉进一个统一包而且这份 Full Source 给了你改源代码的权利。适合谁维护十年以上老系统的人、给进销存和 MIS 写桌面的工程师、以及不想在控件依赖上被卡脖子的技术负责人。读完这篇文章你能搞清编译安装流程、常见参数配置和几个容易踩翻车的环节。2. 版本线一览从 Delphi 7 到 13TMS VCL UI Pack 的兼容矩阵TMS VCL UI Pack 这套东西在 VCL 圈子里的地位有点像“装修套餐”单看每个控件都不惊艳但组合起来能让你在一个月内把一个 Win31 老界面拉回现代审美。v13.5.6.0 这个版本号看着硬核实际使用中真正要理解的是它跨编译器的方式。下面用一个兼容矩阵和两个核心概念把这套组件库选型和安装前需要知道的东西讲完。2.1 为什么是 v13.5.6.0版本号背后的兼容策略TMS 的版本号跟编译器的版本号并不完全同步。v13.5.6.0 表示主版本是 13后面 5.6 是维护序列最后的 0 是补丁号。你在解压包内会看到 Packages 目录下按编译器版本列了一堆子目录常见做法就是按 Delphi 7、2007、2009、XE、10.x、11、12 这样分目录每个目录里放的是同一套控件源码只是项目文件里的条件编译变量和搜索路径不同。这种兼容策略解决的是老项目的存量成本。很多工厂和政务系统至今跑在 Delphi 7 编译的 exe 上界面还是经典 Windows 98 风格但业务逻辑一改就要重新编译发布。把 TMS VCL UI Pack 引进来不是让你把所有窗体重写一遍而是可以在旧宿主里逐步替换部分界面。源码内部用{$IFDEF}处理 Unicode 和老版本 AnsiString 差异所以同一个控件源码能同时过 Delphi 7、2009 Unicode 分水岭、XE 之后的版本。一个常见的翻车点在旧 Delphi 7 工程里直接引用新版本某些功能单元比如 PDF 导出或 SVG 处理老编译器缺 VCL 基础类型编译到一半报 E2066 之类。我一般只加自己用到的单元而不把整个 Package 无脑 uses 进去。判断一个 TMS 版本能不能在旧编译器上用别盯版本号看它内部赖不赖 RTTI、StringHelper、Generics 这几个新特性。2.2 从 Delphi 7 到 CBuilder 13你需要知道的环境分水岭标题里 “Delphi CB” 说的是 Delphi 和 CBuilder 共享同一套 VCL 框架所以 TMS 的源码可以分别喂给 DCC32 和 BCC32/CLANG 两套编译器。这带来的直接问题是字符串处理Delphi 侧是 string/UnicodeStringCBuilder 侧是System::String老代码里混用AnsiString和char*的现象特别普遍。环境分水岭并不在 Delphi 7 能不能运行新版控件而在编译顺序。TMS Full Source 包对 Package 的先后顺序非常敏感必须先编译运行时核心包再编译设计时包。顺序反了就会出现“DCU 版本过旧或文件无效”这种让人抓狂的提示。特别是你机器里装多个 RAD Studio 版本时搜索路径一错编译器会拉到另一个版本的 TMS DCU这种现象我遇到不下五次。从 Lazarus 转过来的开发者会多一层学习成本Lazarus 强调 LCL 跨平台TMS VCL 是纯 Windows VCL 组件很多窗体继承自TCustomPanel、TCustomGrid这些老结构绘制逻辑大量直接调 Windows API。你需要适应 VCL 的释放机制Owner 自动释放和消息机制。这部分没有捷径在 IDE 里右键组件选“Find Declaration”进源码看继承关系比翻文档快得多。如果你是因为关注 Delphi 12 FireMonkey 源码而看到 TMS VCL UI Pack要特别小心VCL 源码和 FireMonkey 源码是两套类树TMS VCL UI Pack 只能用于 VCL 应用FMX 项目需要的是 TMS 的 FMX/FNC 产品线。这个边界踩错轻则编译不过重则窗体设计器里一片空白。2.3 Full Source 用在哪设计时包与运行时包的差别很多新手拿到 Full Source 后的第一反应是把所有 .pas 拖进 IDE这是安装过程中最容易翻车的一步。TMS 源码包在构建时分成两块设计时包用来把控件注册到 IDE 工具面板运行时包负责在应用里实际执行。Full Source 的价值在于你可以打开AdvGrid.pas这种源文件去读、去断点、去修改而不是对一个黑匣子 BPL 干瞪眼。设计时包和运行时包的编译产物都是 BPL但用途完全不同。IDE 需要设计时 BPL 才能显示出控件图标和属性编辑器应用程序在“Build with runtime packages”开着时需要运行时 BPL 跟随部署。发布之前要确认配置如果你想 exe 单文件分发就在项目选项里取消勾选“Build with runtime packages”如果你想多个 exe 共享 TMS 的 BPL 以减少内存占用就保留它。这个选择直接决定发布文件夹要带多少个*.bpl文件。我自己的习惯是把源码包当作基线不动原始目录。要改控件行为时把相关 .pas 复制到工程目录并在工程搜索路径里把工程目录放到源码包前面。这样升级 TMS 时不会因为改了原始文件而找不到迭代原因。下表是我按宿主编译器整理的常见处理思路具体文件和路径以你拿到的包为准宿主编译器常见做法注意点Delphi 7在 IDE 里打开对应 .dpk右键 InstallUnicode 字符串缺失注意 AnsiString 兼容Delphi 2009-XE7按 IDE 版本打开 Packages 下对应子目录建议保留静态链接避免 BPL 混用Delphi 10.3 / RAD Studio用 msbuild 编译 .dproj用 Release 配置不要用 DebugCBuilder 11用 CLANG 工具链编译注意String与const char*转换典型源码包内部结构大致如下便于你快速定位# 典型目录结构以实际包为准 Packages/ Delphi7/ Delphi2009/ DelphiXE/ Delphi10/ Delphi11/ Delphi12/ Source/ Base/ AdvGrid/ AdvEdit/ AdvToolBar/ Lib/看清这个结构后才进入编译安装后面过程就不会像盲人摸象。3. 拿到源码压缩包后按 Delphi/CBuilder 编译安装的完整流程这一章是全文最实操的部分。我尽量把命令和步骤写到你可以在自己的机器上直接执行的程度。你需要一台装了目标版本 RAD Studio 的 Windows 机器以及一个能打开 .rar 的解压工具。整个流程分四步解压、编译、安装、验证。3.1 解压与目录结构确认文件名里的中文和空格在 IDE 搜索路径里可能变成乱码第一步就是解压到纯英文路径。用 7-Zip 的命令行比较稳妥# 假设压缩包放在 D:\download解压到 D:\libs\tms_vcl_ui_pack 7z x D:\download\Delphi 13控件之TMS VCL UI Pack v13.5.6.0 for Delphi CB 7-13 Florence Full Source.rar -oD:\libs\tms_vcl_ui_pack参数-o后面跟目标目录注意不能在-o和路径之间加空格否则 7-Zip 会把-o当成未知参数。解压完成后先不要急着点 .dproj先确认 Packages 目录里有没有和你 IDE 版本对应的子目录。如果你用的是 RAD Studio 12就看有没有 Delphi12 或类似目录如果你在维护 Delphi 7就看 Delphi7 目录是否存在。这一步能省下后面大半排错时间。解压路径里不要带空格。虽然现代 msbuild 能处理带空格的路径但 TMS 某些 .inc 文件或注册工具对路径解析很敏感。我一个同事把包解压到C:\Program Files\TMS VCL UI Pack结果老版本 Delphi 7 编译时把Program当成程序名整个构建失败。3.2 用命令行编译生成设计时包 BPL进入对应版本的 Packages 目录先查看项目文件名称cd /d D:\libs\tms_vcl_ui_pack\Packages\Delphi12 dir *.dproj这里会出现一个或多个 .dproj。TMS 的包通常分核心、网格、编辑器几个部分但安装时只需要编译一个集合包即可。再执行 msbuild 编译。RAD Studio 自带 msbuild但环境变量需要在 RAD Studio 命令提示符里加载所以第一步是调用rsvars.batcall C:\Program Files (x86)\Embarcadero\Studio\12.0\bin\rsvars.bat cd /d D:\libs\tms_vcl_ui_pack\Packages\Delphi12 msbuild TMSVclUIPack_D12.dproj /t:Build /p:ConfigRelease /p:PlatformWin32参数说明/t:Build表示目标操作是构建/p:ConfigRelease决定用 Release 配置避免 Debug 配置生成额外调试依赖/p:PlatformWin32指定 32 位 VCL 目标。如果编译过程中报找不到某些源文件说明你的源码搜索路径没有指向 TMS 的 Source 目录。打开项目文件的调置项把Source根目录加进 Delphi Compiler 的 Search Path。如果你的目标是 CBuilder还要加上/p:CompilerClang32之类的参数视项目文件里的配置而定。经常有人问为什么不直接在 IDE 里点 Build可以但 IDE 会附带大量无关输出命令行定位错误和重复构建更方便。特别是你后续要打补丁重新编译时一条命令比手工点菜单可靠得多。3.3 在 IDE 里安装控件包并激活工具页编译完成后打开 RAD Studio进入Component Install Packages点击 Add定位到刚才生成的设计时 BPL。一般路径在D:\libs\tms_vcl_ui_pack\Lib或项目输出目录里。选中后IDE 会读取包里的注册信息工具面板上会新增一组 TMS 相关页面。如果 CBuilder 用户还需要在Tools Options Environment Options C Options Paths and Directories里添加 TMS 的 Include 路径否则写代码时 IDE 找不到头文件。Delphi 用户一般不需要手动加因为设计时包会把源码搜索路径写进注册表。安装成功后先新建一个空 VCL 窗体从工具面板拖一个TAdvStringGrid到窗体上。如果控件能正常创建且属性编辑器能弹出说明设计时包安装成功如果拖出来没反应或者抛出“Class not registered”基本可以断定你编译的是运行时包而不是设计时包。回项目文件里检查是否有DesignPackage标志TMS 的集合包默认会把注册代码包在里面。3.4 多版本 Delphi 并存的源码重新编译要点很多人机器上同时装着 Delphi 7 和 RAD Studio 12这时最容易出问题的是 BPL 输出目录重叠。不同版本的 IDE 会往C:\Windows\System32或公共库目录里注册 BPLTMS 编译时默认输出到 IDE 的默认库目录两个版本交叉写文件旧工程会加载到新版本 DCU。我的做法是强制指定 BPL 输出目录echo off set STUDIO_PATHD:\Program Files\Embarcadero\Studio\12.0 set OUTPUT_ROOTD:\libs\tms_vcl_ui_pack\Lib call %STUDIO_PATH%\bin\rsvars.bat cd /d D:\libs\tms_vcl_ui_pack\Packages\Delphi12 msbuild TMSVclUIPack_D12.dproj /t:Build /p:ConfigRelease /p:PlatformWin32 /p:DCC_BPLOutput%OUTPUT_ROOT%\win32\release关键参数是/p:DCC_BPLOutput它把 BPL 输出从 IDE 默认目录挪到控件包自己的 Lib 目录。这样每个 Delphi 版本都有独立的 BPL 目录互不干扰。切换版本编译时只要改STUDIO_PATH和 Packages 子目录。多版本并存还有一个隐藏问题IDE 会自动缓存已注册的包。如果你卸载了旧版本 TMS 后重新编译工具面板还留着旧控件入口点击会报“找不到 TMSxxx.bpl”。这时进入Component Install Packages把失效的包前面的勾去掉再重新添加新 BPL。别直接删注册表容易连带把 IDE 环境搞坏。4. 把 TMS 控件用起来真实场景下的组件选型与关键属性安装完成后很多人的习惯是“先拖几个控件看看长啥样”但我建议按真实场景来选组件。TMS VCL UI Pack 的强项不是单个控件的炫技而是把表格、输入、工具栏组合成一套完整桌面风格。这一章用四个最常见的落地场景说明组件选型和关键属性设置。4.1 TAdvStringGridExcel 化表格的网格布局与单元格合并做进销存最绕不开的是表格。TAdvStringGrid 可以把普通网格变成类似 Excel 的展示支持单元格合并、滚动固定列、排序、导出Excel。最小可运行示例// 初始化网格四列第一列固定 AdvStringGrid1.ColCount : 4; AdvStringGrid1.RowCount : 10; AdvStringGrid1.FixedCols : 1; // 合并第二列第二行到第三列第二行制造表头 AdvStringGrid1.MergeCells(1, 1, 2, 1); AdvStringGrid1.Cells[1, 1] : 销售额; // 单元格赋值 AdvStringGrid1.Cells[0, 1] : 门店A; AdvStringGrid1.Cells[1, 1] : 12000;参数说明MergeCells(ACol, ARow, AColCount, ARowCount)里的前两个参数是起始列和起始行后两个是横向和纵向要合并的数量。这里我从第 1 列第 1 行开始横向合并 2 列纵向合并 1 行所以Cells[1,1]覆盖到第 2 列。如果你拼错了参数顺序表格会出现奇怪的错位这个在 TMS 老版本里特别常见。导出的需求每天都会碰到。用SaveToXLS能把当前网格内容导出成老版本 Excel 兼容格式如果只是临时报表我通常直接在按钮事件里调它AdvStringGrid1.SaveToXLS(D:\report_ FormatDateTime(yyyymmdd, Now) .xls);注意SaveToXLS保存的是网格数据不包含合并单元格样式这是 TMS 一个老脾气。想要带样式导出需要配合TAdvGridExcelIO这类辅助组件或者自己遍历单元格写入 XLSX。排期紧的时候别在样式上死磕先保证数据不错。4.2 TAdvEdit/TAdvSpinEdit输入校验和数值控制的两种配法表单里最常见的两个需求是“只允许输数字”和“数值必须落在范围内”。TAdvEdit 可以做成号码框TAdvSpinEdit 则适合数量选择。看这段代码// 只允许输入数字最长 6 位用于手机号或编码 AdvEdit1.NumericOnly : True; AdvEdit1.MaxLength : 6; AdvEdit1.Alignment : taRightJustify; // 数量选择范围 0-1000默认 100 AdvSpinEdit1.MinValue : 0; AdvSpinEdit1.MaxValue : 1000; AdvSpinEdit1.Value : 100; AdvSpinEdit1.Increment : 10;说明NumericOnly只拦截键盘输入不拦截粘贴。如果你要阻断粘贴进来的非法字符还需要在OnChange里做过滤。Increment控制点上下箭头时的步长设成 10 适合批量修改场景。这一组属性在旧项目里几乎可以直接替换 TEdit 和 TUpDown 组合代价是字体和边框风格要重新调一遍。让我提醒一点TAdvEdit 的Alignment是对象属性中的对齐不是文本对齐别写成taLeftJustify之外的无效值。很多新人把taRightJustify当成 TEdit 的Alignment用老版本 VCL 的 TEdit 不支持对齐TAdvEdit 扩展了这个能力。4.3 TAdvToolBar把老菜单改造为 Office 风格工具条老系统的菜单一层套一层用户找功能要点三次鼠标。用 TAdvToolBar 可以把高频操作提到窗体顶部做成 Office 风格工具条。步骤是在窗体上放一个TAdvToolBar设置Align : alTop然后往里加TAdvToolBarButton。// 动态添加工具栏按钮 var Btn: TAdvToolBarButton; begin Btn : TAdvToolBarButton.Create(Self); Btn.Caption : 导出报表; Btn.Images : ImageList1; Btn.ImageIndex : 0; Btn.OnClick : DoExport; AdvToolBar1.ButtonList.Add(Btn); end;参数说明Images指向公共图标列表ImageIndex选择图标序号。按钮高度由工具栏统一控制不要在OnResize里手动改按钮尺寸否则不同 DPI 下会错位。ButtonList是工具栏自己的有序列表用Add追加即可。把老的TMainMenu保留着用Advanced属性让部分菜单项同步是平滑改造的方式。TAdvToolBar 真正省事的地方是内置了溢出按钮。当窗口宽度不足以显示所有按钮时它会自动折叠到右侧的»里不需要你写响应代码。这个属性默认开启别手滑关掉。4.4 让旧项目混用 TMS 与其他第三方控件命名空间和依赖问题一个项目通常不只一套第三方控件。TMS 的单元名很具有辨识度如AdvGrid、AdvEdit但抢单元名的概率仍然存在。混用时的第一原则是把 TMS 单元写进 uses 列表靠前的位置让编译器优先找到 TMS 的版本。示例// 放在其他第三方控件之前 uses Winapi.Windows, System.SysUtils, VCL.Graphics, AdvGrid, AdvEdit, VCL.Controls, VCL.Forms;如果编译时出现“Unit1.pas(123) Undeclared identifier: MergeCells”多半是 uses 顺序把另一个控件的同名类遮住了。这时候在 IDE 里按住 Ctrl 点击类名跳到哪个单元就能看出是哪个包在用。依赖和命名空间问题多半要靠实际跳转排查别盲猜。另外TMS 的 Full Source 包不能和同一台机器上的其他版本混装。如果之前装过 TMS VCL UI Pack 的一个旧版本安装新版本前要把旧 BPL 路径从 IDE 搜索路径里移除。混装会导致 IDE 启动时提示“Package X cant be loaded because another package contains the class”。这个问题本质上不是 TMS 的 bug是 VCL 类名在包间碰撞我们在下一章专门处理。5. 避坑清单编译失败、内存错误、路径乱码和运行时包缺失这一章是血泪经验每条都对应我在项目群里被人问过的真实事故。按“现象→原因→解决”的方式记录方便你复制到自己的项目备份里。5.1 编译报内存错误是源码包自身的问题吗现象用 Delphi 7 编译 TMS 某个新版 Package执行到一半IDE 弹出“Out of memory”或“EOutOfMemory”重试几次还是一样。很多人第一反应是源码包坏了转而到处找替代版本。原因这不是控件包的逻辑问题多半是旧版 Delphi 在 Win10/11 下分配堆内存的方式撞上了系统兼容层。另一个常见诱因是杀毒软件实时扫描临时 .dcu 文件导致 I/O 阻塞和操作系统内存回收机制相互影响。以及 Delphi 7 默认的编译进程堆上限比新版 IDE 低遇到大型包更容易顶到上限。解决先把杀毒软件的实时监控关掉重新用 Release 配置编译。如果还报错尝试把连接器的堆保留区域调大在项目选项的 Linker 页面里增加MinStackSize和MaxStackSize。不要直接改 TMS 源码先调整宿主项目配置。我还有一个习惯是把临时目录换成纯英文路径比如D:\tmp因为%TEMP%如果落在带用户名中文的目录下编译器的临时文件解析偶尔会出幺蛾子。5.2 安装后控件不出现多半是 IDE 没刷新缓存现象BPL 编译成功也点了 Install但工具面板里找不到 TMS 页面。重启 IDE 两三次仍然没有部分老用户就开始重装系统。原因最常见的原因是安装的不是设计时包而是运行时包。运行时包也注册但不提供工具面板组件还有一种情况是 IDE 缓存里的旧包索引没刷新特别是从调试版切到 Release 版之后。解决先到Component Install Packages里看已安装包列表如果 TMS 条目在列表里说明包已经加载只是工具页面被合并进了其它页签。在工具面板右键选“Find Items”输入TAdvStringGrid看能不能定位到。如果确实找不到点击 Remove 把这个包先移除然后重新 Add 新生成的 BPL再点“Default”恢复默认页签排列。这一步是我处理安装问题的第一动作比翻注册表快得多。5.3 运行时弹“无法找到 TMSxxx.bpl”现象开发机上一切正常把 exe 拷到另一台没有安装 RAD Studio 的电脑上双击运行提示“无法找到 TMSVclUIPack.bpl”程序直接退出。原因项目启用了“Build with runtime packages”exe 依赖一组 BPL但分发时只拷了 exe。这不是 TMS 特有的问题所有 VCL 控件包都这样但 TMS 包名多容易漏拷。解决最简单的做法是把项目配置改为静态链接不勾选Build with runtime packages重新编译后 exe 自带 TMS 代码分发时不需要 BPL。如果因为多个 exe 共享 BPL 必须动态链接则要把所有相关 BPL 拷到 exe 目录。常用命令copy D:\libs\tms_vcl_ui_pack\Lib\win32\release\*.bpl D:\release\然后写一个部署清单按 TMS 包依赖顺序逐个检查。我自己的经验是凡是发布后报缺 BPL先看是不是把调试版 BPL 拷出去了调试版依赖特定编译选项在无 IDE 机器上经常缺东西。5.4 老 Delphi 7 编译新版 TMS 需要调整单元顺序现象在 Delphi 7 里编译一个使用了 TAdvStringGrid 的工程报错“UnitProgressMeternot found”或“Cannot find unitTMSLogging”。原因新版 TMS 源码内部依赖几个基础单元这些单元没有被添加到 Delphi 7 工程的搜索路径。和 Delphi 12 不同老版本 IDE 不会自动扫描 TMS 全部源码目录搜索路径必须手动配好。解决打开Project Options Directories/Conditionals在Search Path里把 TMS 的Source根目录和对应版本目录加进去。顺序很重要先加Source\Base再加Source\AdvGrid等具体单元目录。如果 TMS 某个子目录名和工程内文件重名把这个子目录排在重名目录之前。这个做法能解决绝大多数“找不到 xxx”的老 Delphi 编译问题。5.5 注意CBuilder 下处理 VCL 接口的字符串与 AnsiString 差异现象CBuilder 工程编译通过但运行时 TAdvEdit 显示乱码或者导出到 Excel 的中文变成问号。Delphi 侧没有这个问题。原因CBuilder 环境下TMS 老接口在早期版本里默认走AnsiString而你的工程是 Unicode 编译模式。赋值char*时编译器按当前代码页转换中文在目标代码页里没有对应字符就成了乱码。解决在 CBuilder 代码里所有 TMS 字符串属性和方法入参都显式写String类型不要直接传char*AdvStringGrid1-Cells[0][0] String(L序号); AdvEdit1-Text String(L待审核);如果是从TEdit的Text转给AdvEdit1也直接AdvEdit1-Text Edit1-Text;编译器会做统一转换。我早期在 CBuilder 里犯过用AnsiString中转的错后来定了条规矩界面层一律用System::String只有在调用系统 API 需要 LPSTR 时才做显式转换。这套下来乱码问题基本消失。6. 进阶一招用 Full Source 给 TMS 控件打私有补丁Full Source 最大的价值不在于让你“看懂”控件而在于你可以修改它的行为。这里分享一个我常用的私有补丁方案针对 TAdvStringGrid 的默认排序逻辑做扩展。TAdvStringGrid 自带点击列头排序但默认对数字列的处理在旧版本里是字典序10 会排在 2 前面。这个问题在业务报表里很致命。避免直接改AdvGrid.pas一个更可靠的思路是继承控件重写它的Compare方法。type TMyAdvStringGrid class(TAdvStringGrid) protected function Compare(Key1, Key2: Pointer; ACol: Integer): Integer; override; end; function TMyAdvStringGrid.Compare(Key1, Key2: Pointer; ACol: Integer): Integer; var V1, V2: Double; S1, S2: string; begin S1 : Trim(Cells[ACol, Integer(Key1)]); S2 : Trim(Cells[ACol, Integer(Key2)]); if TryStrToFloat(S1, V1) and TryStrToFloat(S2, V2) then Result : CompareValue(V1, V2) else Result : inherited Compare(Key1, Key2, ACol); end;代码说明Compare是 TAdvStringGrid 内部排序的比较入口默认实现按字符串比较。我这里先尝试把两个单元格转成浮点数转换成功就按数值排序失败则回退到原来的字符串逻辑。Key1和Key2是内部行索引不能直接当行号用所以用法是Cells[ACol, Integer(Key1)]。实际方法名和签名以你拿到的源码为准不同版本可能叫CompareCells或DoCompare。你打开AdvGrid.pas后用 IDE 的 Find In Files 搜一次就清楚了。这是 Full Source 的日常用法不是给你发呆看的是给你查内部实现用的。打完补丁后在窗体里使用TMyAdvStringGrid而不是原来的TAdvStringGrid。这样源码包升级后你的修复仍然在继承类里生效不需要每年重打一次补丁。我买第一套 TMS 时血泪教训是直接改了AdvGrid.pas升级时被自己改得找不到北后来才养成了“补丁一律放继承类”的习惯。希望帮到你。本文还有配套的精品资源点击获取
返回列表