Перейти к содержанию
Fire Monkey от А до Я
  • 0

Расчет высоты объекта на основе высоты TLabel


ra.eremeev

Вопрос

Друзья, дошел до отчаяния!

 

В моем приложении есть необходимость рассчитать высоту TListboxItem, в котором расположены компоненты TLabel.

Расчет высоты производится на основании подсчета высоты компонента TLabel.

Также, компоненты TLabel сами выстраиваются в столбец друг за другом (закончился один, отступ, выводим другой).

 

Перерыл весь форум. Использовал все рекомендации:

1. определял высоту текста в TLabel по канве (тема: http://fire-monkey.ru/topic/44-avtomaticheskii-perekhod-na-vtoruiu-stroku-tlabel/)

2. принудительно загружал стили (тема: http://fire-monkey.ru/topic/726-pochemu-u-menia-dlia-tlabel-nepravilno-vychisliaetsia-raz/)

3. опирался на свойства TLabel.Height.

 

Что бы я ни делал, построить стабильный вывод компонентов не получается.

Постоянно в самые непредсказуемые моменты компоненты либо расползаются, либо высота TListboxItem рассчитывается неверно.

 

Самый стабильный результат дает третий способ. Но при первом выводе компонентов на экран, те, которые завязаны на расчет высоты TLable, расползаются; при последующих открытиях расчет работает стабильно. Думал, что стили не загружены, применял 2 способ, но тоже решения не дало :(

 

Подскажите, пож-та, как получить реальную высоту текста в TLabel как при первом выводе компонентов на экран, так и при последующих?

 

Также, не сочтите за наглость, но буду признателен за фрагмент кода, работающего при любых условиях для Listbox1.Height:=Label1.height+label2.Height+10

Правда, веру в себя с этим выравниванием потерял :(

 

post-1944-0-15307200-1456155931.png

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Добрый день.
Как вариант для предотвращения разбегания label-ов можно попробовать задать выравнивание для всех TLabel таким образом: Align:=TAlignLayOut.MostTop;

Если Вы используете TLabel для вывода текста в TListBox, то, быть может, целесообразнее для этого вместо Label использовать свойство Text самого TListBoxItem. 

 

Но судя по прикрепленному Вами изображению Вам должно хватить возможностей TListView - картинка, текст и details там среди стандартных параметров.

Изменено пользователем Alex7wrt
Ссылка на комментарий
  • 0

Alew7wrt, спасибо!

 

Но выравнивание не решит части задачи - расчет и установку необходимой высоты TListboxItem.

Касательно TListView - понятно. В данном конкретном случае можно выйти из ситуации...

Но задача стоит именно в использовании TListBox.

 

Неужели нет больше мыслей?

Ссылка на комментарий
  • 0

При работе с Listbox мне приходится использовать RecalcSize. Вообще, для лучшего понимания проблемы вы лучше нарисуйте что хотели бы видеть и что реально получаете.

Ссылка на комментарий
  • 0

я использую расчет высоты и в ListBox и в ListView

и все нормально

Label'ы c автосайзом и Align=Top тоже нормально себя рассчитывают

что-то у вас не так...

Ссылка на комментарий
  • 0

Я предлагаю создать свой собственный класс для таких целей. Обработаем свойство Resize и всё, никаких проблем не будет. http://fire-monkey.ru/topic/2280-sobstvennyi-tlistboxitem-na-c/ тут я описал как создать собственный класс для ListBoxItem там же есть ссылка и для Delphi. Ниже приведен класс который я создал, только на C++. Посмотрите там обработчик события ApplyStyleLookup() и Resize(). И еще предлагаю вместо TLabel использовать TText.

Если всё таки хотите своим путём тогда вычислите высоты с помощью TTextLayout, это делается так:

var
L : TTextLayout;
begin
   L := TTextLayoutManager.DefaultTextLayout.Create;
   L.BeginUpdate;
   L.Text := FtextType.Text;             {Вместо FTextType будет ваш Label}
   L.MaxSize := TPointF(FtextType.Width, 1000);  
   L.Font := FTextType.Font;             {}
   L.WordWrap := FTextType.WordWrap;
   L.HorizontalAlign := FTextType.HorzTextAlign;
   L.VerticalAlign := FTextType.VertTextAlign;
   L.EndUpdate;
   height := L.Height;
end;

Я не силён в Delphi, но думаю вы поймете.

ListBoxItem.zip

Изменено пользователем Axbor
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...