Delphi 11下EhLib 10.0.031安装与DBGridEh实战指南
简介EhLib 10.0.031是一套面向Delphi 11开发者的功能型组件库核心覆盖图形图像处理、多类数据库连接、报表设计、图表分析与界面增强等常见开发场景。该版本已通过Delphi 11.1.5环境安装测试适合中高级Delphi工程师和需要构建数据密集型桌面应用的企业项目组。压缩包共包含890个文件整体大小约24.63MB文件结构以pas源代码、dfm窗体描述、dpk与dproj工程文件为主同时附带chm帮助手册、doc/docx使用说明及示例数据库方便开发者在不同模块间快速定位。目前已有885人次学习下载在社区中具备一定的实用参考价值。除可直接安装的组件外资源还提供完整源码、示例项目与文档既可深入理解EhLib内部的绘制与数据绑定机制也能据此二次开发出贴合业务的自定义报表、图表和数据库控件从而有效提升Delphi项目的交付效率。1. 装上 EhLib 10.0.031 之前我在 Delphi 11 里被数据网格折磨了两周做一个进销存 Demo 的收费端时我用原生 DBGrid 展示销售明细结果滚动卡顿、列宽拖拽不顺手、合计要自己循环算导出 Excel 更是要开 ActiveX 写一堆模板。两周里项目进度卡在网格上后来看见群里有人提起 EhLib 10.0.031 for Delphi 11装上之后大部分功能变成了属性配置。这篇笔记就是把那次从安装到应用的过程拆开讲新手能按步骤走老手也能看到几个平时容易忽略的参数边界。如果你也正在被数据网格的显示、编辑、导出三件套烦着这份资源值得先花半小时验证一遍。2. 安装 EhLib 10.0.031 到 Delphi 11从解压到组件页出现的完整流程2.1 拿到资源后先检查这些文件别急着双击安装EhLib 压缩包解压后第一件事不是找 install.exe而是先看目录结构。一个合格安装包里通常能看到这些内容目录/文件用途需要核对的点带 11 标识的 .dpk/.dproj对应 Delphi 11 的包工程包名里有没有 11 或 110 之类标识不能拿旧版本强装Source 目录运行时源码后续 Library Path 需要指到这儿Bin/Precompiled预编译的 .bpl/.dcu能用能省时间但建议还是自己编译一遍Help 目录在线帮助文档注册到 IDE 帮助后使用更方便不是必需Demo 目录示例工程安装完先打开一个 Demo能快速确认功能我一般会先在命令行里扫一遍 dpk 文件确认有没有对应 Delphi 11 的包。用 PowerShell 或 Git Bash 都可以find . -iname *.dpk | grep -i 11如果输出为空说明压缩包内没有对应版本或者文件名被改过。这个时候停下来检查是不是拿错了旧版资源不要硬把 Delphi 10.4 的包往 Delphi 11 的 IDE 里装否则编译会一屏红色错误。这个命令只做了检索没有任何副作用。接着检查路径整个解压路径不要带中文、空格和括号。我一般直接放到C:\Components\EhLib-10.0.031免得后面配置 Library Path 时出现玄学问题。路径问题很隐蔽等你配完环境变量仍然报找不到时才会意识到是这个坑。2.2 按顺序编译和安装运行时包再安装设计时包EhLib 的包逻辑和大多数 VCL 组件库一样先有运行时包runtime package提供 .bpl/.dcu再安装设计时包designtime package负责把组件注册到 IDE 的工具面板上。顺序反了设计时包编译会直接提示找不到运行时单元。打开 Delphi 11用 File Open Project 打开压缩包里的包组文件通常是 .dpk、.dproj 或 .groupproj。我一般先编译运行时包再编译安装设计时包。在 Project Manager 里右键对应项目先 Build 一次再 Install。如果一次打开的是包组需要看清楚哪些是运行时包、哪些是设计时包。运行时包编译结果是一个带版本号的 .bpl 文件设计时包编译结果会注册到 IDE。看到 “Package ... installed” 的提示才算注册成功。有些环境会弹确认框点确认后立即生效。这套流程有个隐性要求编译过程中最好不要开杀毒软件的实时监控否则生成的 .dcu 可能被锁成只读导致下一次 Build 失败。不是让你永久关闭是编译时暂停一下编译完再开。2.3 配置 Delphi 11 的库路径Library Path组件面板里能看到 EhLib 页不代表你的工程能编译。直接在 Uses 里写 DBGridEh 保存时会报 File not found原因往往是 IDE 的 Library Path 没有加 Source 目录。打开 Options Environment Options Delphi Options Library Library Path把解压目录里的 Source 相关目录添加进去。具体加几个路径取决于包的目录设计。我常用的最小集合路径说明C:\Components\EhLib-10.0.031\Source主要源码C:\Components\EhLib-10.0.031\Source\Common公共工具类可能被引用C:\Components\EhLib-10.0.031\Source\DB与数据集、数据库相关的单元添加时注意 Delphi 11 的 32 位和 64 位平台路径是分开设置的建议都加上否则后面切换目标平台时又会报找不到单元。这里的路径不带引号不用通配符直接写目录根到源码目录即可。2.4 验证安装新建一个空白工程拖一个 TDBGridEh安装完成后新建一个 VCL 工程在组件面板上找到 EhLib 页面把 TDBGridEh 拖到窗体上。同时放一个 TDataSource、一个 TButton按钮的 OnClick 里写这样一段最小代码procedure TForm1.Button1Click(Sender: TObject); var MemDS: TMemTableEh; GridDS: TDataSource; begin MemDS : TMemTableEh.Create(Self); MemDS.FieldDefs.Add(ID, ftInteger); MemDS.FieldDefs.Add(Name, ftString, 30); MemDS.Active : True; MemDS.AppendRecord([1, EhLib OK]); GridDS : TDataSource.Create(Self); GridDS.DataSet : MemDS; DBGridEh1.DataSource : GridDS; DBGridEh1.Columns.Clear; DBGridEh1.Columns.Add.FieldName : ID; DBGridEh1.Columns.Add.FieldName : Name; end;这里 TMemTableEh 是 EhLib 自带的临时内存表不需要接数据库适合做安装验证。TFieldDefs 定义临时表字段AppendRecord 写入一行测试数据然后通过 DataSource 交给 DBGridEh。如果运行后网格里出现两列且有一行数据说明运行时包、设计时包和 Library Path 全部生效了。如果 TMemTableEh 没有出现在 IDE 列表里可以先改用 TClientDataSet 代替逻辑一致但最好回头确认一下组件安装步骤是不是漏了某个设计时包。验证通过后安装阶段就算正式收工。3. 用好 DBGridEh 的核心功能列管理、下拉、导出与取数选型3.1 动态列配置用代码控制标题、宽度与对齐网格的列定义不建议在设计器里一列一列手工敲尤其是字段多、表头要中文、列宽要统一的场景。我习惯在 FormCreate 里调用一个 SetupGrid 方法把列属性集中管理procedure TForm1.SetupGrid; var aCol: TColumnEh; begin DBGridEh1.Columns.Clear; aCol : DBGridEh1.Columns.Add; aCol.FieldName : OrderNo; aCol.Title.Caption : 订单编号; aCol.Width : 120; aCol.Alignment : taCenter; aCol : DBGridEh1.Columns.Add; aCol.FieldName : Amount; aCol.Title.Caption : 金额; aCol.Width : 100; aCol.DisplayFormat : #,##0.00; end;TColumnEh 的关键属性FieldName 绑定的是 TDataSet 的字段名不是中文显示名Title.Caption 才是表头真正显示的内容Width 单位是像素120 对常见单据算比较安全。DisplayFormat 只在显示时格式化不改变原始值所以导出时不会带上格式需要记住这一点。如果字段非常多双击组件打开 Columns Editor勾选自动生成列再调整顺序。但自动生成列只适合做纯展示原型。进入正式开发后建议用代码生成列把中文字段名统一写在代码里以后改表头直接搜字符串就行不用每个设计器文件翻一遍。3.2 下拉列表和值列表给单元格塞选项但不破坏数据下拉功能在 DBGridEh 里不是普通 ComboBox而是编辑状态下的下拉框和按钮。常用做法是给某一列设置 EditButtons然后弹一个自建列表。代码大致长这样aCol : DBGridEh1.Columns.Add; aCol.FieldName : Status; aCol.Title.Caption : 状态; aCol.EditButtons.Add; aCol.EditButtons[0].Style : ebsEllipsisEh; aCol.EditButtons[0].OnEditButtonClick : StatusEditButtonClick;然后在事件里弹出一个多列列表或一句 MessageBox用户确认后把值写回字段。这种做法比直接绑定 TComboBox 更灵活适合“审核”这类需要二次确认的操作。如果只是“启用/停用”这种两三个值直接在列属性里用 DropDownList 的 Items 填好不需要写事件。这里有个容易翻车的地方下拉选中的值会直接写进数据集的当前行如果你在 OnColumnEhGetCellParams 里做了条件颜色当前行刷新不及时颜色可能不立刻更新。我一般在下拉事件结束后主动调用 DBGridEh.Refresh 一次省得排查半天。3.3 一键导出 Excel / HTML / CSVDBGridEh 自带导出方法不需要第三方导出控件。我常用的是 SaveToXlsxuses DBGridEhImpExp; procedure TForm1.ExportBtnClick(Sender: TObject); begin DBGridEh1.SaveToXlsx(c:\temp\grid_data.xlsx, True); end;第二个参数是“是否保存列宽、字体、合并单元格等显示属性”。希望导出的 Excel 打开后和网格一致就传 True只要纯净数据表就传 False。这里有个实际坑导出前网格里的合计行和筛选图标会自动带进 Excel。如果报表不需要这些需要在导出前把 FooterRowCount 临时设成 0导出完再恢复。类似处理也适用于 SaveToHtml 和 SaveToCsv。3.4 取数选型TClientDataSet、TMemTableEh 还是直接绑数据库同一个网格可以配多种数据集。我的选型参考取数方式典型场景优点注意点TClientDataSet传统单机或 C/S 系统内建排序过滤能力稳定需要管理 Provider内存占用略高TMemTableEh临时明细、报表计算不需要额外配置字段通用接口不如 CDS 丰富FireDAC 数据集生产环境数据库高性能支持多数据库连接参数独立管理不是 EhLib 特有我个人的分界线是能落库的查询结果进 TClientDataSet网格绑定它临时拼凑的一组数据扔到 TMemTableEh。TMemTableEh 对字段类型的控制比 CDS 弱一些日期显示格式最好在列属性里显式指定否则可能出现默认格式不符合业务的情况。网格和数据集结合时过滤、排序、合计大多直接调用数据集方法所以选哪种数据源与 DBGridEh 本身没有强绑定。但 TMemTableEh 能减少依赖适合在安装验证和原型阶段使用。4. 避坑EhLib 10.0.031 在 Delphi 11 下的常见问题排查记录4.1 编译时提示“找不到单位”或“File not found”现象新建工程后编译提示 File not found: DBGridEh.dcu 或 Unknown namespace。原因Library Path 没有正确指向 EhLib 的 Source 目录或者路径里有中文、空格IDE 解析时被截断。解决回到 Options Library Path检查路径是否与解压目录完全一致注意 32 位和 64 位平台分别配置。如果路径确实正确把 IDE 完全关掉再重开让环境变量重新加载。路径带空格时要么改用 8.3 短路径要么干脆把目录放到盘符根目录省得反复踩坑。4.2 安装包时提示“Cannot load package”或找不到依赖包现象在 Component Install Packages 里能看到 EhLib 项但勾选后提示“无法加载包”错误信息中常出现某个 .bpl 未找到。原因运行时包没有先编译或者设计时包依赖的另一个运行时包没有安装到 IDE 的 BPL 目录。解决用包组文件一次编译所有运行时包确认每个 Build 都成功再单独 Install 设计时包。如果库里有多个运行时包注意它们之间的依赖顺序比如先装基础包再装数据库扩展包。不要去 IDE 里手动勾选未编译的包这只会让 IDE 启动时报新错。4.3 中文显示乱码列头排序不对现象DBGridEh 中中文变成“锟斤拷”一类乱码或者中文排序排在数字后面。原因字符集设置不统一。表头字体没有指定中文字体或者数据库连接字符串没有声明 UTF-8排序问题通常是因为字段类型被识别为 AnsiString。解决把字体设置为“宋体 9pt”或“微软雅黑 9pt”同时确认数据源的字符串字段不是 ftAnsiString。数据库连接串里显式写明 charsetutf8mb4 或对应语系代码。中文排序建议在 SQL 里用 order by 和排序规则处理不要依赖网格默认排序默认排序容易整出玄学。4.4 IDE 启动变慢组件面板出现两个 EhLib 页现象装完 EhLib 后 Delphi 11 启动变慢面板里有两个 EhLib 页拖组件时提示重复注册。原因之前装过其他版本旧的设计时包还留在 IDE 的已安装包里两个包同时加载。解决在 IDE 的 Installed Packages 里禁用旧版本并删除项目中残留的 .bpl/.dcp 文件。如果实在找不到旧包来源用“把当前解压目录复制到新目录、再重新编译安装”的方式替换不要手动去注册表删条目容易把 IDE 环境搞坏。我一般先移除所有 EhLib 相关包重启 IDE再安装新版这个方法最干净。4.5 运行期网格滚动慢卡顿明显现象记录只有几千条但滚动时明显掉帧CPU 占用高。原因可能是列太多且每个列都触发了重绘事件尤其 OnColumnEhGetCellParams 里做了大量字段访问也可能是列宽在运行期被频繁修改每次都触发重新布局。解决取消不必要的列重绘事件把列宽在设计期定好运行期不要用 AutoFitColWidth 反复算数据量大时关闭网格的动画效果并减少隐藏列数量。如果一定要根据数据动态调列宽只对少数关键列做不要对全部列循环更新。这些坑基本都是实际交接维护里最容易遇到的。遇到问题先按现象定位到具体环节不要直接卸载重装那会浪费更多时间。5. 进阶技巧用合计行和列布局把报表任务一起消化DBGridEh 的合计行功能其实可以当轻量报表用省掉单独画报表模板的力气。先把网格的 FooterRowCount 设为 1底部就会出现一个合计行然后在 OnGetFooterParams 事件里写合计逻辑procedure TForm1.DBGridEh1GetFooterParams(Sender: TCustomDBGridEh; DataRow: TGridDataRowEh; var Params: TColCellParamsEh); begin if DataRow nil then Exit; if Params.Column.FieldName Amount then begin Params.Value : FormatFloat(#,##0.00, GetAmountTotal); end; Params.TextAlignment : taRightJustify; Params.Color : clInfoBk; end;GetAmountTotal 里可以写一个 SUM 查询也可以在 TClientDataSet 上建聚合字段。注意 OnGetFooterParams 会对每一列都触发必须先判断 FieldName否则空白列也会显示一个聚合结果。合计行的背景色改成了浅黄色打印时一眼能看出区别。另一个常用功能是保存和恢复列布局。用户调整过列宽和列顺序后下次打开窗口应该保持住否则每次都要重拖。我习惯用 IniFile 保存列顺序和宽度uses IniFiles; procedure TForm1.SaveGridLayout(AGrid: TDBGridEh); var Ini: TIniFile; i: Integer; begin Ini : TIniFile.Create(ChangeFileExt(Application.ExeName, .ini)); try for i : 0 to AGrid.Columns.Count - 1 do begin Ini.WriteString(GridLayout, Format(Col%d.Field, [i]), AGrid.Columns[i].FieldName); Ini.WriteString(GridLayout, Format(Col%d.Width, [i]), AGrid.Columns[i].Width.ToString); end; finally Ini.Free; end; end;读取时反向遍历把对应 FieldName 的列找到并恢复宽度。这个方式比自带布局管理器更轻量适合单机版程序。列布局保存是用户满意度很高的小功能很多人忍不了每次打开都重新调列宽。关于导出问题合并技巧是导出前先把 FooterRowCount 临时设成 0导完再恢复这样 Excel 里不会出现合计行数据表更干净。如果想要带合计行一起导出保持 1 就好但要把合计行背景色关掉避免 Excel 出现灰底格。我之前在模拟项目X里就是因为没做布局保存客户每次远程桌面重开都要重新拖列宽后来加了这个 IniFile 方案一次解决。从那以后我每次发布带 DBGridEh 的程序都强制检查三件事版本包是否匹配 IDE、Library Path 是否配好、列布局有没有保存。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

