QuickReport for Delphi2010:老报表控件迁移与Unicode适配实战
简介QuickReport for Delphi 2010 是一套面向 Delphi 2010 开发者的报表组件安装包适合需要在 VCL 或 FireMonkey 项目中快速构建复杂报表的中初级程序员。它解决的是报表设计繁琐、打印与导出格式单一的问题支持多列布局、图形表格、条形码、自定义计算公式并能绑定 TDataSet、TDataSource 等多种数据源提供实时预览与 PDF、HTML、Excel 导出能力。压缩包共 263 个文件约 4.74MB以 pas 源码、dcu 编译单元、hpp 头文件、dfm 窗体资源为主另含 bpl 运行包、dcp 编译包、dpk 安装包及少量示例与说明文档覆盖组件注册、IDE 集成与示例工程所需的核心文件。已有 314 人学习下载可帮助读者完成组件安装、理解报表控件属性与事件并借助示例工程快速上手实际项目中的报表设计与打印需求。1. QuickReport for Delphi2010老控件在新IDE里的最后一公里如果你手里有一个 Delphi 7 时代的老项目报表模块用的是 QuickReport现在要把整个工程迁到 Delphi 2010大概率会遇到一个很尴尬的局面代码能编译但报表预览一片空白或者设计器里根本拖不出 QR 控件。QuickReport for Delphi2010 说的就是这件事——让这套经典的报表控件在 Unicode 化的新 IDE 里重新跑起来。它解决的不是“报表怎么做”的问题而是“老报表资产怎么活下来”的问题。适合两类人一是维护存量 Delphi 项目的工程师二是需要把老报表逻辑逐步迁移到新架构、但短期内不能推倒重来的团队。这一章先把边界划清楚后面再动手。QuickReport 的核心价值在于它的 band 式布局模型Title、ColumnHeader、Detail、Summary 这些 band 按顺序堆叠配合 QRDBText、QRExpr、QRMemo 等控件能快速拼出一张数据库驱动的报表。Delphi 2010 的变化在于字符串全面 Unicode 化VCL 的 TStrings、AnsiString 到 UnicodeString 的转换以及包引用机制对编译期和运行期的要求更严格。老版本的 QuickReport 包如果直接拿来装最常见的结果是“装上了但用不了”——设计期能看到控件运行期报错或者反过来。所以这一章的核心结论是QuickReport for Delphi2010 不是简单装个包而是要同时处理包编译、字符集、数据源绑定这三层问题。下面从选型开始拆。2. 选型与包结构为什么不能直接拿 Delphi7 的包来装2.1 先确认你手里的是哪一类 QuickReport 资产老项目里的 QuickReport 通常有三种形态第一种是源码包带 .dpk 和大量 .pas这种最灵活可以重新编译第二种是已编译的 .bpl 加 .dcu这种最麻烦因为 Delphi 2010 的编译器版本和运行时包结构跟老版本不兼容第三种是只引用了 QuickReport 的单元但没带包这种需要先补齐源码。判断方法很简单打开工程文件看 requires 段和 contains 段如果 contains 里有 QuickRpt、QRPrntr、QRDBText 这类单元说明源码在工程目录或搜索路径里如果只有 requires 里的 rtl、vcl那说明报表控件是以包形式引用的。我一般会先做一件事把老工程里所有跟 QuickReport 相关的 .pas 文件单独拷到一个干净目录按单元名建子目录然后用文本编辑器批量检查文件头部的 unit 声明和 interface 段。这一步的目的是确认哪些单元是 QuickReport 自带的哪些是项目自己扩展的。项目自己扩展的单元往往引用了老版本的私有字段或方法这些在重新编译时最容易翻车。2.2 包编译的依赖顺序与常见报错QuickReport 的源码包通常拆成几个 .dpk核心运行包、设计期包、数据感知包。编译顺序必须是先运行包再数据感知包最后设计期包。如果顺序错了典型报错是“Unit QRPrntr was compiled with a different version of QRBase”。这个报错的本质是 .dcu 的版本标记不一致Delphi 2010 对单元版本校验比老版本严格。下面是一个最小化的包编译脚本示例用命令行方式编译避免 IDE 里手动点来点去导致缓存污染# 清理旧编译产物避免版本标记冲突 del /s /q *.dcu del /s /q *.bpl del /s /q *.dcp # 按依赖顺序编译-B 强制重新编译所有单元 dcc32 -B -Q -W -H -LUrtl;vcl;vclx;vclimg QuickRpt.dpk dcc32 -B -Q -W -H -LUrtl;vcl;vclx;vclimg;QuickRpt QRDBRpt.dpk dcc32 -B -Q -W -H -LUrtl;vcl;vclx;vclimg;QuickRpt;QRDBRpt dclQuickRpt.dpk这段脚本的关键参数说明-B表示强制重新编译不信任已有 .dcu-Q静默模式减少输出干扰-W输出警告Unicode 转换的隐患往往藏在警告里-H生成 .hpp 头文件如果项目里有 C Builder 混合编译会用到-LU指定运行时包列表必须包含 rtl、vcl、vclx、vclimg缺一个都会导致链接失败。编译完运行包后先别急着装设计期包用一个小测试工程引用 QuickRpt 单元放一个 TQuickRep 在窗体上编译运行看是否报错。这一步能提前暴露字符集问题。2.3 Unicode 化对 QuickReport 的实际影响Delphi 2010 的 string 默认是 UnicodeString而老 QuickReport 源码里大量使用 AnsiString、PChar、ShortString。直接重新编译时编译器会给出大量 W1057、W1058 警告这些警告不能忽略因为其中一部分会导致运行期乱码或截断。常见做法是在包编译选项里开启{$H}让 string 默认变成 UnicodeString然后逐个单元检查字符串赋值和类型转换。重点检查三类代码第一类是 QRExpr 的表达式解析里面可能有 PChar 指针运算第二类是 QRPrntr 里的打印输出涉及 GetMem 和 Move 操作第三类是 QRDBText 的数据绑定涉及 TField.AsString 的赋值。我一般会先全局搜索AnsiString、PChar、ShortString这三个关键词把能替换的替换成 string不能替换的加显式类型转换。这一步做完再编译一次警告数量应该下降一半以上。3. 最小可运行工程从空窗体到能预览的报表3.1 建立测试工程与数据源准备不要一上来就改老项目先建一个全新的 VCL Forms Application只放一个 TQuickRep、一个 TQRDBText、一个 TDataSource、一个 TClientDataSet。ClientDataSet 用代码建表避免依赖外部数据库。这样做的目的是把 QuickReport 本身的问题和数据库驱动的问题隔离开。// 在 FormCreate 里动态建表模拟一个最简单的数据集 procedure TForm1.FormCreate(Sender: TObject); begin ClientDataSet1.FieldDefs.Clear; ClientDataSet1.FieldDefs.Add(ID, ftInteger); ClientDataSet1.FieldDefs.Add(Name, ftString, 50); ClientDataSet1.FieldDefs.Add(Amount, ftFloat); ClientDataSet1.CreateDataSet; ClientDataSet1.Open; ClientDataSet1.Append; ClientDataSet1.FieldByName(ID).AsInteger : 1; ClientDataSet1.FieldByName(Name).AsString : 测试项目A; ClientDataSet1.FieldByName(Amount).AsFloat : 1234.56; ClientDataSet1.Post; DataSource1.DataSet : ClientDataSet1; QRDBText1.DataSet : DataSource1; QRDBText1.DataField : Name; QuickRep1.DataSet : DataSource1; end;这段代码的逻辑说明FieldDefs 定义字段结构CreateDataSet 在内存里建表Append/Post 插入一条测试数据。关键参数是 ftString 的宽度 50这个宽度会影响 QRDBText 的 AutoSize 行为。如果宽度设得太小预览时文字会被截断但设计期看不出来。QRDBText 的 DataField 必须跟 FieldDefs 里的名字完全一致大小写敏感。QuickRep1.DataSet 指向 DataSource1这样报表的 Detail band 才能自动展开。3.2 用代码控制 band 的可见性与分页QuickReport 的 band 默认行为是Title 只显示一次ColumnHeader 每页显示Detail 每条记录显示Summary 最后显示。但实际项目里经常需要根据数据量动态控制分页比如每页固定 20 行或者当 Amount 超过阈值时强制换页。这些逻辑不能只靠设计器必须写代码。// 在 DetailBand 的 BeforePrint 事件里控制分页 procedure TForm1.DetailBandBeforePrint(Sender: TQRCustomBand; var PrintBand: Boolean); begin // 每 20 条记录强制换页 if (QuickRep1.DataSet.RecNo mod 20) 0 then QuickRep1.NewPage; // 当 Amount 超过 10000 时用红色加粗提示 if ClientDataSet1.FieldByName(Amount).AsFloat 10000 then begin QRDBText2.Font.Color : clRed; QRDBText2.Font.Style : [fsBold]; end else begin QRDBText2.Font.Color : clBlack; QRDBText2.Font.Style : []; end; end;逻辑说明RecNo 是数据集当前记录号mod 20 判断是否到了分页点。NewPage 方法会强制结束当前页并开始新页但要注意调用时机——必须在 BeforePrint 里调用在 AfterPrint 里调用会导致空白页。字体颜色的动态修改只影响当前记录的打印不会污染后续记录因为每次 BeforePrint 都会重新设置。这里有个坑如果 QRDBText2 的 AutoSize 为 True修改字体样式后宽度不会自动调整需要手动调用 AdjustSize 或者在设计期留足宽度。3.3 预览与打印的路径差异QuickReport 的预览和打印走的是两条不同的代码路径。预览用的是 TQRPreview 控件打印用的是 TQRPrntr 单元里的打印机接口。这两条路径在 Delphi 2010 下的表现差异主要体现在字体映射和页边距计算上。常见问题是预览正常打印出来字体变小或页边距不对。原因通常是打印机驱动返回的 DPI 跟屏幕 DPI 不一致而 QuickReport 的 Units 属性默认是 mm转换时用了整数除法导致精度丢失。解决办法是在 QuickRep1 的 BeforePrint 事件里根据 Printer 对象动态调整 Unitsprocedure TForm1.QuickRep1BeforePrint(Sender: TCustomQuickRep; var PrintReport: Boolean); begin // 根据打印机 DPI 动态设置单位减少预览与打印的差异 if Printer.PrinterIndex 0 then begin QuickRep1.Units : mm; QuickRep1.PageSize : A4; // 左右边距各留 15mm上下各留 20mm QuickRep1.Margins.Left : 15; QuickRep1.Margins.Right : 15; QuickRep1.Margins.Top : 20; QuickRep1.Margins.Bottom : 20; end; end;参数说明Units 设为 mm 后Margins 的单位也是 mm。A4 的尺寸是 210x297mm减去左右边距 30mm实际可打印宽度是 180mm。如果报表里有固定宽度的列总宽度不能超过这个值否则会被截断。Printer.PrinterIndex 判断是否有可用打印机在没有打印机的环境下比如服务器端生成 PDF需要走另外的分支。4. 避坑与排查QuickReport 在 Delphi2010 下的五个血泪经验4.1 设计期控件能拖但运行期报“Class not found”现象IDE 里能正常拖放 QR 控件编译也能过但运行时报“Class TQuickRep not found”或“Error reading QuickRep1.DataSet”。原因通常是设计期包和运行期包的版本不一致或者 .bpl 的搜索路径没配好。Delphi 2010 对包的加载顺序有要求运行期包必须在设计期包之前加载。解决方法是检查“Project Options - Packages”里的 Runtime Packages 列表确保 QuickRpt 和 QRDBRpt 在 dclQuickRpt 之前。另外如果用了动态包加载需要在代码里显式调用 LoadPackage。4.2 中文显示为问号或方块现象预览时中文全部变成问号英文和数字正常。原因是老 QuickReport 源码里的字体设置用了 AnsiString 版本的 Font.NameUnicode 化之后没有正确转换。解决方法是全局搜索Font.Name :和Font.Charset :把 Charset 设为 DEFAULT_CHARSETName 设为 宋体 或 微软雅黑。如果还是不行检查 QRPrntr 单元里的 TextOut 调用老版本可能用了 TextOutA需要改成 TextOutW。4.3 数据量大时预览卡死现象数据集超过 5000 条时点预览要等十几秒甚至卡死。原因是 QuickReport 默认会一次性把所有记录渲染到预览缓存里。解决方法是启用增量渲染在 QuickRep1 的 BeforePrint 里设置QuickRep1.ShowProgress : True并在 DetailBand 的 BeforePrint 里定期调用Application.ProcessMessages。更彻底的做法是分页查询每次只取一页的数据用 NewPage 手动控制。4.4 QRExpr 表达式在 Unicode 下计算错误现象QRExpr 里的表达式比如SUM(Amount)结果不对或者字符串拼接出现乱码。原因是表达式解析器内部用了 PChar 遍历Unicode 字符占两个字节指针偏移算错。解决方法是把 QRExpr 的表达式改成用字段变量而不是字符串常量或者升级到支持 Unicode 的 QuickReport 版本。如果必须用老版本可以在表达式里避免中文把中文放到 QRDBText 里显示。4.5 编译通过但链接报“Unresolved external”现象包编译全部通过但工程链接时报“Unresolved external QRPrntr::...”。原因是运行期包的 .dcp 文件没有生成或者路径不对。Delphi 2010 链接时需要 .dcp 来解析符号。解决方法是确认编译运行包时加了-LU参数并且 .dcp 输出目录在工程的搜索路径里。如果用的是 IDE 编译检查“Project Options - Delphi Compiler - Output - C/C”里的 .dcp 输出路径。5. 进阶技巧把 QuickReport 报表导出为 PDF 并做批量验证5.1 用 TQRPDFFilter 做无打印机导出QuickReport 本身不带 PDF 导出但可以通过 TQRPDFFilter 组件实现。这个组件在 QRExport 单元里需要单独编译。用法是在 QuickRep1 的 BeforePrint 里挂上 Filter然后调用 ExportToFilter。关键点是设置 PDF 的页面尺寸和字体嵌入否则中文会变成乱码。// 导出 PDF 的最小代码 procedure TForm1.ExportToPDF(const AFileName: string); var PDFFilter: TQRPDFFilter; begin PDFFilter : TQRPDFFilter.Create(Self); try PDFFilter.Filename : AFileName; PDFFilter.PageSize : A4; PDFFilter.EmbedFonts : True; // 必须嵌入字体否则中文乱码 PDFFilter.Compression : True; // 压缩图片减小文件体积 QuickRep1.ExportToFilter(PDFFilter); finally PDFFilter.Free; end; end;参数说明EmbedFonts 设为 True 后PDF 文件会变大但能保证在任何机器上显示一致。Compression 对包含图片的报表效果明显纯文字报表可以关掉。ExportToFilter 会触发一次完整的报表渲染所以如果报表数据量大导出时间跟预览时间差不多。5.2 批量验证用脚本检查导出的 PDF 页数和关键字导出 PDF 之后怎么确认每张报表都正确我一般会写一个简单的 Python 脚本用 PyPDF2 检查页数和关键字。这个脚本不依赖 Delphi可以放在 CI 里跑。# 批量检查 PDF 报表的页数和关键字 import os from PyPDF2 import PdfReader def check_pdf(filepath, expected_pages, keywords): reader PdfReader(filepath) actual_pages len(reader.pages) if actual_pages ! expected_pages: print(f[FAIL] {filepath} 页数不对: 期望 {expected_pages}, 实际 {actual_pages}) return False text for page in reader.pages: text page.extract_text() for kw in keywords: if kw not in text: print(f[FAIL] {filepath} 缺少关键字: {kw}) return False print(f[OK] {filepath}) return True # 遍历目录下所有 PDF检查页数和关键字 for f in os.listdir(./reports): if f.endswith(.pdf): check_pdf(os.path.join(./reports, f), 3, [测试项目A, 1234.56])逻辑说明expected_pages 根据报表模板的固定页数设定keywords 是必须出现的字段值。extract_text 对中文的支持取决于 PDF 的字体嵌入方式如果 EmbedFonts 没开提取出来可能是乱码。这个脚本的价值在于每次修改报表模板后跑一遍就能发现分页错乱或字段丢失比人工点预览快得多。5.3 一个我踩过的坑Units 属性在导出时的副作用最后说一个我自己的教训。有一次批量导出 PDF发现所有报表的页边距都比预览时小了 2mm。查了半天原因是导出时 QuickRep1.Units 被设成了 mm但 PDFFilter 内部又做了一次像素转换两次转换的舍入方向不一致。解决办法是在导出前把 Units 设成 Pixel导出后再改回 mm。这个坑没有文档写只能靠对比预览和导出的实际输出发现。所以我的习惯是任何涉及单位转换的报表导出后必须用脚本量一下页边距别信肉眼。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Apple Configurator 2批量交付苹果设备:Blueprint与监督模式指南

