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

Как увеличивать ListBoxItem в зависимости от количества текста?

Вопрос

У меня стоит WordWrap=true.

Бывает так что текста больше чем обычно и он весь не помещается и обрезается. Как программно определить что текст не умещается?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

  • 0

тут есть уже несколько тем про изменение высоты item

все так же. подсчитать желаемую высоту. сравнить с тем что есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, krapotkin сказал:

все так же. подсчитать желаемую высоту. сравнить с тем что есть.

Так вот и не понятно как ее посчитать?

Приведите пожалуйста свой вариант, как вы считаете для ListBox и ListView?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 1
function TextHeight(const AText: string; aTextSettings: TTextSettings; const aWidth: Single): Single;
// uses FMX.TextLayout, FMX.Graphics, System.Math
var
  Layout: TTextLayout;
  aRect: TRectF;
  aWW: boolean;
begin
  Result := 0;
  if AText.IsEmpty then
    Exit;

  aWW := Pos(#13#10, AText) > 0;
  if (aTextSettings.WordWrap) or (aWW) then
    aRect := RectF(0, 0, aWidth, MaxSingle)
  else
    aRect := RectF(0, 0, MaxSingle, MaxSingle);
  Layout := TTextLayoutManager.DefaultTextLayout.Create;
  try
    Layout.BeginUpdate;
    Layout.TopLeft := aRect.TopLeft;
    Layout.MaxSize := PointF(aRect.Width, aRect.Height);
    Layout.WordWrap := aTextSettings.WordWrap;
    Layout.HorizontalAlign := TTextAlign.Leading;
    Layout.VerticalAlign := TTextAlign.Leading;
    Layout.Font.Assign(aTextSettings.Font);
    Layout.Color := aTextSettings.FontColor;
    Layout.RightToLeft := false;
    Layout.Text := AText;
    Layout.EndUpdate;
    aRect := Layout.TextRect;
  finally
    FreeAndNil(Layout);
  end;
  Result := aRect.Bottom;
end;

вызов функции, тут расчёт высоты делается для TText (родной autosize косячит при большом кол-ве текста)

    aTextSettings := TTextSettings.Create(nil);
    aTextSettings.Trimming := TTextTrimming.None;
    aTextSettings.Font.Size := mText.Font.Size;
    aTextSettings.WordWrap := true;

    mText.Height := TextHeight(mText.Text, aTextSettings, mText.Width - (mText.Margins.Left + mText.Margins.Right));
    PresentedScrollBox1.RealignContent; // пересчёт контента родителю

Самое важное это сделать пересчёт  размеров контента РОДИТЕЛЮ, иначе высота будет не правильная. Незнаю почему так сделано, но только так получается добиться правильной высоты текста (проверял на TListBox, TListView, TText)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 1

Я такое использую для вычисления высоты текста. Может пригодится)

function CalculateTextHeight(aText: String; aWidth: Single; aMinHeight: Single; aMaxHeight: Integer; aFont: TFont) : Single;
  begin
    if not Assigned(FTextLayout) then
      FTextLayout := TTextLayoutManager.DefaultTextLayout.Create;

    FTextLayout.BeginUpdate;
    try
      FTextLayout.Text := aText;
      FTextLayout.MaxSize := TPointF.Create(aWidth, 1000);
      FTextLayout.WordWrap := True;
      FTextLayout.Font.Assign(aFont);
      FTextLayout.HorizontalAlign := FMX.Types.TTextAlign.Leading;
      FTextLayout.VerticalAlign := FMX.Types.TTextAlign.Leading;
    finally
      FTextLayout.EndUpdate;
    end;
    Result := FTextLayout.Height;
    if aMinHeight>0 then
      if Result < aMinHeight then
        Result := aMinHeight;
    if aMaxHeight>0 then
      if Result > aMaxHeight then
        Result := aMaxHeight;
  end{ function CalculateTextHeight };

FTextLayout : TTextLayout - глобальная приватная переменная.

Изменено пользователем umkes

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, krapotkin сказал:

 

Сделал по тому как указано в той теме и стиль с Item-а слетел. У меня для него прописан Stylelookup - задан серый фон, белый шрифт, а получается по умолчанию.

Изменено пользователем Rusland

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

ZuBy, umkes в какой момент надо вызывать ваши функции? После присвоения текста делать расчет и задавать новую высоту?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 минуту назад, Rusland сказал:

ZuBy, umkes в какой момент надо вызывать ваши функции? После присвоения текста делать расчет и задавать новую высоту?

да все верно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
1 час назад, Rusland сказал:

Сделал по тому как указано в той теме и стиль с Item-а слетел. У меня для него прописан Stylelookup - задан серый фон, белый шрифт, а получается по умолчанию.

Не верно я написал, стиль не слетает. Просто если текст отсутствует, то процедура и "обнуляет" высоту item-а - а под ним белым-бело. Это то и сбило с толку. Теперь проверяю чтобы Height не стал меньше чем был изначально.

А так вариант Ярослава годный и удобный ИМХО. Только чтобы принудительно заставить отработать, мне приходится после присвоения значения (после ListBox1.EndUpdate;) делать: ListBoxItem1.RecalcSize;