DES加解密算法详解:从Feistel结构到密钥调度实现避坑指南

DES加解密算法详解:从Feistel结构到密钥调度实现避坑指南

简介:面向密码学课程学习者的DES加解密算法实现资料,适合正在完成加密实验、需要对照源码与实验报告撰写思路的高校学生。压缩包共34个文件,约1.87MB,主体为C工程文件(cpp/h/dsp)及可执行程序,另…

2026/10/18 3:53:22 阅读更多 →
从部署到实战:DeskcommCRM如何重塑销售管理工作流

从部署到实战:DeskcommCRM如何重塑销售管理工作流

做销售管理这几年,我先后折腾过在线表格、云CRM、甚至自己用共享文档搭过的“伪系统”,最后都败在了同一个问题上:录入麻烦、信息分散、跟进靠脑补。直到后来在一个项目里实际把 DeskcommCRM 从头部署到日常使用,我才意识到&#…

2026/10/18 3:53:22 阅读更多 →
Play Integrity Fix 教程:4步安装通过设备完整性检测

Play Integrity Fix 教程:4步安装通过设备完整性检测

Play Integrity Fix 教程:4步安装通过设备完整性检测 【免费下载链接】PlayIntegrityFix Fix Play Integrity (and SafetyNet) verdicts. 项目地址: https://gitcode.com/GitHub_Trending/pl/PlayIntegrityFix 打开银行App或流媒体服务时看到"设备未认证…

