-
Постов
203 -
Зарегистрирован
-
Посещение
-
Победитель дней
1
Сообщения, опубликованные HyperZen
-
-
4 часа назад, ZuBy сказал:
высота контента > высоты компонента
В этом месте можно чуть-чуть подробнее? На сколько контент больше по размеру относительно компонента?
Добавив в расчеты 30 пикселей к текущему результату, получил то, что хотел. Но эти 30 пикселей были найдены путем подбора, хотелось бы как то математически обосновать эти цифры:
h := GetTextHeight(AItem.Text, ListView1.Width-16, ListView1.ItemAppearanceObjects.ItemObjects.Text.Font, TTextAlign.Leading); AItem.Height := Trunc(h) + 30;
И какой максимальный текст можно вместить в итем ListView?
-
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;
-
Добрый вечер! Все-таки, как корректно подсчитывать высоту итемов данного компонента, если учитывать, что текст может быть достаточно большим.
Использую код с данного сайта, все работает корректно, пока не встречается текст, чуть больше одного абзаца:
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;
Получаем:
-
А с какого сайта берется информация о гороскопах?
-
Нет. Это все-таки косячок. Я с таким сталкивался, когда пытался выставлять размеры TListView автоматически относительно количества текста.
ПС: так и не победил автоподгон высоты при большом тексте...
Кто-то с этим справился?!
-
1 час назад, d7d1cd сказал:
А ведь можно еще попробовать сделать по-другому: с помощью какой-нибудь программы-монитора "подсмотреть" что отправляет существующее приложение по протоколу TCP/IP. Протокол обмена со счетчиком известен, поэтому, я думаю, будет несложно "разгадать" протокол обмена по веб-интерфейсу (ну если только там нет какого-нибудь шифрования).
По Веб-интерфейсу используйте программу HTTP Analyzer
-
-
А если BorderStyle=None?
Хмм... так хинты высвечиваются только при использовании обычного VCL
А причём тут VCL?
Если создать простой проект VCL Form Application, все работает и со свойством формы BorderStyle = None, хинты высвечиваются, все корректно. А если создать кроссплатформенный проект - хинты с этим свойством не работают.
-
А если BorderStyle=None?
Хмм... так хинты высвечиваются только при использовании обычного VCL
-
-
-
Если у тебя нет подписки, то этот хотфикс ты не сможешь установить. Не берусь гадать, но может заблокировать студию.
А поделиться этим хотфиксом можете?
я так понял он только для update 1?Хотфикс к апдейту http://cc.embarcadero.com/item/30453
Все хотфиксы установлены и чудненько работают Спасибо братьям китайцам
-
Вставьте костыль - перед HideMaster сделайте Application.ProcessMessages
Данный "костыль" не помог в случае Popover Решил проблему, изменив свойство на Drawer
-
Но как то же его можно победить Взять, к примеру, ES проводник, там вверху справа есть меню, с выпадающим (Popover) MultiView, после выбора любого пункта меню, выделение сбрасывается
-
-
-
PS: Delphi Seattle Update 1
-
Ничего не понимаю, создал новый проект, бросил на форму 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;
Все работает Почему в старом проекте наблюдаются такие "глюки"?
-
Если вам подойдет можете на MultiView1 ->OnHidden прописать
ListBox1.ItemIndex:=-1;Удивительно, так тоже не работает! Выделение итема все равно остается...
-
-
Case работает, выделение итема не снимается. Сейчас взял пример из студии (MultiViewDemo) - там оказывается та же проблема... выделение не пропадает...
-
Не помогает, странно...
-
Не могу понять почему так происходит: при клике/тапе по 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;
- выделение нажатого итема не снимается. Почему?
-
Что-то я даже внимания на это не обращал У меня не вызывает это никаких неудобств
Возвращаясь к вопросу о подсчете высоты текста TListView
в TListView
Опубликовано
Спасибо. Но высота каждого Item'а разная, я думал высоту контента конкретного Item'а необходимо учитывать при подсчете.