Найти количество строк в метке с фиксированной длиной и свойством переноса слов true

У меня есть метка с фиксированной длиной и свойство переноса слов true. Во время выполнения эта метка имеет две строки, например:

test: = 'быстрая коричневая лиса перепрыгивает через ленивую собаку'

На ярлыке этот текст отображается в виде двух строк

quick brown fox jumps
over the lazy dog

Я хочу знать количество строк во время выполнения:

#13#10 не работает.

1 ответ

  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;

Для этого можно использовать функцию DrawText.

Остальная часть процедуры не сильно отличается от того, что Дэвид Хеффернан предлагает в своем комментарии.

Ключевым моментом здесь является принятие флагов 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;
Другие вопросы по тегам