Перейти к содержанию
  • Регистрация
  • 0
ra.eremeev

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

Вопрос

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

 

В моем приложении есть необходимость рассчитать высоту 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 эмодзи.

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

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

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


  • Похожий контент

    • От Ameta
      Доброе время суток. После создания/изменения (Edit Custom Style...) собственного стиля у Label1 (добавил в качестве фона прямоугольник) перестали обрабатываться события OnMouseMove, OnMouseDown и т.д. (Label1.HitTest:=True). До изменения стиля все работало. В чем причина? Спасибо за ответ...

    • От sviat9440
      Возникла вот такая непонятная ситуация: до этого момента я всегда считал что TLabel никак физически не может принять Tab Focus наравне с TRectangle и тому подобных. Судя по всему я ошибался. Ниже прилагаю скрин окна Tab Order, что там делает TLabel неясно. Ну да ладно. Вопрос в том как его оттуда убрать, чтобы он не жрал Tab Focus? Стандартных галочек TabStop и CanFocus в Tlabel нет.

      P.S. Я не помню чтобы я сталкивался с этой проблемой в предыдущих версиях RAD.
    • От sviat9440
      Почему в 10.1 цвет надписи тянется из стиля, хотя в StylledSettings галочка FontColor отключена?

    • От kidrock
      Всем привет. Как на мобилке для Делфи  сделать так, чтобы по клику на TLabel открывался браузер(не компонент) и, допустим, страница http://google.com?
    • От estra
      На форме 2 метки:
       

       
      Верхняя - FactoryIDCaption (Заводской №)
      Нижняя - FactoryIDValue (90408223)
       
      Нужно чтобы вторая строка (со значением параметра) располагалась после первой (с наименованием параметра) вне зависимости от длины текста в первой метке. У первой метки значение свойства AutoSize = True. И есть такой код
      FactoryIDValue.Position.X := FactoryIDCaption.Position.X + FactoryIDCaption.Width; По идее начало второй метки должно совпадать с концом первой метки, но на практике это не так. Где я ошибся и как эту ошибку исправить?
       
      P.S.
      Речь идет про Android, на Windows все работает правильно.
    • От Morfi
      Доброго времени суток.
       
      Создаю программно компоненты TLabel.
      Status1 := TLabel.Create(Form1); Status1.Name := 'LabelStatus1_'+idMachine.ToString; Status1.Parent := RectangleStatus; Status1.Align := TAlignLayout(9); Status1.TextSettings.HorzAlign := TTextAlign(0); //По умолчанию, при создании объекта TLabel, размер шрифта устанавливается в значение 12 Status1.TextSettings.Font.Size := 24; Status1.TextSettings.WordWrap := true; Status1.Text := 'Статус 1'; Status1.Visible := true; Изменяю значение размера шрифта:
      Status1.TextSettings.Font.Size := 24  Значение изменяется, но размер шрифта TLabel при отображении на форме остается прежним.
       
      Как можно, или нужно изменять размер шрифта компонента в RunTime?
    • От d7d1cd
      Привет всем. На 2D форму положил TViewPort3D, на него положил TLayer3D на котором разместил TLabel, TEdit, TButton и анимацию. При открытии формы 3D эффект работает, однако вид выше указанных компонентов совсем не презентабелен. Те же компоненты вне TViewPort3D и TLayer3D отображаются нормально. Такая проблема стала наблюдаться только в XE7. В XE6 ее не было.
      Прикрепил тестовый проект.
      Example.zip
    • От Nix0N
      ListBox содержит 100 ListBoxItem (созданные в run-time) с кастомным стилем, который содержит TCheckBox и TLabel. Если у первого item'a отметить CheckBox, он выборочно дублируется у остальных item. Пример: отмечаем первый item, отмечаются 20, 30 и т.д. Пробовал перерисовку, перестановку контента и т.д. - не помогает. В чем может быть дело ?

      Чистый проект прилагается. RAD Studio XE6 
      ChekBox ListBox.zip
    • От 97mik
      Как сделать Label при вводе текста в который, он будет автоматически увеличиваться по высоте при необходимости?
    • От 97mik
      Пробую задать размер шрифта (TLabel.Font.Size) для TLabel. Но стиль и размер у метки остаются стандартными.   Создаю объект так: MyLabel := TLabel.Create(Self); MyLabel.Position.X := 66; MyLabel.Position.Y := 8; MyLabel.Width := 231; MyLabel.Height := 18; MyLabel.Parent := ListBox1.ListItems[ListBox1.Count-1]; MyLabel.HitTest := False; MyLabel.Font.Size := 8; MyLabel.Font.Style := [TFontStyle.fsBold]; MyLabel.Trimming := TTextTrimming.ttCharacter; MyLabel.VertTextAlign := TtextAlign.taLeading; MyLabel.Text := 'Text';  
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

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