У меня TLabel
с EllipsisPosition
, установленным на epEndEllipsis
, и я должен быть в состоянии определить, обрезан ли текст в настоящее время или нет.Помимо расчета площади, необходимой для отображения текста самостоятельно, и сравнения ее с фактическими размерами надписи, кто-нибудь придумал более простой / более элегантный способ сделать это?
На самом деле, вычисление необходимой области вОтказоустойчивый способ также не выглядит таким простым, как кажется ... Например, TCanvas.GetTextHeight
не учитывает разрывы строк.
TCustomLabel.DoDrawText
внутренне использует либо DrawTextW
или DrawThemeTextEx
с флагом DT_CALCRECT
, чтобы определить, следует ли использовать многоточие или нет.Там задействовано довольно много кода, весь из которых объявлен private
.Простое дублирование всего этого кода не будет квалифицироваться как «элегантный» в моей книге ...
Есть идеи?
(я использую Delphi 2010 на случай, если кто-нибудь придумаетрешение для Delphi-версии)
Обновление 1: Теперь я понял, что могу просто позвонить TCustomLabel.DoDrawText(lRect, DT_CALCRECT)
напрямую (который просто объявлен protected
), чтобыметка выполняет вычисление требуемого размера без дублирования своего кода.Я просто должен убедиться, что временно установил EllipsisPosition
на epNone
или вообще использовал временный экземпляр метки.Это на самом деле не так уж плохо, и я мог бы просто пойти с ним, если никто не может придумать еще более простое решение.
Обновление 2: Я добавил свое решение как отдельноеответ.Оказалось, что все оказалось гораздо проще, чем я ожидал, поэтому, вероятно, нет более простого / лучшего способа сделать это, но я все равно оставлю этот вопрос открытым на некоторое время на всякий случай.