Delphi升级至10.2 Tokyo后TeeChart打印标签缩放异常求助
我之前帮同事排查过几乎一模一样的问题——从Delphi 2009升级到10.2 Tokyo后,用TPrinter配合TeeChart 9.x的PrintPartial打印多图表时,屏幕显示正常但打印标签被压缩/缩放异常。核心原因是Delphi跨版本引入的高DPI打印适配,和旧版TeeChart的打印逻辑不兼容,下面是几个经过验证的解决方案:
方案1:强制对齐打印画布与屏幕的DPI
Delphi 10.2的TPrinter画布默认会适配系统的高DPI设置,但TeeChart 9.x的PrintPartial还是沿用旧版本的固定DPI计算标签尺寸,导致字体缩放错位。可以在打印前手动同步DPI:
var PrinterCanvas: TCanvas; ScreenDPI: Integer; begin Printer.BeginDoc; try PrinterCanvas := Printer.Canvas; // 获取当前屏幕的DPI值 ScreenDPI := Screen.PixelsPerInch; // 让打印画布的字体DPI与屏幕一致 PrinterCanvas.Font.PixelsPerInch := ScreenDPI; // 同时给TeeChart设置对应的缩放比例 Chart1.PrintOptions.ScalePercent := Round((PrinterCanvas.PixelsPerInch / ScreenDPI) * 100); // 执行PrintPartial打印(这里替换成你实际的打印区域参数) Chart1.PrintPartial(Rect(50, 50, 450, 350), PrinterCanvas); Chart2.PrintPartial(Rect(50, 400, 450, 700), PrinterCanvas); finally Printer.EndDoc; end; end;
方案2:升级TeeChart到兼容Delphi 10.2的版本
TeeChart 9.0.1.0是2010年左右的版本,完全没有适配Delphi XE之后的打印上下文和高DPI特性。升级到TeeChart 2017或更高版本(官方明确支持Delphi 10.2 Tokyo),不仅能直接解决这个打印标签问题,还能修复其他潜在的兼容性bug,比如图表渲染模糊、交互卡顿等。
方案3:用ExportToCanvas替代PrintPartial
如果暂时无法升级TeeChart,可以绕过PrintPartial的内部逻辑,直接把图表导出到打印画布上,手动控制绘制区域:
var PrintArea: TRect; begin Printer.BeginDoc; try // 第一个图表的打印区域 PrintArea := Rect(50, 50, 450, 350); Chart1.ExportToCanvas(Printer.Canvas, PrintArea); // 第二个图表的打印区域 PrintArea := Rect(50, 400, 450, 700); Chart2.ExportToCanvas(Printer.Canvas, PrintArea); finally Printer.EndDoc; end; end;
这种方式相当于直接在打印画布上绘制图表,完全由VCL的画布上下文处理缩放,能避免TeeChart旧版打印逻辑的坑。
方案4:检查标签字体设置
有时候标签使用了“屏幕字体”(非TrueType字体),打印时会因为系统字体映射问题导致缩放异常。打开TeeChart编辑器,找到标签的字体设置:
- 选择TrueType字体(比如Arial、Times New Roman)
- 取消勾选“屏幕字体”选项(如果有的话)
我接触的几个类似案例里,方案1或3能快速解决问题,方案2是长期根治的最优选择。如果还是有问题,可以检查Printer.PageSettings里的缩放比例是否被系统默认修改了。
内容的提问来源于stack exchange,提问作者F. Zeller

