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
相关产品推荐
相关产品推荐

