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;
我想在 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;