Apple Configurator 2批量交付苹果设备:Blueprint与监督模式指南

简介:Apple Configurator 2 是苹果官方推出的 macOS 设备管理工具,面向需要批量部署和维护苹果设备的企业、学校或 IT 管理员,用于配置、更新和管理 iOS、iPadOS、tvOS 及 watchOS 设备,特别适合网络受限或不便登录 App Store 的场…

2026/10/13 13:36:17 阅读更多 →
Spring MVC @ResponseBody 注解:底层原理、常见坑与最佳实践

Spring MVC @ResponseBody 注解:底层原理、常见坑与最佳实践

先问大家一个场景:你是不是也做过这样的事——Controller方法上写了ResponseBody,接口就通了,JSON正常返回,前端拿到数据美滋滋;可要是哪次忘了加,要么返回一长串不知所云的HTML,要么直接报错说…

2026/10/13 13:36:17 阅读更多 →
机器学习入门四大实战项目:手写数字识别、声呐分类、垃圾短信识别与鸢尾花分类

机器学习入门四大实战项目:手写数字识别、声呐分类、垃圾短信识别与鸢尾花分类

简介:这份资源面向零基础或刚接触机器学习的小白学习者,围绕四个经典入门项目展开:手写数字识别、声呐目标分类、垃圾短信识别与鸢尾花分类,帮助读者在动手实践中理解分类任务的完整流程与常见算法思路。压缩包共13个文件&#xf…

