• 0
x11

ListView - DynamicAppearance - header

Вопросы

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

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

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

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

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


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

16 ответов на этот вопрос

  • 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) и узнать примерно подходим мы к концу или нет.

 

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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


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

    • От 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 при загрузке новых данных меняет размер и позицию. 
      Это не очень нравиться
      Можно как то заранее настроить его размер под конечное число итемов?
      Или может как то по другому сделать.
    • От ENERGY
      Привет.
      Я к своему стыду так и не научился толком работать с TListView. 
      TListBox это сделать просто, а вот как это сделать в TListView... Это сложный компонент.
      Подскажите как правильно реализовать.
      Нужно добавить с правой стороны каждого Item иконку избранное, которая работала бы как чекбокс - если нажать по ней то звездочка становится желтой и без заливки (Checked/unchecked) .
      Насколько я понял в GlyphButton нельзя добавить картинку.. Как же тогда это сделать?
      Спасибо.
  • Последние посетители   0 пользователей онлайн

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