尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
DevExpress VCL 20.2.6全源码在Delphi 11下的编译安装与避坑实践
简介面向Delphi 11开发者的DevExpress VCL 20.2.6完整控件安装包专门解决升级IDE后原控件库失效、国内渠道资源混杂难以编译的痛点。压缩包体积约473MB内置DxAutoInstaller.exe一键安装器无需手动配置环境变量或注册组件运行后即可自动适配Delphi 11并完成部署安装后所有VCL组件均可直接在IDE中使用。已有513人浏览学习实测为非试用版本安装后可长期用于商业项目开发。资源定位清晰适合正在从旧版Delphi迁移至11的桌面应用开发者也适合需要稳定UI控件库的中高级程序员。相比市面上的残缺方案此套件完整度高省去了查找正确版本、修补源文件、反复编译排错的时间解压后执行安装程序即可使用实测在Delphi 11中编译运行正常显著降低升级成本。1. 借老控件续命DevExpress VCL 20.2.6 fullsource 装进 Delphi 11接手一个老项目时最怕的不是业务逻辑晦涩而是 IDE 一打开就弹「找不到 dclcxGrid 包系列文件」——项目里用的第三方界面控件没装整个窗体一片空白。那次我花了一晚上装了删、删了装最后是某个开发者群里的人甩来一句「你试试 DevExpress VCL 20.2.6 的 fullsource 版本亲测 Delphi 11 能装上。」这就是 DevExpress VCL 20.2.6 全源码安装包官方 20.2 序列里较晚的维护版本带完整源码而不是试用版支持老式的 VCL 原生开发方式。它解决的就是「新版界面控件库装不进老 IDE」的尴尬适合手里捏着历史遗留项目、又不想把整个 UI 层推倒重写的人。往下看之前先记住这个版本不是新东西但它的适用场景到今天依然很硬。2. 选型先看版本差异20.2.6 的定位与 fullsource 的真实价值2.1 控件覆盖面决定你值不值得装DevExpress VCL 这套控件库包里的东西大致分成几个家族cx开头的核心编辑控件比如 cxTextEdit、cxDateEdit、cxGriddx开头的工具类和皮肤引擎还有独立的报表、图表、导航、进度条等模块。对一个靠 VCL 吃饭的团队来说最常被依赖的就是 cxGrid 和 cxDateEdit 这一票数据感知控件——表格展示、行编辑、过滤下拉框全都在这些组件里。20.2.6 这个版本对它们的覆盖是完整的cxGrid官方在 20.2 里把 master-detail 视图的分组排序行为调过一轮后续维护版又补了几个排序状态恢复的回归 bugcxDateEdit的日期下拉面板在 20.2 里换过绘制逻辑。所以如果你手头项目大量使用这些控件这个版本的 API 行为和旧代码是匹配的直接接上不用改业务代码。值得多说一句的是DevExpress VCL 对 IDE 版本的适配方式是「同一套源码编译时按 IDE 版本条件编译」。也就是说20.2.6 在发布时官方主要适配的是 Delphi 10.4 这条线但它源码里那一堆条件编译符号其实允许你自己在 Delphi 11 下重新编译。网上流传的「支持到 Delphi 11」的说法指的就是这条路不是官方安装包直接识别而是源码包在 Delphi 11 下能完整编译过。这一点如果你之前只碰过官方安装版可能没有概念。安装版是官方预编译好的 bpl/dcp只认它测试过的 IDE 版本fullsource 版本则是把整个控件库的源码和 dproj 打包给你IDE 版本兼容性由你的编译器说了算。2.2 20.2.6 与早前 20.x 维护版的差异20.2 这条线不是只发过一个版本。x.x 维护版之间的差异从使用者角度主要是两类一是 bug fix二是对编译器的兼容性修正。20.2.6 属于 20.2 序列后期修掉的问题不少比如cxGrid在某些 DPI 缩放下行指示器绘制偏移、dxBar在 Windows 10 更新后的菜单闪烁。这些 bug 在 20.2.0 里确实是存在的如果你图新鲜下了最初的 20.2.0早晚会被这些小毛病磨到怀疑人生。所以卡在 20.2.x 这条线的话尽可能往后取维护版本比取首发版省心得多。另外20.2.6 对高 DPI 的适配比 20.1 是有一个台阶的。20.1 时代许多对话框控件在高分屏下会出现字体缩放不均的问题20.2 系列统一改了LookAndFeel的缩放逻辑让字体跟随系统 DPI 走。这个改动影响的不只是显示效果还会影响你在代码里设的Font.Height字体高度值——单位从像素变成了逻辑单位代码里如果到处写死Font.Size : 9会相对安全但如果你习惯改Font.Height20.2.6 下同一数值出来的实际字号比 20.1 要小一点。这类差异不是 bug是行为变更接手老项目时最容易在这上面踩坑。2.3 fullsource 与试用版、正式安装版的本质区别三者差异用一个表能说清但背后逻辑更重要。形态包内容能装进 Delphi 11 吗改源码重编译典型限制试用版官方预编译 bpl安装器大概率不支持弹 IDE 版本不识别不行带启动试用提醒到期失效正式安装版预编译 bpl 少量源码 stub同版本号不匹配时很折腾只能看不能改无但绑定一套 IDEfullsource 版完整 dfm/pas/dproj用对应包配置重新编译即可全部可改可重编安装流程自己跑试用版我碰过一次情况是 IDE 里控件面板倒是出来了但一拖动 cxGrid 到窗体上就弹「Trial Version」提示水印程序装壳后启动还带一个倒计时对话框这个在交付现场就是事故。fullsource 的好处在于它连设计时包dcl*的源码都给你了设计时行为如果与业务冲突你可以直接改设计器代码。代价是安装不再是「下一步到底」得自己按依赖顺序把整个包编译一遍。选择建议如果你只是要在个把项目里快速用上 cxGrid不打算深入改控件行为直接找对应版本的预编译安装包更快。但如果你跟我一样需要跨 IDE 版本使用同一套控件库或者想要对界面控件做私有定制那么 fullsource 才是适合的。毕竟编译过一次之后生成的那几十个 bpl 就和正式安装版没什么两样而且后续维护还能看到控件源码排查问题时多一条路。3. 动手安装把 fullsource 源码包编译成 IDE 认得的控件库3.1 拿到源码包后先做三件事解压、查环境、设路径源码包解压后不要急着编译先花十分钟把环境摸清楚。我一般习惯先在 Delphi 11 的 IDE 里确认三个信息当前编译器的平台是 Win32 还是 Win64打开 主菜单 → 工具 → 选项 → IDE 设置 → 环境变量看里面平台相关的变量对齐没Library 路径里是否已经设置了源码包的根目录以及启动 Delphi 时有没有报过无效包路径警告。路径设置这步容易被跳过但它决定了后面能不能编译过。打开主菜单 → 工具 → 选项 → IDE 设置 → Delphi 选项 → 库把以下路径加进去以你的实际解压目录为准D:\DevVCL\Library D:\DevVCL\Library\Win32 D:\DevVCL\Library\Win64 D:\DevVCL\Source D:\DevVCL\Source\Win32上述路径添加后IDE 在编译任何工程时都能搜索到控件的 pas/dcu 文件。如果你漏掉这一步一会儿编译项目时大概率会报「Unit 找不到」的编译错误原因就是 IDE 根本不认识控件库所在的目录。环境变量里如果之前装过其他版本的 DevExpress记得把旧路径移除否则 DCU 文件可能被旧版本覆盖出现一堆莫名其妙的类名冲突。3.2 按依赖顺序编译基座包dx 与 cx 家族DevExpress VCL 的编译顺序不是随意的。底层的 dx 系列比如 dxTypes、dxMessages先编译然后是扩展的 cxs 系列比如 cxsData、cxsStorage再往上是核心的 cx 系列cxClasses、cxGraphics最后才是具体的控件实现和设计时包的 dcl 系列。顺序乱了编译到中间一定会报找不到 xxx.dcu 或 xxx.res。这里我用的是 Delphi 11 自带的命令行编译器 dcc32.exe。一般位置在C:\Program Files (x86)\Embarcadero\Studio\22.0\bin\dcc32.exe。编译库的代码包我写过一个小小的批处理脚本核心过程长这样echo off set DCCC:\Program Files (x86)\Embarcadero\Studio\22.0\bin\dcc32.exe set SRCD:\DevVCL\Source set LIBD:\DevVCL\Library\Win32 rem 第一步编译基座 dx 系列 %DCC% -B -Q -M -I%SRC% -U%LIB% -D%LIB% %SRC%\dxTypes.dpk %DCC% -B -Q -M -I%SRC% -U%LIB% -D%LIB% %SRC%\dxMessages.dpk rem 第二步编译扩展 cxs 系列 %DCC% -B -Q -M -I%SRC% -U%LIB% -D%LIB% %SRC%\cxsData.dpk rem 第三步编译核心 cx 系列多个包顺序执行 %DCC% -B -Q -M -I%SRC% -U%LIB% -D%LIB% %SRC%\cxClasses.dpk %DCC% -B -Q -M -I%SRC% -U%LIB% -D%LIB% %SRC%\cxGraphics.dpk-B表示重新构建防止旧 dcu 残留-Q安静模式少刷屏-M编译所有依赖单元-I指定 include 路径-U指定单元搜索路径-D指定输出目录。这个参数组合的核心逻辑是让每个包编译时都能找齐它依赖的上一级单元文件并把生成的 dcu 统一丢到同一个 Library 目录方便后面 IDE 统一检索。编译顺序是最容易出乱子的环节。我见过有人直接从 cxGrid 对应的 dcl 包开编结果编译器抱怨找不到 cxGrid 的运行期包——先把基座包跑一遍后面再编译具体控件包就顺畅多了。基座包全部通过后再去%SRC%目录下把剩余运行期包和设计期包按文件名顺序编完。如果中间某个 dpk 报错多数情况下是某个源文件引用了另一个还未编译的包里的单元那么把那个被引用的包调整到前面再编一次就好。3.3 安装设计时包让 IDE 工具栏长出新控件运行期包编译完只代表程序运行时能加载这些 bpl设计器里还看不到控件。要让 Delphi 11 的组件面板出现 DevExpress VCL 那一排图标还得把设计时包dcl 前缀的包安装进 IDE。这一步可以直接在 IDE 里做主菜单 → 组件 → 安装包点「添加」按钮把刚才编译输出的 dcl 系列 bpl 选进去比如dclcxGrid.bpl、dclcxDateEdit.bpl、dclDxBar.bpl。点确定后 IDE 会加载这些包正常情况下组件面板就会出现对应分类页。如果你不喜欢一个个点添加也可以在命令行里直接调起 IDE 并让它自动安装但那个操作在多数场景里不如手动点可靠——因为 IDE 加载包时如果有任何依赖缺失它会弹出一个多选框让你勾选缺失的包这种交互走命令行是没法处理的。手动安装的好处是每装一个包IDE 都会立刻反馈这个包依赖的其它包是否全部就绪有缺失当场就能看出来。设计时包安装完毕后还有一件容易忽略的事设置Library编译路径里的Win32目录要在所有包加载完之后再确认一遍。因为 IDE 在加载 bpl 时记录的只是包的路径而编译新项目时搜索的是Library路径两套路径不重合会让 IDE 一边能看到控件、一边编译不过。我一般是把D:\DevVCL\Library\Win32放在所有路径列表的最顶上免得其它目录下的同名文件干扰搜索顺序。4. 装完先别急着写业务花十分钟验证控件真能用4.1 用 dcc32 命令行验证包编译结果设计时包装好了组件面板也出图标了不代表万事大吉。我习惯先在命令行里手动编译两个纯运行期的示例工程确认生成的 bpl 和 dcu 都在正常输出。例如检查cxGrid的运行期包能否脱离设计期包单独被编译引用dcc32 -M -UD:\DevVCL\Library\Win32 -ID:\DevVCL\Source ^ -DD:\DevVCL\Library\Win32 ^ D:\DevVCL\Source\cxGrid.dpk如果这一条命令能顺利生成 cxGrid.bpl 和 cxGrid.dcu说明运行期链路是通的。接着再编一次 dcl 包dcc32 -M -UD:\DevVCL\Library\Win32 -ID:\DevVCL\Source ^ -DD:\DevVCL\Library\Win32 ^ D:\DevVCL\Source\dclcxGrid.dpkdcl 包编译通过代表设计时包自身没有缺失依赖——这一步如果失败不用怀疑是控件代码有逻辑错误基本就是某个运行期包的输出的 dcu 不在-U路径里。把编译错误提示里的源文件路径和你实际的 Library 目录比对一下八成能发现路径不一致。命令行编译是块试金石。IDE 里安装包时Delphi 会对包做一次延迟加载有些缺失的依赖它只是弹个警告框未必会阻止你点确定但后续新建项目放控件时问题才炸出来。命令行编译成功意味着所有单元的依赖关系是解析完整的可以给后面的验证一个干净的基础。4.2 新建 VCL 工程放上 cxGrid 与 cxDateEdit验证的真家伙是在 Delphi 11 里新建一个 VCL 工程往窗体上拖两个最有代表性的控件cxGrid 和 cxDateEdit。如果它们能在设计时正常渲染说明安装链路基本没问题。然后保存工程用文本形式打开.dfm和.pas检查引用单元是否齐整。.pas 里的 uses 部分通常长这样uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, cxGraphics, cxControls, cxLookAndFeels, cxLookAndFeelPainters, cxStyles, cxCustomData, cxFilter, cxData, cxDataStorage, cxEdit, cxNavigator, dxBar, cxGridCustomTableView, cxGridTableView, cxGridDBDataViews, cxGridLevel, cxClasses, cxGridCustomView, cxGrid, cxDateEdit;这个 uses 列表是 cxGrid 和 cxDateEdit 依赖的一个最小集合。注意看其中的cxEdit和cxCustomData——如果你在窗体上放的是一个绑定到数据集的 DB-aware 的 cxGridDBTableView这里还会多出cxDBData和cxDBLookupEditCommon等单元。我在验证时会刻意先不放数据源只验证纯展示路径数据绑定路径再单独开一个工程测。编译这个验证工程并运行程序起来后窗体上应该能看到一个完整的网格控件行高、列头、焦点框都正常绘制日期控件打开能弹出下拉日历面板。到此控件的运行期行为和设计期渲染都验证过了。4.3 处理运行时找不到 bpl 的路径配置命令行编译过了、设计器渲染也正常还有一个高频翻车点藏在运行阶段双击编译好的 exe 时报「无法找到 cxGrid.bpl」或「无法找到 dxTypes.bpl」。这个现象的原因是程序运行时需要动态加载这些 bpl但 exe 所在的目录和系统 PATH 里都没有它们。解决方式有两个我一般两个同时做。第一把D:\DevVCL\Library\Win32加入系统环境变量 PATH这样所有工程运行时都能自动找到 bpl第二在 Delphi 的工程选项 → 打包页面里把运行时包改为「使用运行时包时链接」让 exe 直接静态链接这些包——后者的代价是 exe 体积变大但部署到客户机器上就不用装一堆 bpl 了。对于内部工具类项目我大多选静态链接省去一堆交付时的依赖说明。D:\DevVCL\Library\Win32;C:\Users\某开发者\AppData\Roaming\Embarcadero\Studio\22.0\Bpl上面那行是 PATH 里需要追加的典型内容。前面是控件库的输出路径后面是 Delphi 自带的第三方包路径两个缺一不可。如果只加后面的原生日志路径而漏掉控件库路径运行时报找不到 dcl 系列包的逻辑也就不奇怪了。5. 避坑记录我在 Delphi 11 里装 DevExpress VCL 20.2.6 踩过的五个坑5.1 现象Delphi 11 识别不出设计时包装完 dcl 包后组件面板里没有出现任何新分类组件 → 安装包列表里也看不到刚添加的 bpl。原因架构不匹配。Delphi 11 默认安装的是 Win64 编译器但源码包里某些 dcl 包生成的是 32 位 bplIDE 加载 32 位包时如果是 64 位 IDE 进程它不会直接报错而是无声跳过。解决先把 IDE 的 目标平台 切换成 Win32再重新安装一遍 dcl 包然后重启 IDE。Win32 的 bpl 会被 32 位的 IDE 反复识别到。此后每次新建工程前切到 Win32 编译运行如果你实在要用 Win64 平台就让源码包在 Win64 模式下重编全部运行期包再把设计时包在 Win64 下也编一遍。5.2 现象编译到一半报缺少 dxTypes.dcu编译某个运行期包时编译器提示找不到dxTypes.dcu但这个文件在Library\Win32目录里明明存在。原因搜索目录顺序问题。IDE 编译包时它按Library列表中从上到下的顺序查找 dcu如果你的路径列表里某个旧目录也存在同名文件且排在前面编译器就会优先拿旧文件导致类型声明对不上。解决把D:\DevVCL\Library\Win32移到Library路径列表的最上方同时清理旧版本 DevExpress 留下的Library路径。这类问题最坑的地方在于报错信息极具迷惑性——不是缺文件是文件被抢先了。5.3 现象cxGrid 放上去了但 DB 连接组件消失窗体上放置好 cxGrid 后试图通过右键菜单选择数据源关联数据集时下拉列表里看不到任何可用的数据源组件。原因缺少 cxDB 系列的运行期包。cxGrid 的 DB 视图依赖cxDBData和对应的 dcl 包这个包在默认编译顺序中排在后面很多人编译时跳过了它。解决确认cxDBData.dpk已成功编译并安装对应的dclcxDBData.bpl。这个坑的诡异之处在于非 DB 视图的 cxGrid 功能完全正常只有数据绑定路径失效容易让人怀疑是数据集组件本身出了问题。5.4 现象运行起来的 exe 报找不到 xxx.bpl开发机上自己编译运行一切正常换一台部署机器双击 exe 提示找不到cxGrid.bpl。原因程序以「使用运行时包」的方式链接运行环境缺少包文件且没有配置 PATH。解决把运行方式改为「静态链接」——工程选项 → 打包页面取消勾选「使用运行时包构建」选项重新编译后 exe 会变大几百 KB但脱离 bpl 也能跑。这个坑建议在项目早期就定调给外部用户交付的程序一律静态链接只在内部开发机保留运行时包模式用 IDE 调试时热更新更快。5.5 现象授权对话框反复弹程序启动时弹出一个类似「DevExpress 试用版警告」的对话框功能不失效但很烦。原因编译时选用的源码包里没有包含有效的库管理器授权信息。DevExpress VCL 在运行时有一个全局授权检查模块如果它在注册表里找不到合法授权记录默认走试用逻辑。解决确认你拿到的源码包是带 fullsource 字样的完整版编译后运行一次dxAutoInstaller或手动在注册表里写入对应授权项。这里提醒一下授权检查和许可校验是两码事前者只是检测你有没有合法来源后者才会限制控件功能。正常 fullsource 包不需要担心后一个问题。6. 把 fullsource 用足改控件源码做自己的默认值定制既然拿到的是全源码只当正式版用就有点亏。我做模拟项目 X 时遇到一个需求公司所有界面的 cxGrid 统一用 28 像素行高、特定表头颜色不想在每个窗体创建后都用代码刷一遍。这种「全局默认值」的定制改源码是最干净的方案。先在源码目录找到 cxGrid 表格视图的单元cxGridTableView.pas查构造函数初始化那块逻辑我的做法是这样——// 在 TcxGridTableView 的构造函数里创建表列后加一个方法 procedure TcxGridTableView.CreateOptionsBehavior; begin inherited CreateOptionsBehavior; // 全局统一行高避免每个窗体重复设置 OptionsView.DataRowHeight : 28; OptionsView.HeaderHeight : 30; // 统一列头字体色配合公司视觉规范 Styles.HeaderHot.HotStyle : TcxEditStyle(False); end;关键点在于这个构造函数在控件注册时会调用一次所有引用这个包的工程在创建任何 cxGrid 表格时都会自动套用这些默认值不需要业务代码配合改。唯一要注意的是改动源文件后一定要重新编译cxGrid.dpk和dclcxGrid.bpk并把新生成的 bpl 复制到 IDE 的 bpl 目录否则你改的是源码但 IDE 加载的还是旧二进制包。另一个高价值技巧是条件编译。20.2.6 源码里大量使用{$IFDEF MSWINDOWS}、{$IFDEF VER340}这类编译器版本符号。你在源码里加自己的逻辑时也建议用条件编译包一层{$IFDEF MYCORP_CUSTOM} procedure TcxCustomGridTableView.CustomSort(ACol: TcxGridColumn); begin // 公司内私有排序逻辑覆盖默认实现 end; {$ENDIF}这个符号是在工程选项 → 条件编译里定义的好处是你的改动只在你定义的符号开启时生效将来官方升级版本时直接把增量 diff 打上去不用担心源码被改得对不上原版。从那以后我每次拿到 fullsource 控件包都会强制走一遍流程检查包结构、清理旧路径、按依赖顺序编译基座包、验证 cxGrid 与 cxDateEdit 这两个代表控件、最后确认部署机器的运行时链接方式。这套流程走完才敢把它当成生产依赖写进项目里。希望帮到你少走几条我走过的弯路。本文还有配套的精品资源点击获取
RELATED

