Я использую Delphi2010 и пытаюсь обойтись вокруг с помощью VirtualStringTree.
Я пытался заставить его работать с объектами, и мне не удавалось, пока я не последовал руководству Филиппа Френзеля Virtual TreeView, которое я нашел на веб-сайте soft-gems.net. То, что я придумал, работает, но я не думаю, что правильно обрабатываю подузлы (то есть дочерние узлы).
Единственное, что мне удалось заставить работать, - это снова связать весь объект для каждого дочернего элемента, а затем просто отобразить нужное мне поле - но это просто кажется неправильным.
Мы очень ценим предложения / отзывы.
У меня есть список объектов, которые я пытаюсь подключить к VirtualStringTree, где я пытаюсь добиться чего-то вроде этого, где одно из полей будет действовать как метка для родителя, а остальные поля будут отображаться как дочерние узлы. .
Так устроен мой класс.
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;