I'm attempting to implement virtual data mode with EasyListview

In the demo :

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;

Basically then add products that are string :

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;

Ways to get and exhibiting the saved virtual caption(=string) when LVItemGetCaption has been known as?

Basically obtain the caption with Caption := LV.Items.Items[Item.Index].Caption ; then Stack overflow.

You have to add your computer data resist the product. E.g.:

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;

You should also free your object:

procedure TForm1.EasyListview1ItemFreeing(Sender: TCustomEasyListview; Item: TEasyItem);
begin
  if Assigned(Item.Data) then
    Item.Data.Free;
end;

Virtual nodes are the ones that do not store their data. They are just sights of information you're likely to curently have in certain other data structure of the program. Once the control must display a node, it asks your program what text it will use by firing the OnItemGetCaption event.

Actually, it'll call the big event whenever it must know the need for the Caption property, then when you attempt to handle caption-fetching event by fetching the need for the caption, you trigger infinite recursion.