VirtualStringTree - Правильный способ добавления / обработки подузлов / дочерних узлов при использовании объектов?

Я использую Delphi2010 и пытаюсь обойтись вокруг с помощью VirtualStringTree.

Я пытался заставить его работать с объектами, и мне не удавалось, пока я не последовал руководству Филиппа Френзеля Virtual TreeView, которое я нашел на веб-сайте soft-gems.net. То, что я придумал, работает, но я не думаю, что правильно обрабатываю подузлы (то есть дочерние узлы).

Единственное, что мне удалось заставить работать, - это снова связать весь объект для каждого дочернего элемента, а затем просто отобразить нужное мне поле - но это просто кажется неправильным.

Мы очень ценим предложения / отзывы.


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

  • Роберт Лейн
    • Мужчина
    • 35
    • Лос-Анджелес
    • Брюнетка
  • Джейн Доу
    • Женский
    • 19
    • Денвер
    • Рыжий

Так устроен мой класс.

type
  PTreeData = ^TTreeData;
  TTreeData = record
    FObject : TObject;
  end;

  TCustomerNode = class(TObject)
  private
    fName: string;
    fSex: string;
    fAge: integer;
    fHair: string;
    //...
  public
    property Name: string read fName write fName;
    //...
  end;

Как только я заполняю объекты, я добавляю их в другой класс (CustomerObjectList) на основе TList, упомянутого ниже.

Здесь я подключаю VirtualStringTree к моему списку объектов

procedure TfrmMain.btnLoadDataClick(Sender: TObject);
var
  i, j : integer;
  CustomerDataObject: TCustomerNode;
  RootXNode, XNode: PVirtualNode;
  Data: PTreeData;
begin
  vstree.NodeDataSize := SizeOf( TTreeData );

  vstree.BeginUpdate;
  for i := 0 to CustomerObjectList.Count - 1 do
  begin
    CustomerDataObject := CustomerObjectList[i];

    //load data for parent node
    RootXNode := vstree.AddChild(nil);
    Data  := vstree.GetNodeData(RootXNode);
    Data^.FObject:= PINodeSource;

    //now add children for rest of fields
    //Isn't there a better way to do this?
    for j := 1 to NUMBERofFIELDS -1 do  //first field is label for parent so -1
    begin
      XNode := vstree.AddChild(RootXNode);
      Data  := vstree.GetNodeData(XNode);
      Data^.FObject:= PINodeSource;
    end;

  end;
  vstree.EndUpdate; 
end;    

procedure TfrmMain.vstreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
 Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);
var
  Data : PTreeData;
begin
  Data := vstObjects.GetNodeData(Node);
  ////if Node.ChildCount  = 0 then //edit - oops typo!
  if Node.ChildCount  > 0 then
  begin
    CellText := TCustomerNode(Data.FObject).Name;
    exit;
  end;

  //handle childnodes
  case Node.Index of
    0:  CellText := TCustomerNode(Data.FObject).Sex;
    1:  CellText := IntToStr(TCustomerNode(Data.FObject).Age);
    2:  CellText := TCustomerNode(Data.FObject).Hair;
    3:  CellText := TCustomerNode(Data.FObject).City;
  end;  
end;
5
задан Ian Boyd 18 July 2018 в 20:49
поделиться