2026/10/18 3:53:22 阅读更多 →

最新新闻

主从博弈下综合能源微网需求响应优化调度模型全解析

主从博弈下综合能源微网需求响应优化调度模型全解析

第一次看到“基于主从博弈的综合能源微网需求响应优化调度模型”这个题目,很多人会把它当成一个普通的优化调度问题来读:目标函数、约束条件、求解器一跑,出结果就完事了。但我实际调过这类模型之后发现,真正难的不是数学工具&…

2026/10/18 4:40:33 阅读更多 →
PyTorch Unet图像分割实战:DUT-OMRON数据集端到端训练与推理

PyTorch Unet图像分割实战:DUT-OMRON数据集端到端训练与推理

简介:本资源是一套面向深度学习初学者与图像分割实践者的Unet多尺度分割实战项目,聚焦二值图像分割任务,特别适用于学术研究、课程设计及算法复现场景。资源包含完整的DUT-OMRON数据集(训练集4135对images/masks、测试集1033对&am…

2026/10/18 4:40:33 阅读更多 →
信创监控实战:国产数据库与中间件指标采集及告警体系设计

信创监控实战:国产数据库与中间件指标采集及告警体系设计

1. 信创监控的痛点与整体架构设计1.1 为什么信创环境的监控不能照搬旧方案之前负责的某业务系统做信创替换,数据库从国外商业数据库换成某国产关系型数据库,中间件也换成了国产Web中间件。系统切过去第一天,监控大屏上将近一半的指标直接变成…

2026/10/18 4:40:33 阅读更多 →
推荐系统离线评估指标详解:准确率、召回率、F1与NDCG

推荐系统离线评估指标详解:准确率、召回率、F1与NDCG

做推荐系统,迟早要面对一个问题:我怎么量化推荐质量。业务方问一句“这次模型效果到底提升了没”,如果只丢出一句“感觉差不多”,那接下来的优化根本没法推进。准确率、召回率、F1、NDCG,这四个词就是推荐系统离线评估…

2026/10/18 4:40:33 阅读更多 →
schooldb代码实战:MySQL学生选课系统数据库设计全解析

schooldb代码实战:MySQL学生选课系统数据库设计全解析

搜“schooldb代码”的人,十有八九都是同一类需求:要么是数据库课设不知道从哪下手,要么是公司里突然要接一个校园管理相关的数据层,想找个偏教学向、能直接跑的库来抄作业。这个方向我帮不少人做过参考,也接过不少来问…

2026/10/18 4:40:33 阅读更多 →
学习打卡功能开发实战:从表结构设计到线上踩坑全记录

学习打卡功能开发实战:从表结构设计到线上踩坑全记录

前段时间接了一个学习类App的项目,需求池里躺着一个编号3.10的任务,名字就四个字:学习打卡。当时团队里不少人都觉得,这不就是给用户一个按钮,每天点一下签个到吗?结果真进入开发阶段才发现,这个…

2026/10/18 4:39:33 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/16 14:23:36 阅读更多 →