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

HyperZen

Пользователи
  • Постов

    203
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1

Сообщения, опубликованные HyperZen

  1. 1 час назад, ZuBy сказал:

    <TListView>.Items.Count * на_высоту_одного_айтема = высота контента

    <TListView>.Height = высота компонента

    Спасибо. Но высота каждого Item'а разная, я думал высоту контента конкретного Item'а необходимо учитывать при подсчете.

  2. 4 часа назад, ZuBy сказал:

    высота контента > высоты компонента

    В этом месте можно чуть-чуть подробнее? На сколько контент больше по размеру относительно компонента?

    Добавив в расчеты 30 пикселей к текущему результату, получил то, что хотел. Но эти 30 пикселей были найдены путем подбора, хотелось бы как то математически обосновать эти цифры:

      h := GetTextHeight(AItem.Text, ListView1.Width-16, ListView1.ItemAppearanceObjects.ItemObjects.Text.Font, TTextAlign.Leading);
      AItem.Height := Trunc(h) + 30;

    И какой максимальный текст можно вместить в итем ListView?

  3. 9 часов назад, AlexG сказал:

    Что же касается самой функции, кажется можно чуть проще (где-то на форуме уже вроде был такой код) и он прекрасно работает:

    
    function GetTextHeight(AText: string; AMaxWidth: Single; AFont: TFont; ATextAlign: TTextAlign): Single;
    var
      txt: TText;
    begin
      txt := TText.Create(nil);
      try
        txt.Align := TAlignLayout.None;
        txt.VertTextAlign := ATextAlign;
        txt.HorzTextAlign := TTextAlign.Leading;
        txt.Font := AFont;
        txt.WordWrap := True;
        txt.Width := AMaxWidth;
        txt.BeginUpdate;
        txt.Text := AText;
        txt.EndUpdate;
        txt.AutoSize := True;
        Result := txt.Height;
      finally
        FreeAndNil(txt);
      end;
    end;

     

    А в данном случае что необходимо передавать в качестве AMaxWidth? При передаче width текущего ListView картина наблюдается та же, что и на скриншоте выше. При вычитании из размера ListView 7 или 16 пикселей, как писал ZuBy, все равно картина остается той же...

    procedure TForm12.ListView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem);
    var
      h: Single;
    begin
      h := GetTextHeight(AItem.Text, ListView1.Width - 16, ListView1.ItemAppearanceObjects.ItemObjects.Text.Font, TTextAlign.Leading);
      AItem.Height := Trunc(h);
    end;

     

    1.jpg

  4. Добрый вечер! Все-таки, как корректно подсчитывать высоту итемов данного компонента, если учитывать, что текст может быть достаточно большим.

    Использую код с данного сайта, все работает корректно, пока не встречается текст, чуть больше одного абзаца:

    function TextHeight(const AText: string; aTextSettings: TTextSettings; const MaxWidth: Single): Single;
    // uses FMX.Graphics, FMX.TextLayout, FMX.Types, Math
    var
      Layout: TTextLayout;
      aRect: TRectF;
      aWW: Boolean;
    begin
      Result := 24;
      if AText.IsEmpty then
        Exit;
    
      aWW := Pos(#13#10, AText) > 0;
      if (aTextSettings.WordWrap) or (aWW) then
        aRect := RectF(0, 0, MaxWidth, 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.Text := AText;
        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.EndUpdate;
        aRect := Layout.TextRect;
      finally
        FreeAndNil(Layout);
      end;
      Result := aRect.Bottom;
    end;

    И вызов в onUpdateObject:

    procedure TForm12.ListView1UpdateObjects(const Sender: TObject; const AItem: TListViewItem);
    var
      TS: TTextSettings;
    begin
      TS := TTextSettings.Create(nil);
      // задаем параметры текста для расчета "Text"
      TS.WordWrap:= True;
      TS.Font.Assign(ListView1.ItemAppearanceObjects.ItemObjects.Text.Font);
      AItem.Height := Trunc(TextHeight(AItem.Text, TS, ListView1.Width));
      FreeAndNil(TS);
    end;

    Получаем:

    1.jpg

  5. Нет. Это все-таки косячок. Я с таким сталкивался, когда пытался выставлять размеры TListView автоматически относительно количества текста.

    ПС: так и не победил автоподгон высоты при большом тексте...

    Кто-то с этим справился?! :)

  6. 1 час назад, d7d1cd сказал:

    А ведь можно еще попробовать сделать по-другому: с помощью какой-нибудь программы-монитора "подсмотреть" что отправляет существующее приложение по протоколу TCP/IP. Протокол обмена со счетчиком известен, поэтому, я думаю, будет несложно "разгадать" протокол обмена по веб-интерфейсу (ну если только там нет какого-нибудь шифрования).

    По Веб-интерфейсу используйте программу HTTP Analyzer

  7.  

     

    А если BorderStyle=None?

    Хмм... так хинты высвечиваются только при использовании обычного VCL

     

    А причём тут VCL?

     

    Если создать простой проект VCL Form Application, все работает и со свойством формы BorderStyle = None, хинты высвечиваются, все корректно. А если создать кроссплатформенный проект - хинты с этим свойством не работают.

  8.  

     

     

    Хотфикс к апдейту http://cc.embarcadero.com/item/30453

    я так понял он только для update 1?
    А поделиться этим хотфиксом можете?
    Если у тебя нет подписки, то этот хотфикс ты не сможешь установить. Не берусь гадать, но может заблокировать студию.

     

    Все хотфиксы установлены и чудненько работают :) Спасибо братьям китайцам :)

  9. Но как то же его можно победить :) Взять, к примеру, ES проводник, там вверху справа есть меню, с выпадающим (Popover) MultiView, после выбора любого пункта меню, выделение сбрасывается :)

  10. Ничего не понимаю, создал новый проект, бросил на форму TMultiView, на него TListBox, создал 5-6 Итемов, и код:

    procedure TForm1.lst1ItemClick(const Sender: TCustomListBox;
      const Item: TListBoxItem);
    begin
      case lst1.ItemIndex of
        0: ShowMessage('a');
        1: ShowMessage('b');
        2: ShowMessage('c');
        3: ShowMessage('d');
      end;
      Item.IsSelected := False;
      mv1.HideMaster;
    end;
    
    

    Все работает :( Почему в старом проекте наблюдаются такие "глюки"?

  11. какая платформа? на windows все прекрасно работает

     

    UPDATE не работает :)

    Ни на платформе Windows, ни на Android не работает :)

    Вот скриншоты, сделанные по шагам в винде, на Андроиде то же самое.

    post-1802-0-67727700-1454919852_thumb.pn

  12. Не могу понять почему так происходит: при клике/тапе по TListBoxItem пишу строку, чтобы снять выделение итема:

    Item.IsSelected := False; // в примере студии работает
    Теперь в своей программе:
    procedure TfrmMain.TListBox1ItemClick(const Sender: TCustomListBox;
      const Item: TListBoxItem);
    begin
      case TListBox1.ItemIndex of
        0:
        begin
    // действие 1
        end;
        1:
        begin
    // действие 2
        end;
        2:
        begin
    // действие 3
        end;
      end;
    
        Item.IsSelected := False;
        MultiView1.HideMaster;
    end;
    

    - выделение нажатого итема не снимается. Почему?

     

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