相关推荐

DevExpress VCL 20.2.6 安装到 Delphi 11 全流程与避坑指南

DevExpress VCL 20.2.6 安装到 Delphi 11 全流程与避坑指南

简介:面向从 Delphi 10 迁往 Delphi 11 的桌面开发人员,这是 DevExpress VCL 20.2.6 控件安装包,属完整源代码版,非试用版。资源解决新版 IDE 下旧控件无法编译、安装繁琐的痛点,已实测可在 Delphi 11 中直接使用&…

📅 2026/10/17 2:53:58
网络安全视角下,为何拒绝WPE封包教学?

网络安全视角下,为何拒绝WPE封包教学?

简介:WPE封包全套.rar是一份围绕WPE抓包工具使用的资源合集,面向网络安全爱好者、游戏协议调试人员以及封包分析初学者,适合在本地搭建测试环境时对照练习。内容围绕数据包拦截、过滤、修改与重发等常见需求,包含主程序、辅助组件…

📅 2026/10/17 2:53:58
UE4集成Steam Friends API的完整实践与踩坑指南

UE4集成Steam Friends API的完整实践与踩坑指南

简介:SteamFriendsUE4 是一套面向 UE4 开发者的 Steam Friends API 集成演示工程,基于 C 实现,适合正在设计多人联机功能、需要处理好友列表与邀请机制的开发者参考学习。压缩包内共 7 个文件,以 3 个 h 头文件、3 个 cpp 源文件和…

