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

ListView - DynamicAppearance - header


x11

Вопрос

Не понять, ни в справке найти, ни примеров, как получить текст из 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

я через биндинг связал поле таблицы с 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

 ))

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 эмодзи.

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

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

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

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