请注意,对于大多数字体,字符具有可变宽度(Courier
并且Terminal
是固定宽度字体的示例)。请参阅 TFont.Pitch。
因此,如果您准备好使用固定字体,请使用 Canvas 查找一次字符宽度。TextWidth并使用此值来确定最大字符串长度。
对于可变字体,您必须检查每个字符串的宽度 - 'llllll' 的像素会比 'wwwww' 短,以此类推。当然,您可以尝试找到具有最大宽度的最短字符序列并使用它的长度。请注意,最宽的字符(以及字符与符号间空格的组合)取决于所使用的字体。
var
s: string;
Margins: Integer;
begin
Margins := Memo1.Perform(EM_GETMARGINS, 0, 0);
Margins := LongRec(Margins).Lo + LongRec(Margins).Hi;
s := 'ababababababababababababababababababababababab';
//be sure that Canvas font is the same as Memo font
while Canvas.TextWidth(s) >= Memo1.ClientWidth - Margins - 1 do
Delete(s, Length(s), 1);
Memo1.Lines.Add(s);
DrawText(Ex)
替代方法 - 使用WinAPI 函数查找备忘录的宽度以保留文本。