-
Похожий контент
-
От krapotkin
Всем привет!
После долгого творческого запоя я запилил альфу либы, которая позволяет юзать обычный, не-генномодифицированный ListView.
Данные подаются в виде модели данных, описание раскладки итема лежит в JSON.
Для работы пишется примитивный наследник класса-адаптера, который биндит данные модели на элементы из JSON. Я решил, что руками делать это дешевле чем через RTTI
{ TMyAdapter } procedure TMyAdapter.SetupDrawableContent(const ADrawable: TListItemDrawable; const AData: TMyData); begin if SameText( ADrawable.Name, 'text') then begin (ADrawable as TListItemText).Text := AData.Text; end else if SameText( ADrawable.Name, 'detail') then begin (ADrawable as TListItemText).Text := AData.Detail; end else if SameText( ADrawable.Name, 'balance') then begin (ADrawable as TListItemText).Text := FormatFloat('0.00', AData.Balance); end else if SameText( ADrawable.Name, 'reserved') then begin (ADrawable as TListItemText).Text := FormatFloat('0.00', AData.Reserved); end end; Главная хитрость и отличие от стандартного DynamicAppearance+LiveBinding - переменная высота итемов ListView и использование арифметики в описании раскладки.
Можно указать Detail.Y = Text.Bottom + 5, ItemHeight = Detail.Bottom + 10, Detail.W = ItemWidth/2 - X
{"Kind":"rect","Name":"BonusRect","Value":"", "Place":{"X":"itemwidth*3/4","Y":"Text.Y","W":"ItemWidth/4-5","H":"50"}, "BorderColor":"#FF005500", "Color":"lime", "LineWidth":3}, {"TextHAlign":2,"TextVAlign":1,"Kind":"text","Name":"Balance","Value":"", "Place":{"X":"BonusRect.x+5","Y":"Text.Y","W":"BonusRect.w-10","H":"50"}, "WordWrap":true, "Color" :"Black", "Font":{"Size":18,"Style":""}} ], "ItemHeight":"detail.bottom+10", Это дает довольно гибкую систему. Не на все случаи жизни, но все, что нужно, можно после автоматической раскладки дополнительно приписать в OnUpdateObjects
Код для работы примерно такой
procedure TForm1.FormCreate(Sender: TObject); begin data:= TMyDataList.CreateFromFile(ExePath()+'data.json'); // загрузка в модель данных Adapter := TMyAdapter.Create(lvWallets, data.Items, ExePath()+'pattern.json'); // создание адаптера и загрузка шаблона Adapter.Pattern.SetupListView(lvWallets); // задать отступы и разную мелочь Adapter.ResetView(); // здесь в цикле из модели данных создается нужное количество итемов ListView end; procedure TForm1.lvWalletsUpdatingObjects(const Sender: TObject; const AItem: TListViewItem; var AHandled: Boolean); begin Adapter.SetupContent(AItem); // загрузить текст, картинки и другое содержимое в элементы итема Adapter.Pattern.DoLayout(AItem); // поправить раскладку в соответствии с содержимым элементов итема end; Для использования кроме стандартных - текст, картинка, кнопка - создано несколько дополнительных элементов итема - прямоугольник, круг, уголок, линия.
Отличие от ModernLV - ,
1) все происходит без правки системных файлов
2) пока нет колонок и других особых изысков.
На результат работы смотреть тут. Исходники пока не причесаны, будут чуть позже
ListViewFramework.7z
-
От Dmitry Stolyarov
Добрый день, подскажите, пжл, новичку...
Есть ListView и ImageList с двумя картинками. В ListView Item добавлен Image. ListView заполняю из БД и пытаюсь вывести картинку в зависимости от значения поля БД, но в независимости от значения БД выводится одна и та же картинка.. Такое нельзя провернуть?
procedure TForm6.ListViewNAMEUpdateObjects(const Sender: TObject;
const AItem: TListViewItem);
var IItem:TListItemImage;
begin
IItem:= aItem.Objects.FindDrawable('Image4') as TListItemImage;
if (IItem<>nil) then
with FDQuery1 do
begin
First;
while not Eof do
begin
if FDQuery1FK_PRICE.AsInteger = 1 then begin
IItem.ImageIndex:=1
end else
begin
IItem.OwnsBitmap := True;
IItem.ImageIndex:=0;
end;
Next;
end;
end;
end;
-
От gresaggr
Добрый день.
Как под FMX в ListView сделать подчеркивание Detail в рантайме?
Пытался делать так:
LV.ItemAppearanceObjects.ItemObjects.Detail.Font.Style := [TFontStyle.fsUnderline]
но не срабатывает.
P.S. Возможно это применить не ко всем строкам, а только к некоторым?
-
От ice donkey
Заполняю ListView в рантайме:
LiveBindings не подходит, поэтому есть вопрос: а как задать фиксированный заголовок - чтобы в списке все Items, начинающиеся с буквы А были как бы объединены под одним заголовком А? Который в свою очередь смещался бы только заголовком Б (с Items, которые на букву Б) и так далее.
Пример:
-
От Sati
Летом 2016 вопрос отображения объектов в ListView при создании Items уже обсуждался. Хочу ещё раз обсудить этот вопрос. А именно:
Простой код
ListViewItem := ListView.Items.Add;
ListViewItem.Objects.AccessoryObject.Visible := false; (или true, не важно)
вторая строка не работает если до выполнения, ListView ни одного раза не отображался. Если же отображался хотя бы один раз - всё нормально.
В предыдущих обсуждениях Krapotkin рекомендовал Resize и OnUpdateObjects. Если нет идей проще, то, конечно, воспользуюсь.
-
От x11
Если у элементов, идущих подряд одинаковый текст, то текст скрывается.
Как это это отключить?
-
От Erlan_krg
Всем привет! Встретился с одной проблемой. Удаляю Item у ListView по нажатию кнопки, которая находится на ListViewItem
procedure TfmAppointment.lvSelectedServicesButtonClick(const Sender: TObject;
const AItem: TListItem; const AObject: TListItemSimpleControl);
begin
lvSelectedServices.BeginUpdate;
if lvSelectedServices.ItemCount > 0 then
lvSelectedServices.Items.Delete(AItem.Index);
lvSelectedServices.EndUpdate;
end;
итем удаляется, но потом выскакивает ошибка Access violation at address 60BCB318 и то се бо се
у ListView ItemAppearance выставлен на DynamicAppearance
помимо родного объекта Text добавил еще один объект Text и кнопку
но фишка в чем, если убрать дополнительный объект Text с ListWiewItem и удалить итем то ошибка не выскакивает)
что за прикол?
-
От sinuke
Доброго дня, форумчане
Возникла проблема с тем, чтобы поменять местами два итема в ListView. ListView.Items не имеет метода Exchange, сами итемы не имеют метода Assign чтобы можно было один итем клонировать в другой / удалить / вставить
У кого какие мысли? Как реализовать?
Delphi 10.2 Tokyo
-
От Mars M
Загружаю большой список в ListView, время загрузки где то 5-7 секунд.
Это много, по этому переделал что бы список загружался динамически, как к концу пролистывается, подгружаются новые данные.
Все бы хорошо, но вот ScrollBar при загрузке новых данных меняет размер и позицию.
Это не очень нравиться
Можно как то заранее настроить его размер под конечное число итемов?
Или может как то по другому сделать.
-
-
Последние посетители 0 пользователей онлайн
Ни одного зарегистрированного пользователя не просматривает данную страницу