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

[TListView] Как получить доступ к Header по выделенному итему?


loony-pants

Вопрос

Доброе время суток! Есть приложение, одна из функций которого - Искать в базе данных необходимые Items и при выдаче результатов выбранный item должен попасть в заданный ему StringGrid (ну или в Memo - это не главное). При этом для удобства сортировки в базе данных (StringGrid , с привязкой BindSourceDB2) с items  создана отдельная колонка (в ней указано к какой группе принадлежит item), которая привязана к ItemHeader.Text в LiveBindings. В самом ListView всё довольно удачно сортируется - нужные Items под нужным Header, но когда я выбираю тот или иной item я не могу получить свойство Header у Selected item - его вообще нет в базе (но привязка в LiveBindings есть)

 

if ListView1.Selected. ??????  then 
 
begin
 
StringGrid2.RowCount:=StringGrid2.RowCount+1;
StringGrid2.Cells [0,StringGrid2.RowCount - 1]:= ListView1.Selected.Text;
 
end;
 
if ListView1.Selected. ??????  then 
 
begin
 
StringGrid3.RowCount:=StringGrid3.RowCount+1;
StringGrid3.Cells [0,StringGrid3.RowCount - 1]:= ListView1.Selected.Text;
 
end;
 
Суть вопроса 0 Что необходимо подставить  вместо ??????, чтобы получить значение Header у выбранного мной item ?
Ссылка на комментарий

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

  • 0
  • Администраторы

На сколько я вижу, то хедер оформляется как TListViewItem, у которого свойство Purpose равно Header. Я вижу такой алгоритм получения хедера:

uses
  System.Math;

{$R *.fmx}

function ExtractGroupHeaderItem(Items: TListViewItems; Selected: TListViewItem): TListViewItem;
var
  PreviousItem: TListItem;
  Index: Integer;
begin
  Assert(Items <> nil);
  Assert(Selected <> nil);

  Index := Selected.Index;
  while InRange(Index, 0, Items.Count - 1) and (Items[Index].Purpose <> TListItemPurpose.Header) do
    Index := Index - 1;

  if InRange(Index, 0, Items.Count - 1) then
    Result := Items[Index]
  else
    Result := nil;
end;

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

ExtractGroupHeaderItem(ListView1.Items, ListView1.Selected);
Ссылка на комментарий
  • 0
ExtractGroupHeaderItem(ListView1.Items, ListView1.Selected);
Спасибо, всё заработало ) Век живи , век учись )
 
Но я также нашёл решение своей проблемы другим способом - не через header:
В  ListView  свойство  ItemAppearance выбрал ImageListItemBottomDetailRightButton. Затем в LiveBindings у ListView >> Item.Detail  привязал к моей колонке StringGrid через  BindSourceDB и прописал код:

 

procedure TForm1.ListView1ItemClick(const Sender: TObject;

  const AItem: TListViewItem);
begin
if ListView1.Selected.Detail='Выключатель нагрузки' then
begin
 
StringGrid2.RowCount:=StringGrid2.RowCount+1;
StringGrid2.Cells [0,StringGrid2.RowCount - 1]:= ListView1.Selected.Text;
StringGrid2.Cells [1,StringGrid2.RowCount - 1]:= ListView1.Selected.ButtonText;
end;
if ListView1.Selected.Detail='Разъединитель высоковольтный' then
begin
 
StringGrid3.RowCount:=StringGrid3.RowCount+1;
StringGrid3.Cells [0,StringGrid3.RowCount - 1]:= ListView1.Selected.Text;
StringGrid3.Cells [1,StringGrid3.RowCount - 1]:= ListView1.Selected.ButtonText;
end;

 

:)
 
 
 
 

 

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

 

Я неверно выразился. Я просто его не вижу в базе )))

 

Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...