1

我有一个固定长度的标签,并且自动换行属性设置为 true。在运行时,该标签有两行,例如:

test := 'quick brown fox jumps over the lazy dog';

在标签上,此文本显示为两行

quick brown fox jumps
over the lazy dog

我想知道运行时的行数:

#13#10不起作用。

4

2 回答 2

0
  Function NumberOfLines(MyLabel: TLabel): Integer;
  var
    TempLabel: TLabel;
    Pint1: Integer;
  Begin
    TempLabel := TLabel.Create(Self);
    TempLabel.Caption := MyLabel.Caption;
    TempLabel.WordWrap := True;
    TempLabel.AutoSize := True;
    TempLabel.Width := MyLabel.Width;
    TempLabel.Font := MyLabel.Font;
    PInt1 := TempLabel.Height;
    TempLabel.Caption := '';
    TempLabel.WordWrap := False;
    TempLabel.AutoSize := True;
    Result := PInt1 div TempLabel.Height;
    TempLabel.Free;
  End;
于 2019-12-07T06:53:30.633 回答
0

DrawText 函数可用于此目的。

该程序的其余部分与 David Heffernan 在他的评论中提出的没有太大区别。

这里的关键是采用标志DT_WORDBREAK来自动换行并DT_EDITCONTROL模仿标题的文本行为。

function TForm1.getNumberOfLinesInCaption(ALabel: TLabel): Integer;
var
  r: TRect;
  h: Integer;
begin
  h := ALabel.Canvas.TextHeight(ALabel.Caption);
  if h = 0 then
    Exit(0);//empty caption

  if not ALabel.WordWrap then
    Exit(1);//WordWrap = False

  FillChar(r, SizeOf(TRect), 0);
  r.Width := ALabel.Width;
  r.Height := ALabel.Height;

  if 0 = DrawText(ALabel.Canvas.Handle, ALabel.Caption, Length(ALabel.Caption), r, DT_EDITCONTROL or DT_WORDBREAK or DT_CALCRECT) then
    Exit(-1);//function call has failed

  Result := r.Height div h;
  //Assert(r.Height mod h = 0);
end;
于 2015-11-25T15:00:20.740 回答