Всем спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

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


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

    • От x11
      У ListBoxItem нужно реализовать вызов контекстного меню.
      На ListBoxItem лежит ImagesViwer с картинкой и у ImagesViwer свойство HitTest отключено.
       
      почитал справку http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Gestures_in_FireMonkey
      сделал как описано:
       
      procedure TfmEditObject.AddPhoto(Image: TBitmap); Var item: TListBoxItem; imageV: TImageViewer; begin item := TListBoxItem.Create(lbPhotos); item.parent := lbPhotos; item.text := ''; item.Width := lbPhotos.Width; item.Touch.GestureManager := GestureManager1; item.Touch.InteractiveGestures := [TInteractiveGesture.LongTap, TInteractiveGesture.DoubleTap]; item.OnGesture := ListBoxItemGesture; imageV := TImageViewer.Create(lbPhotos); imageV.HitTest := False; imageV.Parent := item; imageV.Align := TAlignLayout.Client; imageV.Bitmap.Assign(image); item.SetFocus; end; procedure TfmEditObject.ListBoxItemGesture(Sender: TObject; const EventInfo: TGestureEventInfo; var Handled: Boolean); Var s: string; begin if GestureToIdent(EventInfo.GestureID, s) then ShowMessage( S ); if EventInfo.GestureID = igiLongTap then ShowMessage( Sender.ClassName ); Handled := True; end;  
      Ничего не происходит. На на андроид устройстве, ни на винде.
       
       
      И правильно ли я понял, что для LongTap, т.е. для InteractiveGestures не нужен GestureManager?
       

    • От VirusZ2D
      Есть 5 итемов  у listbox свойство Allowc drag = true  итемы переносятся в нутри листа все путем 
      но как только включаю у итемов HitTest = true переносимость проподает (((.
      (Еще замечание если DragMode = dmAutomatic и HitTest = true  то итем можно поменять с итемом у которого HitTest = false)
      Как заставить их меняться ?
    • От x11
      Первая картинка - Master. Здесь всё правильно. А вот две другие картинки
      Вторая - iPhone 5,5"
      Третья - Android 5" Phone
      Четвертая - Android 7" Tablet
      У всех компонент Align := Right.
      Это зависит от каких-то свойств?
       
      Проверил на iPhone 4"  - норм. На iPhone 4.7"  - тоже криво.




    • От dim
      Создаю динамически ListBoxItem и размещаю на них кнопу
      lbi:=TListBoxItem.Create(ListBox2); lbi.Parent:=ListBox2; lbi.StyleLookup:='listboxitembottomdetail'; lbi.Height:=57; lbi.ItemData.Text:='Добавить'; lbi.ItemData.Detail:=''; SpeedButton2:=TSpeedButton.Create(lbi); SpeedButton2.Action:=del_adres; SpeedButton2.Align:=TAlignLayout.Right; SpeedButton2.StyleLookup:='trashtoolbutton'; SpeedButton2.Width:=48; SpeedButton2.Parent:=lbi; SpeedButton2.Tag:=ListBox2.Count-2; как при нажатии на кнопку получить ее ListBoxItem чтобы удалить
    • От chaplin.u@gmail.com
      У меня есть ListBox с 7 ListBoxItem , на каждом ListBoxItem есть 7 CheckBox-ов.
      Получается как-бы двухмерный массив CheckBox-ов. 
      Какой самый простой способ обращаться к каждому конкретному CheckBox-у ?
    • От Rusland
      Добавил на ListBoxItem эффект InnerGlowEffect. Trigger=IsPressed=true 
      Но когда я нажимаю на этот ListBoxItem, то никакого эффекта не происходит. Почему?
      Пробовал все возможные Trigger-ы - никакого толку.
      Вообще реально придать какой-нибудь эффект помимо InnerGlowEffect?
       
      PS. Пока делаю так: 
      procedure TFrmMain.ListBoxItem1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin InnerGlowEffect1.Enabled:=true; end; procedure TFrmMain.ListBoxItem1MouseEnter(Sender: TObject); begin InnerGlowEffect1.Enabled:=true; end; procedure TFrmMain.ListBoxItem1MouseLeave(Sender: TObject); begin InnerGlowEffect1.Enabled:=false; end;  
    • От ivadimos
      Могу ли я каким-то образом вставить Item не в конец списка, а после определённого?
    • От Zitto
      Приветствую. Задача, при клике на ListBoxItem развернуть его на весь ListBox с анимацией.
      Решаю её через
        ListBoxItem.AnimateFloat( 'Height', ListBox.Height ) и 
        ListBoxItem.AnimateFloat( 'Height', 0 ) соответственно.

      В каждом LisBoxItem находится свой ListBox с элементами, который в последствии и разворачивается на весь экран.
      В следствии столкнулся со следующей проблемой:
      Если развернуть один ListBoxItem и выделить один элемент на дочернем ListBox, а после свернуть его обратно и развернуть следующий, то всплывает ошибка 
        EArgumentOutOfRangeException
      Конкретно на приложенном примере следует:
      Main(1) - развернуть Slave(1,4) - выделить Main(1) - свернуть Main(0) - развернуть Проблема, видно, в обращении к уже скрытым элементам ListBoxItem и решить её удалось сворачивая остальные ListBoxItem не до 0, а до 1 или даже 0.1 .
      Выход не нравится, прошу помощи в более элегантном решении
      Request.zip
  • Последние посетители   0 пользователей онлайн

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

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