TStringGrid 无法显示很长 (6K) 的字符串

TStringGrid cannot display very long (6K) strings

我想在 TStringGrid 中加载一些文本。字符串很短,但字符串超过 100K 的列除外。似乎 TStringGrid 无法处理这个问题。在我双击单元格进行编辑之前,文本不会出现在单元格中。但即便如此,行为仍然不稳定。

要重现:在表单上放置一个网格,设置 goEdit= true。 运行 应用程序并双击一个单元格。粘贴一些文本(不应包含回车)并按 Enter 结束编辑。文字消失。

在我做的文本中,限制是大约 6208 个 ASCII 字符。
任何快速 fix/workaround 吗?

文字是用ExtTextOut画的。众所周知,对于很长的字符串会失败。例如:ExtTextOut fails with very long strings unless lower font quality specified。据我所知,准确计算出导致失败的字符串长度是很棘手的。

我建议,如果您需要支持这么长的字符串,那么您可以通过实现 OnDrawCell 事件处理程序来自己绘制它们。不要绘制整个字符串,因为毕竟用户将无法看到单元格矩形之外的任何内容。这样您就可以避免发送 ExtTextOut 太长而无法处理的字符串的问题。

您需要使用分词。当然,如果没有 Word break,则不会显示任何内容。当然,您的文字必须包含空格。

const
  N = 16000;
var
  R: TRect;
  s: String;
  i: Integer;
begin
  R := ClientRect;
  SetLength(s, N);
  for i := 1 to N do
    if Random(10) = 0 then
      s[i] := ' '
    else
      s[i] := Char(65 + Random(26));
  Canvas.Font.Color := clBlack;

  Canvas.TextRect(R, s, [tfCenter, tfVerticalCenter, tfWordBreak]);
end;