📅 2026/10/17 2:53:58
MORE NEWS

更多资讯

📰

CyFA:绕开Delta Rule的周期特征对齐图学习训练新范式

前几天我把手头几个图学习相关的对比实验从头跑了一遍,本来只是例行复现,没想到出了个让我挺意外的结果:在不使用 Delta Rule 的情况下,我自己搭的那个叫 CyFA 的训练流程,在半监督节点分类和图分类两个标准任务上&…

📰

MCP协议实战:AI Agent如何标准化接入公司内部工具与系统

AI Agent刚冒头的时候,圈子里最流行的一句话是“Agent大模型工具”。代码一写,接口一调,模型就能查天气、算税率、搜文档,看上去很美。可真到了公司内部,你带着Agent去接CRM、ERP、库存系统,接一个哭一次&a…

📰

C++顺序表实现多项式加法的底层原理与工程价值

1. 为什么还要手写顺序表实现多项式加法?——一个被低估的底层训练价值“C顺序表实现多项式加法”,光看标题,很多人第一反应是:这不就是大一数据结构课的课后习题吗?现在连Python一行numpy.polynomial.Polynomial([1,0…

📰

AI辅助论文写作全攻略:选题、框架、文献与降重指南

说实话,每到毕业季或者职称评审季,我就总能看到一群人对着空白的Word文档发呆。论文难写,核心不在打字,而在"不知道下一步该干嘛"——选题怎么找、框架怎么搭、文献怎么梳、逻辑怎么顺,每一步都是坎。这两年…

📰

DMAD:视频音频联合生成的4步蒸馏实战解析

最近搭了个新方案,叫 DMAD,核心是把 MiniMax-H3 做蒸馏,目标步数直接压到 4 步,还能在同一段生成里同时输出视频和原生音频。做生成模型的朋友应该都知道,平时跑一次完整采样动不动就是几十步甚至上百步,视…

📰

基于MP2642GR-Z与PIC18F86J10的两串电池主动均衡方案设计与实操

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