delphi - 计算 Delphi TMemo 中每行的最大字符数

标签 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;

我可以这样做吗?

最佳答案

请注意,大多数字体的字符具有可变宽度(CourierTerminal 是固定宽度字体的示例)。请参阅 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 函数找到 Memo 的宽度以容纳文本。

关于delphi - 计算 Delphi TMemo 中每行的最大字符数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35409963/

相关文章:

delphi - 备忘并创建文件和文件夹?

delphi - 向 Delphi 推荐新功能的最佳方式是什么?

delphi - 我可以在 Delphi 中创建特定接口(interface)的通用列表吗?

delphi - Delphi 属性 TMemo 行中字符串的最大长度

delphi - 如何将任意数据粘贴到 TMemo 中?

ios - Delphi XE7 有 iOS SDK8.3 - 无法让它使用 SDK7.1

delphi - 应用程序终止帮助

delphi - 您知道 Win32 Delphi 应用程序的 MVC 框架吗?

c++ - 在 C++ Builder 中覆盖事件处理程序