2026/10/13 13:35:16 阅读更多 →

最新新闻

SPWM三相六路互补输出与调频调压:死区、载波比与V/F控制详解

SPWM三相六路互补输出与调频调压:死区、载波比与V/F控制详解

简介:面向STM32F103C8T6三相电机驱动与变频控制场景,该资源提供基于高级定时器TIM1查表法生成三相六路互补SPWM的完整工程。代码生成相位互差120的六路PWM,可配置死区时间,并通过恒压频比策略实现调频调压,适用于逆变器…

2026/10/13 14:23:19 阅读更多 →
西门子S7-1200 PLC机器人码垛与AGV调度系统实战解析

西门子S7-1200 PLC机器人码垛与AGV调度系统实战解析

先交代一下背景。这套项目是某食品企业码垛工段的自动化改造,原来的方案是人工作业加一台老旧机械臂,产能跟不上、垛形不稳定,客户一口气提了三个需求:自动码垛、空满垛转运、AGV自动接驳。设备清单下来的时候列的是两台西门子S7-…

2026/10/13 14:23:19 阅读更多 →
健康管理系统PRD拆解:从角色权限到数据字段的落地指南

健康管理系统PRD拆解:从角色权限到数据字段的落地指南

简介:《传智健康PRD文档1》是一份面向健康管理系统的产品需求说明书,适合产品经理、研发与测试人员梳理业务逻辑、明确功能边界。文档围绕数据结构管理展开,对健康评估指标进行规范化定义:涵盖序号、指标名称、参考值、单位、针对…

