Найти количество строк в метке с фиксированной длиной и свойством переноса слов 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;