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

ListView - DynamicAppearance - header

Вопрос

Не понять, ни в справке найти, ни примеров, как получить текст из header.

Как получить текст из какого-то элемента, есть пример:

lvContacts.Items[li.Index].Objects.FindObjectT<TListItemText>('textTel').Text;

а для заголовка ил подвала не нахожу примеров

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


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

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

  • 0

Я сделал проще.

Я уменьшил высоту header и footer до 1.

К сожалению элементы header и footer удалить нельзя :( не получилось у меня.

Я увеличил основной элемент и добавил 2 текстовые метки.

Теперь к ним можно добраться вот так:

lv1.Items[li.Index].Objects.FindObjectT<TListItemText>('txtHeader').Text;
lv2.Items[li.Index].Objects.FindObjectT<TListItemText>('txtFooter').Text;

Я не понимаю, зачем авторы придумали такой странный способ, что DynamicApearance состоит физически из трёх элементов TlistItem?

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


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

в режиме DynamicAppearance можно удалить и добавить вообще все и заменить все своим

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


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

я через биндинг связал поле таблицы с ItemHeader.text

нужно узнать какой текст в хедере у выбранной строки.

в примере:

- что такое li.index?

- какое имя у хедер объекта? ListView.Items[ListView.ItemIndex].Objects.FindObjectT<TListItemText>('???').Text

пока дублирую связь в поле detal, к которому есть простой доступ через ListView.Items[ListView.ItemIndex].Detail

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


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

в цикле попробовал просмотреть имена объектов, там какие-то просто одиночные латинские символы.

хедер оказался под именем 'D'

в IDE это имя можно где-то увидеть\изменить?

по какому принципу назначаются имена?

з.ы.

блин, это оказалось поле detail а хедера там нет..

вопрос открытый ))

Изменено пользователем Игорь Маринин

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


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

что ж у вас так запутанно-то всё

procedure TfMain.b1Click(Sender: TObject);
var
  li:TListViewItem;
begin
  li := lv1.Items[0];
  ShowMessage(li.text);
end;

procedure TfMain.FormCreate(Sender: TObject);
var li:TListViewItem;
begin
  li := lv1.Items.Add;
  li.Purpose := TListItemPurpose.Header;
  li.Text := '12345';
  li.Detail :='67890';

end;

 

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


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

Header потомок ListView  в свое время анализируя потомков ( используя метод  ClassName ) достукивался к TListBoxHeader  и его содержимого которое тоже было контейнером с потомками(измененный стиль)

Вот такой грязный трюк {где OwnList asTListBox}

 if ((assigned(OwnList.Children.Items[3].Children)) and
    ((OwnList.Children.Items[3].Children.Items[0]) is TListBoxHeader  ))......

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

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


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

а если еще подумать, то это окажется то же самое )))

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


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

 ))

9 минут назад, krapotkin сказал:

а если еще подумать, то это окажется то же самое )))

Вы совершенно правы ;), Вероятность что   ListView и ListBox структурно расположат потомков Header, ListItem, Footer одинаково, очень велика, но проверить не мешает ,  и вообще сила FMX- все контейнеры !!!. через родитель-потомок можно добраться везде !  ну или почти ;)

 

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

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


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

найти текст хедера по выбранному итему можно так:

       i:= ListView.ItemIndex;
       while (i >=0) and (ListView.Items.Purpose <> TListItemPurpose.Header) do dec(i);

       HeaderText:= ListView.Items.Text;

я думал есть какая-то связь и по ListView.ItemIndex можно было бы узнать по какому там хедеру сгруппировано.

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


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

я думал есть какая-то связь и по ListView.ItemIndex можно было бы узнать по какому там хедеру сгруппировано.

в базе более 50 тысяч записей. без фильтрации сразу их выводить занимает достаточное время.

решил убрать биддинги и заполнять лист динамически самому. дать порцию например в раз десять больше чем видимые на экране и далее если клиент прокручивает список добавлять по ходу порции.

подскажите пожалуйста, какое событие отлавливать, что бы дописать очередную порцию данных когда клиент при пролистывании списка походит к концу?

давно уже все говорили, что все эти биндинги плохо решают реальные задачи

бесконечная прокрутка должна реализовываться как удаление итемов из направления "позади" и добавление в направление "впереди" в зависимости от направления прокрутки

обработчик OnScrollViewChange. направление прокрутки определять самостоятельно

при достижении некоторого индекса нужно запускать поток, который запрашивает новую порцию данных

когда поток заканчивается, данные подгружать в ListView

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


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

да, я смотрел на обработчик OnScrollViewChange.

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

listView.ItemIndex указывает на выбранный итем, а тут нужно как-то узнать ItemIndex верхнего\нижнего отрисовываемого  итема, что бы понять что прокрутка доходит до конца и нужно подтянуть следующую порцию данных.

или какое-то событие типа OnScrollEnd

Изменено пользователем Игорь Маринин

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


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

да, я смотрел на обработчик OnScrollViewChange.

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

listView.ItemIndex указывает на выбранный итем, а тут нужно как-то узнать ItemIndex верхнего\нижнего отрисовываемого  итема, что бы понять что прокрутка доходит до конца и нужно подтянуть следующую порцию данных.

или какое-то событие типа OnScrollEnd.

не вкурсе, может где-то запрятано такое событие?

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


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

OnPullRefresh

но это неспортивно )

надо пытаться заранее, а не когда уже всё

у listView есть ScrollViewPos

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

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


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

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

OnPullRefresh - это событие, когда пользователь на первом элементе крутит вверх.

используется для обновления данных. а тут чуть другое. 

попробую определять верхний индекс итема через

  indx := Trunc(ListView.ScrollViewPos / ListView.ItemAppearance.ItemHeight);

далее прибавить кол. видимых итемов (ListView.Height / ListView.ItemAppearance.ItemHeight) и узнать примерно подходим мы к концу или нет.

 

Изменено пользователем Игорь Маринин

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
В 19.04.2018 в 19:43, Игорь Маринин сказал:

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

OnPullRefresh - это событие, когда пользователь на первом элементе крутит вверх.

используется для обновления данных. а тут чуть другое. 

попробую определять верхний индекс итема через

  indx := Trunc(ListView.ScrollViewPos / ListView.ItemAppearance.ItemHeight);

далее прибавить кол. видимых итемов (ListView.Height / ListView.ItemAppearance.ItemHeight) и узнать примерно подходим мы к концу или нет.

 

проще использовать ModernLV, там это есть

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


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

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

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

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

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

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

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

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

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


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

    • От 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, которые на букву Б) и так далее.
       
      Пример:
       
    • От Olexander Sagaydak
      Летом 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
       
    • От x11
      Не могу понять, как записать текст в Footer text
       
       

    • От Mars M
      Загружаю большой список в ListView, время загрузки где то 5-7 секунд.
      Это много, по этому переделал что бы список загружался динамически, как к концу пролистывается, подгружаются новые данные.
      Все бы хорошо, но вот ScrollBar при загрузке новых данных меняет размер и позицию. 
      Это не очень нравиться
      Можно как то заранее настроить его размер под конечное число итемов?
      Или может как то по другому сделать.
  • Последние посетители   0 пользователей онлайн

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

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