简介面向 Delphi 与 C Builder 开发者的 Bergsoft NextSuite (VCL) v6.40.0 完整源码控件包专为 Athens 版本2025年2月24日发布同步更新并保持对 Delphi/CB 6-12 的广泛兼容。它是对标准 VCL 组件的有力扩充涵盖增强型网格、集合、检查器、查看器等常用控件适合需要提升桌面端界面表现、操作交互与编码效率的中高级开发者。整个压缩包共 1355 个文件、约 5.82MB包含 128 个 pas 源代码、104 个 cpp 源文件与 cbproj 工程、238 个 dpk 包文件、261 个 dproj 工程描述、334 个 res 资源、71 个 dfm 窗体定义另有 groupproj、pdf 说明文档、示例程序与 IDE 分组文件目录结构按控件类别和版本分好便于定位和安装。已有 47 人浏览学习。由于是 Full Source 版本使用者可自由阅读、编译并跟踪各控件的实现逻辑也能按需调整细节后重新打包安装到不同版本的 Delphi/CB 环境中对控件二次开发、功能裁剪和排错调试具有较高实用价值。1. 这标题在讲什么一套能让 TDBGrid 直接退役的 VCL 控件全家桶拿到 Delphi 12.3 Athens装好 IDE 之后第一件事往往不是写业务而是找控件。Bergsoft NextSuite (VCL) v6.40.0 就是典型的一站式答案发布于 2025 年 2 月 24 日一套同时覆盖 Delphi 和 CBuilder 6-12 Athens 的 VCL 控件库核心是 NextGrid 系列表格控件附带下拉框、属性检查器、文件上传等周边组件。它最常见的用法是把项目里那些「用 TDBGrid 硬撑但怎么看都别扭」的表格换掉或者从零搭一个带进度条、按钮、复选框、树形分组的数据密集界面。Full Source 的意思是你拿到的不是只有运行时 bpl 的闭包而是能自己编译、改源、跟踪调试的完整工程。这篇文章面向的读者很具体在 Delphi 12.3 里维护老项目、或者正打算在新工具里用 VCL 做桌面端的人想弄清楚这套控件值不值得装、怎么装、参数怎么调、坑在哪。2. 从 NextGrid 到 NextDBGrid这套控件到底值在哪2.1 组件地图装上 NextSuite 后工具箱里多了什么NextSuite 不是单个控件是一组控件打包卖。装完之后你的 VCL 组件面板上会多出一排新东西常见组件大致如下组件名类型一句话定位NextGrid纯内存网格不绑定数据集自己塞数据列类型最丰富NextDBGrid数据感知网格绑定 DataSource像 TDBGrid 的全面增强版NextCtrlGrid复合网格一个单元格里塞多个子控件做仪表盘用NextComboBox增强下拉框带多列、自动完成、勾选项的下拉框NextInspector属性检查器类似 IDE 的对象检查器做设置面板很省事NextFileUpload文件上传控件管理待上传队列带进度和重试逻辑实际使用中NextGrid 和 NextDBGrid 占了九成场景。两者分工明确NextGrid 不碰数据库适合把内存里的数组、列表、流数据直接铺到界面上NextDBGrid 接 DataSource适合原来用 TDBGrid、现在嫌它丑或嫌它慢的老项目。我一般建议新项目先评估 NextGrid因为它所有的数据流都握在自己手里性能上限高得多。2.2 为什么不用 TDBGrid普通网格和 NextGrid 的差距在哪原生 TDBGrid 最大的问题不是不能做而是什么都要自绘。做一列进度条OnDrawColumnCell 里自己画矩形做一列复选框自己处理点击状态想在某行前面加个树形展开按钮基本等于自己写一个网格。这些活 NextGrid 在同一起跑线上已经替你干完了而且是在属性面板里勾选就能完成的事。差距最明显的是列类型。NextGrid 每一列都能单独指定渲染类型我印象里常见的枚举就有文本、复选框、按钮、进度条、超链接、图片、下拉框这些。也就是说「一列表格里混着进度条、勾选框、按钮」这种业务需求在 TDBGrid 里是两天的自绘工作量在 NextGrid 里是改一个 ColumnType 属性的事。树形分组、单元格合并、行高自适应这些也都是内置能力不需要你去碰 Canvas。另一个被低估的点是导出。NextGrid 自带把内容导出到 Excel、HTML、CSV 的能力格式保持了列宽和类型。老项目里「表格导出」这种需求经常临时要TDBGrid 得引第三方库或者手工拼 CSVNextGrid 是现成的。选型时把这条也算进成本省的不只是写网格的时间还有周边功能反复造轮子的时间。2.3 什么时候不该上 NextSuite先泼一盆冷水不是所有项目都该换。如果你的表格场景只是「把数据库记录按行显示用户看完就走」那 TDBGrid 完全够用换 NextDBGrid 反而要改造一堆既有代码。已经用 DevExpress 或其他商业网格控件且改造成型的老项目除非有明确的性能痛点否则迁移成本远大于收益——NextGrid 的学习曲线再低也是一套新的对象模型。另外要说明白NextSuite 是纯 VCL 控件只服务 Win32/Win64 桌面程序。Web 项目、跨平台框架、Linux 部署这些场景跟它没关系别指望用它解决非 Windows 端的问题。最后一点如果项目要求极致安装包体积每多一个 bpl 运行时包分发部署就多一个文件要带这个账也要算进去。3. 在 Delphi 12.3 Athens 里把 Full Source 跑起来3.1 安装前要做的三件事拿到压缩包之后别急着解压编译先花十分钟把环境理一遍。第一件事是确认你的 Delphi 12.3 是完整安装不是精简版——源码包编译需要 IDE 自带的编译器、链接器和全部 VCL 源码路径精简版缺文件会让编译过程翻车。第二件事是备份当前 IDE 的库路径和已安装包列表方法是在 IDE 里导出注册表项或截图保存 Tools Options Library 里的内容万一装坏了能还原。第三件事是把旧版本的 NextSuite 或其他网格控件先禁用掉避免设计期包冲突尤其是组件名和 package 名相近的情况。这三点看着琐碎但我在多个机器上装过不同版本的 VCL 控件包凡是跳过备份步骤的后面排查问题都得靠回忆猜配置浪费时间。特别是你已经装了别的网格类控件时设计期包之间争夺 IDE 菜单空间是常有的事先禁用旧的能少一半麻烦。3.2 编译源码包的最小流程解压后打开目录你会看到按组件拆分的源码子目录每个目录下是 .pas 源文件和 .dpk 包文件。Full Source 版本没有预编译的 bpl所有运行时包都必须从源码编译。最小操作流程是打开主包文件编译然后安装到 IDE。给一个我在 Delphi 12.3 里走的典型流程# 假设解压后源码目录在 D:\Components\NextSuite640 cd /d D:\Components\NextSuite640 # 1. 先确认包文件结构找到后缀为 .dpk 的包文件通常分 Runtime 和 DesignTime 两类 dir /s *.dpk # 2. 用命令行编译运行时包也可以用 IDE 打开后编译二选一 # -P 指定平台默认 Win32Delphi 12.3 里需要给 Win64 再编一次 # -B 表示全量重建避免旧 DCU 残留 D:\Program Files\Embarcadero\Studio\23.0\bin\rsvars.bat msbuild NextSuite_Run.dpk /t:Build /p:PlatformWin32 /p:ConfigRelease msbuild NextSuite_Run.dpk /t:Build /p:PlatformWin64 /p:ConfigRelease # 3. 设计期包单独编译安装它会自动往 IDE 注册组件 msbuild NextSuite_Design.dpk /t:Install /p:PlatformWin32 /p:ConfigRelease这里有几个参数值得说明。/p:ConfigRelease选 Release 是为了让 DCU 不带调试信息运行时包体积更小如果想跟进源码调试可以再编一个 Debug 配置放在独立目录别把 Debug 和 Release DCU 混在一起。/p:PlatformWin64一定要单独来一遍因为 NextGrid 牵扯到大量自绘代码Windows 指针宽度不一样32 位下编译通过不代表 64 位没问题。最后一步Install只做一次就够了设计期包不需要按平台重复安装。用 msbuild 的好处是可重复换机器、换版本时改一下路径重跑比在 IDE 里点鼠标靠谱得多。也有同事习惯用 IDE 里的 Project Manager 打开包文件右键 Compile编译成功再右键 Install。这条路可行但注意每次改源代码之后记得 Build 而不是 Compile否则 IDE 可能复用旧的 DCU让你改的东西不生效。源码版的价值就在这任何控件行为不满意的打开 .pas 直接改重新编译就完事。3.3 搜索路径和运行时包配置编译安装只是第一步你的项目要引用这些控件还差两处配置。第一处是库搜索路径在 Tools Options Language Delphi Library Library paths 里把 NextSuite 的源码目录加进去。注意是加源码目录不是加输出 DCU 的目录。这样做的原因是你项目里 uses 了 NextGrid 单元时编译器先找源码找到后自动编译需要的部分DCU 输出到你的项目目录或指定的 DCU 目录。把源码路径配好之后新建项目直接拖控件才正常不然 IDE 会提示找不到单元。第二处是运行时包。你的项目编译时如果选择「Use runtime packages」那么交付时就要把对应 bpl 一起带上如果选择静态链接默认DCU 会直接嵌入 exe不用带包。我个人的做法是内部工具用静态链接省得部署时缺 bpl商用产品看情况如果包里还有其他共享包再考虑运行时包方案。设置入口在 Project Options Delphi Compiler Runtime packages把 NextSuite 相关的运行时包名加进去或移除取决于你要哪种模式。提示确认 DCU 路径时检查 Project Options Delphi Compiler Output 里的 DCU output directory。全源码编译的包如果 DCU 路径指向了一个旧版本残留目录后面排查疑难问题时很容易被旧货误导。4. 把 NextGrid 用到真实项目里核心参数与配置顺序4.1 最小可用配置从一个空白网格到能填数据的表格在表单上放一个 NextGrid默认它是一张空表。第一次上手最容易懵的是它居然不像 TDBGrid 那样直接根据 DataSource 生成列。NextGrid 的列是手动建的这反而给了你完全控制权。先看一段最基础的初始化procedure TForm1.FormCreate(Sender: TObject); begin // 清空默认状态保证每次进入都是干净画布 NextGrid1.Clear; // 一次加三列列标题分别为名称、数量、状态 NextGrid1.ColumnCount : 3; NextGrid1.Column[0].Header : 名称; NextGrid1.Column[1].Header : 数量; NextGrid1.Column[2].Header : 状态; // 加两行测试数据Cell 的行列索引都是从 0 开始 NextGrid1.RowCount : 2; NextGrid1.Cell[0, 0].Text : 钢板; NextGrid1.Cell[0, 1].Text : 12; NextGrid1.Cell[0, 2].Text : 已入库; NextGrid1.Cell[1, 0].Text : 螺栓; NextGrid1.Cell[1, 1].Text : 300; NextGrid1.Cell[1, 2].Text : 待采购; end;逐行解释一下Clear是让网格回到空状态避免设计期残留数据影响运行ColumnCount直接指定列数配Column[i].Header设置列头RowCount决定行数Cell[行, 列]是读写单元格的入口.Text属性就是单元格显示字符串。这套模型跟 TDBGrid 最大的区别是你不需要一个数据集在中间撑着数据直接从代码进网格逻辑链路短改哪里都直观。参数上要记住RowCount和ColumnCount改动会触发网格重建数据量大时不要在循环里反复调整它们。常见做法是先定好行列数量再往Cell里填值。另外Cell[i, j].Text的索引顺序是先行后列跟数组声明的习惯一致但跟 TDBGrid 的 Columns 集合完全不是一回事从老项目迁过来的同事经常在这卡一下。4.2 列类型是 NextGrid 的杀手锏复选框、按钮、进度条怎么配文本显示是最基础的用法NextGrid 真正的优势在列类型。你要让一列变成复选框不需要放一个 DBCheckBox 去对齐直接在列定义里改类型。下面这段代码演示我给「审批」列配按钮、「完成率」列配进度条的做法// 状态列显示为复选框 NextGrid1.Column[2].ColumnType : ngCheckBox; // 让复选框的勾选状态真正影响数据这里用 Cell 的 Checked 属性 NextGrid1.Cell[0, 2].Checked : True; NextGrid1.Cell[1, 2].Checked : False; // 完成率列渲染成进度条 NextGrid1.ColumnCount : 4; NextGrid1.Column[3].Header : 完成率; NextGrid1.Column[3].ColumnType : ngProgress; // 进度条的值走 Cell 的 Progress 属性范围 0-100 NextGrid1.Cell[0, 3].Progress : 75; NextGrid1.Cell[1, 3].Progress : 30; // 操作列放一个文字按钮 NextGrid1.ColumnCount : 5; NextGrid1.Column[4].Header : 操作; NextGrid1.Column[4].ColumnType : ngButton; NextGrid1.Cell[0, 4].Text : 查看明细; NextGrid1.Cell[1, 4].Text : 补货;这里的枚举名ngCheckBox、ngProgress、ngButton在真实安装后以你看到的枚举列表为准不同小版本命名略有差异但思路一致每种列类型对应一类单元格编辑/渲染行为。复选框列的勾选状态走Checked属性进度条走Progress按钮列的文本还是Text点击事件在OnCellClick里通过判断Cell.ColumnIndex来响应。参数调整上要注意这几个点。第一复选框列默认点击就能切换状态但如果你在数据集模式下使用切换后要自己回写数据源框架不会自动帮你写库。第二进度条的Progress溢出时大于 100 或小于 0行为不确定业务侧要做钳位处理我习惯在赋值前用Max/Min函数把值夹到 0-100。第三按钮列的文字想居中或者换色在Column的Font和Alignment上调不需要碰自绘代码。4.3 数据量上去之后虚拟模式和大数据参数NextGrid 处理一万行以内没问题但到了十万行还按普通模式往里塞就会出现明显的创建开销。这个场景下要开虚拟模式。虚拟模式的核心是网格不实际创建每行每列的底层对象只在你需要显示某个区域时才去取数据。开启方式是通过设置RowCount为数据总量同时让网格知道你提供数据的事件处理器典型配置如下// 开启虚拟模式前提是你能实现一个按索引取数据的回调 NextGrid1.EnableVirtualMode : True; NextGrid1.RowCount : 100000; // 逻辑总行数不再逐个创建对象 NextGrid1.ColumnCount : 3; // 在 OnGetCellText 事件里按需供数 procedure TForm1.NextGrid1GetCellText(Sender: TObject; ACol, ARow: Integer; var Value: string); begin case ACol of 0: Value : IntToStr(ARow 1); // ACol 是列索引ARow 是行索引 1: Value : Format(数据%d, [ARow]); 2: Value : BoolToStr(ARow mod 2 0, True); end; end;这个模式的逻辑是网格滚动时可见区域的行才触发OnGetCellText未显示的行不产生任何对象开销。代价是你要自己实现取数逻辑数据源不再像普通模式那样由网格持有一份副本。参数上两个关键点EnableVirtualMode必须在设置RowCount之前打开否则先按普通模式创建了对象再切换性能优势就没了另一个是RowCount此时仅仅是一个逻辑值别在虚拟模式下往Cell里写数据写了也会被回调覆盖。大数据场景还有一个容易被忽略的参数——OptimizeWidth或类似的列宽优化开关。当虚拟模式加大量列一起用网格每次重绘都做宽度计算会拖慢滚动。常见做法是固定列宽或只在初始化时计算一次运行时不让用户拖动改变列宽性能会明显好一截。实测中十万行开虚拟模式后滚动流畅度跟一两千行普通模式差不多瓶颈只剩取数回调本身。5. 从 v6.40.0 源码版里踩过的坑安装与运行期排查5.1 编译时报错找不到 DCU 或单元文件现象安装包时提示E2209 Required package xxx not found或者编译到某个单元说找不到.dcu。原因最常见的是搜索路径没配全。全源码版本对源码路径的顺序敏感Delphi 编译时按 Library paths 里列出的顺序找单元如果旧版本残留的 DCU 目录排在前面编译器会先找到旧版编译产物导致新代码引用了旧接口。解决打开 Tools Options Delphi Library把 NextSuite 的 Source 目录移到所有其他网格控件目录之前然后在编译前对包执行 Release 配置的全量 Build把旧 DCU 清掉。更粗暴的办法是把 Search path 里无关的网格控件路径临时移除编译完再加回来。5.2 控件装好了但组件面板里找不到 NextGrid现象设计期包编译安装成功没有报错但打开组件面板翻遍所有页都找不到 NextGrid。原因设计期包组件注册失败但没弹错。多半是之前 IDE 里残留了同组件的旧版本包两个设计期包都试图在同一个类别下注册组件结果新包注册被 IDE 忽略。解决在 IDE 的 Components Install Packages 里检查是否已有同名包处于勾选状态把旧的运行时包和设计期包先删掉再重新 Install 一次。如果还不行检查设计期包的Register过程是否被条件编译指令屏蔽了源码版通病是某些版本的包文件带了 IDE 版本判断会把新版 IDE 识别成不支持并跳过注册。这种情况直接把包文件里对应的编译条件改掉重新编译即可。5.3 项目在 Win64 平台链接失败Win32 下却正常现象同一份代码切到 Win32 Release 编译顺利通过切 Win64 就报链接错误要么外部符号找不到要么.obj类型不匹配。原因运行时包在 32 位编译过、但 64 位平台没有编译或者设计期安装时只装了 Win32 的包。VCL 包和项目之间通过运行时包名关联目标平台没有对应的 bpl/dcu 时就链接不过。解决回到包源码目录对运行时包用msbuild /p:PlatformWin64重新 Build确保 64 位 DCU 输出到独立的 Win64 目录然后在项目里确认库路径包含该 64 位 DCU 目录。检查方法是编译后在项目设置的 Library path 里临时加一条到Win64\Release输出目录链接错误通常立刻消失。5.4 高分屏下网格文字发虚、边框错位现象在 150% 缩放的显示器和远程桌面下NextGrid 的文字边缘模糊行高偏矮列头边框有错位。原因程序没有声明 Per-Monitor DPI Aware系统按 96 DPI 做缩放控件自绘代码里的字体尺寸和坐标换算就出现误差。NextGrid 自绘代码在非 100% 缩放下对字体高度和行高做了精确计算一旦系统缩放不是整数倍行列尺寸对不上。解决在项目.dpr的开头补上Application.MainFormOnTaskBar : True;并声明 DPI 感知常见做法是在.dpr里加一行SetHighDpiAwareness或使用项目设置里的 High-DPI 选项更省事的是在代码里把Font.PixelsPerInch在 FormCreate 时与屏幕参数同步。装完控件第一次跑高分屏如果发现自绘列错位先查这个不是控件问题。5.5 NextDBGrid 绑定数据集后滚动慢、鼠标滚轮没反应现象NextDBGrid 绑上 TClientDataSet数据量两万行鼠标滚轮滑动时界面一顿一顿或者滚轮根本没反应。原因滚轮无反应通常是窗体没有把鼠标滚轮消息传给网格。VCL 默认滚轮事件作用于当前焦点控件如果网格没获得焦点滚轮消息就被表单吞了。滚动慢则是因为默认开了整行选择和自动优化数据量大时鼠标经过一行就触发一次重绘。解决滚轮问题在 FormCreate 里让网格先获得焦点或重写窗体的MouseWheel处理器把消息转给 NextDBGrid。性能问题把NextDBGrid的VisibleRowCount相关优化选项打开并关闭行高自动计算AutoRowHeight : False给它一个固定行高。两万行场景下固定行高往往能直接把滚动流畅度翻一倍。6. 让 NextGrid 像成熟产品一样用主题、虚拟滚动与按需加载控件装好、参数调通接下来是把它做得「像样」。我最后分享三个习惯都是长期维护项目里被验证过值得做的事。第一件事是主题统一。NextGrid 的颜色、字体默认值偏开发风格直接交付客户会显得糙。我会在项目启动时做一个全局配置过程统一设置所有网格的头部背景、选中行颜色、边框风格和字体而不是在每个窗体里单独调。这样换肤只改一个函数十几个窗口跟着变比到处散落硬编码颜色好维护得多。第二件事是虚拟滚动配合按需加载。真实项目里十万行数据往往不是一次查出来的而是用户滚到哪查到哪。做法是把OnGetCellText做成缓存查询前 500 行先返回滚动接近末尾时触发数据加载加载完更新RowCount并调用Invalidate刷新。这里的关键是缓存命中判断要快我习惯用一个 TDictionary 按行号缓存取到的记录避免滚动回来时重复查库。第三件事是排序交给网格本身。NextGrid 内置按列排序的能力绑定数据集的场景下先设置SortColumn和SortDirection再在排序事件里重新查询数据集。纯内存模式更简单直接对数据源数组排序后重新填充 Cell。这个功能看着基础但用熟了之后能帮你砍掉一大批「点列头弹排序菜单」的自定义代码。最后说一个教训。我在一个老项目里图省事把 NextGrid 当作纯显示控件用所有数据操作都在外部数组完成结果后来要加单元格编辑时发现网格内部状态和外部数组经常不同步补了整整一周的同步逻辑。正确做法是动手前就定好数据归属要么全部走网格的 Cell 模型要么全部走外部数据源加虚拟模式不要两头混。记住这个原则NextSuite 用起来会顺很多。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?