Отображение элемента при вызове LVItemGetCaption с EasyListView? - PullRequest
0 голосов
/ 18 марта 2011

Я пытаюсь реализовать режим виртуальных данных с помощью EasyListview

Из демоверсии:

procedure TForm1.AddItems(Count: Integer);
var
  i: Integer;
begin
  // Add items to the listview. Actually the items are added to the first
  // group. This group is created automatically when the first item is added.
  LV.BeginUpdate;
  try
    for i := 0 to Count - 1 do
      LV.Items.AddVirtual;
  finally
    LV.EndUpdate;
  end;
end;

procedure TForm1.LVItemGetCaption(Sender: TCustomEasyListview;
  const Item: TEasyItem; Column: Integer; var Caption: WideString);
begin
  case Column of
    0: Caption := 'Item ' + IntToStr(Item.Index);
    1: Caption := 'Detail ' + IntToStr(Item.Index);
  end;
end;

Если я добавлю некоторые элементы, которые являются строковыми:

procedure TForm1.AddItems(Count: Integer);
var
  i: Integer;
begin
  // Add items to the listview. Actually the items are added to the first
  // group. This group is created automatically when the first item is added.
  LV.BeginUpdate;
  try
    for i := 0 to Count - 1 do
    begin
      LV.Items.AddVirtual.Caption := 'DISPLAY ME ' + IntToStr(i);
    end;
  finally
    LV.EndUpdate;
  end;
end;

Как получить и отобразить сохраненную виртуальную подпись (= строку) при вызове LVItemGetCaption?

Если я получу подпись с помощью Caption := LV.Items.Items[Item.Index].Caption ;, то переполнение стека.

Ответы [ 2 ]

1 голос
/ 18 марта 2011

Вы должны добавить свой объект данных в элемент.Например:

type
  TMyData = class
    Caption: string;
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  item: TEasyItemVirtual;
  MyData: TMyData;
begin
  EasyListview1.BeginUpdate;
  try
    for i := 0 to 100 - 1 do
    begin
      MyData := TMyData.Create;
      MyData.Caption := Format('My Item %D',[i]);
      item := EasyListview1.Items.AddVirtual;
      item.Data := MyData;
    end;
  finally
    EasyListview1.EndUpdate;
  end;
end;

procedure TForm1.EasyListview1ItemGetCaption(Sender: TCustomEasyListview; Item: TEasyItem;
  Column: Integer; var Caption: WideString);
begin
  case Column of
    0: Caption := TMyData(Item.Data).Caption;
    1: Caption := TMyData(Item.Data).Caption;
  end;
end;

И не забудьте освободить свой объект:

procedure TForm1.EasyListview1ItemFreeing(Sender: TCustomEasyListview; Item: TEasyItem);
begin
  if Assigned(Item.Data) then
    Item.Data.Free;
end;
0 голосов
/ 18 марта 2011

Виртуальные узлы - это те, которые не хранят свои данные.Это всего лишь просмотров данных, которые, как вы ожидаете, уже будут иметься в какой-то другой структуре данных вашей программы.Когда элемент управления должен отобразить узел, он запрашивает у вашей программы, какой текст ему следует использовать, вызывая событие OnItemGetCaption.

Фактически, он будет вызывать событие в любое время, когда ему нужно узнать значение свойства Caption.поэтому, когда вы пытаетесь обработать событие выбора заголовка, выбирая значение заголовка, вы запускаете бесконечную рекурсию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...