2026/10/13 14:23:19 阅读更多 →
解决方案架构设计实战:从业务意图到技术决策

解决方案架构设计实战:从业务意图到技术决策

做解决方案架构设计的人,大多是从软件开发、系统设计或者技术管理岗转过来的。刚开始接触“解决方案”这三个字,很容易把它理解成“画一张架构图、定几个技术选型、然后写个文档”。但真正经历过几个大型项目之后会发现,解决方案架构设计的核…

2026/10/13 14:23:19 阅读更多 →
从上下文窗口到MCP:Agent记忆与工具调用的设计实战

从上下文窗口到MCP:Agent记忆与工具调用的设计实战

最近跟几个做 Agent 的朋友聊了一圈,发现大家几乎都在同一个地方卡住:上下文窗口。很多人刚开始都觉得,8k、32k、甚至 128k 的上下文已经很宽裕了,可一旦真正跑长期对话、接上三五个工具、还要记住用户偏好,窗口里的东…

2026/10/13 14:23:19 阅读更多 →
MT9M001C全局快门CMOS驱动LCD实战:FPGA时序控制与信号链调试

MT9M001C全局快门CMOS驱动LCD实战:FPGA时序控制与信号链调试

简介:本资源是面向FPGA初学者与嵌入式图像处理学习者的实战项目,聚焦于MT9M001 CMOS图像传感器的驱动与实时显示实现,适用于基于Altera/Intel FPGA的开发板平台。项目完整呈现了从传感器数据采集、FPGA逻辑控制(含时序生成、像素流…

2026/10/13 14:22:18 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →