计算 Delphi TMemo 中每行的最大字符数
Calculating max chars per line in Delphi TMemo
我有一个 TMemo。
我想在 TMemo 的每一行中放置一些文本,而不是自动换行。
我需要计算在没有 TMemo 的情况下我可以在一行中放入多少个字符在该行中进行自动换行。
伪代码:
function calculate_max_chars_per_line_in_Memo():Integer;
var w,l:integer;
begin
w:=getwidth from tmemo;
l:=lenght of a font char;
Result:=trunc(w/l);
end;
我可以这样做吗?
请注意,对于大多数字体,字符的宽度是可变的(Courier
和 Terminal
是固定宽度字体的示例)。参见 TFont.Pitch。
因此,如果您准备使用固定字体,请使用 Canvas.TextWidth 查找一次字符宽度,并使用此值确定最大字符串长度。
对于可变字体,您必须检查每个字符串的宽度 - 'lllll' 的像素比 '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 函数查找备忘录的宽度以支撑文本。
我有一个 TMemo。
我想在 TMemo 的每一行中放置一些文本,而不是自动换行。 我需要计算在没有 TMemo 的情况下我可以在一行中放入多少个字符在该行中进行自动换行。
伪代码:
function calculate_max_chars_per_line_in_Memo():Integer;
var w,l:integer;
begin
w:=getwidth from tmemo;
l:=lenght of a font char;
Result:=trunc(w/l);
end;
我可以这样做吗?
请注意,对于大多数字体,字符的宽度是可变的(Courier
和 Terminal
是固定宽度字体的示例)。参见 TFont.Pitch。
因此,如果您准备使用固定字体,请使用 Canvas.TextWidth 查找一次字符宽度,并使用此值确定最大字符串长度。
对于可变字体,您必须检查每个字符串的宽度 - 'lllll' 的像素比 '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 函数查找备忘录的宽度以支撑文本。