You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 11.3中Canvas.TextRect直接传字符串正常,从类/数据库取则失效?

Delphi 11.3 Canvas.TextRect 运行差异排查方案

可能原因及对应解决方法

1. 字符串包含隐藏控制字符

外部来源(控件、数据库)的字符串可能混入回车、换行、制表符或Unicode不可见字符,干扰tfCenter和tfWordBreak的布局逻辑。

解决方法:过滤非打印字符,清理字符串:

function CleanDisplayText(const S: string): string;
var
  CharIdx: Integer;
begin
  Result := '';
  for CharIdx := 1 to Length(S) do
    if S[CharIdx] >= #32 then // 保留可打印字符
      Result := Result + S[CharIdx];
end;

// 使用示例
myText := CleanDisplayText(myItemDescription.Text);

2. 字符串编码异常

数据库或旧控件返回的字符串可能存在编码转换错误(如ANSI转Unicode不完整、带BOM标记),导致渲染逻辑异常。

解决方法:强制统一为UTF-8编码:

// 从ANSI控件或数据库获取时转码
myText := TEncoding.UTF8.GetString(TEncoding.Default.GetBytes(myItemDescription.Text));

同时确保数据库连接字符串指定正确字符集(如CharacterSet=utf8mb4)。

3. Canvas上下文坐标不匹配

第二个示例使用myPage.Canvas,其坐标系统、视口偏移可能与第一个示例的Canvas不同,导致TextRect超出可视区域。

解决方法:基于myPage的客户区调整TextRect:

// 以myPage客户区为基准设置文本区域
TextRect := myPage.ClientRect;
TextRect.Top := 0;
TextRect.Left := 0;
TextRect.Height := 80;
TextRect.Width := 200;

或检查myPage.Canvas的视口设置,确保坐标转换正确。

4. 字符串为空或仅含空白

外部来源的字符串可能为空、仅含空格/换行,导致视觉上无渲染效果。

解决方法:添加空值检查与默认文本:

myText := Trim(myItemDescription.Text);
if myText = '' then
  myText := '[无描述]';

5. Canvas状态不一致

myPage.Canvas的字体、颜色、画笔设置可能与第一个示例的Canvas不同(如文本色与背景色一致),导致文本不可见。

解决方法:统一Canvas渲染状态:

with myPage.Canvas do
begin
  Font.Name := '微软雅黑';
  Font.Size := 10;
  Font.Color := clBlack;
  Brush.Color := clWhite; // 确保背景与文本有对比度
end;

内容的提问来源于stack exchange,提问作者mesutuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:13:27