3

我有一个 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;

我有可能做到吗?

4

1 回答 1

1

请注意,对于大多数字体,字符具有可变宽度(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 函数查找备忘录的宽度以保留文本。

于 2016-02-15T13:14:34.130 回答