Ya le respondí a Chandra por privado (tal y como me pidió), pero dado que es costumbre poner las cosas en el foro para que esté a disposición de todos, ahí va (ampliando un poquito más):
La filosofía es usar un tipo Record que se asocia con todos los nodos del árbol. Cuando se quiere poner un dato en una columna, se debe usar el evento GetText, y pasar el campo de un registro a la columna que se quiera.
También se puede usar el evento OnPaintCell para ajustar las fuentes, el color de fondo, color de celda, etc.
Código Delphi
[-]
TRecBase = record
Nombre:string[50];
direccion :string[80];
Nivel: Integer;
end;
PTrecBase = ^trecbase;
procedure TFrmPrevFact.FormCreate(Sender: TObject);
begin
arbol.NodeDataSize := SizeOf(TRecbase);
end;
Procedure TFrmPrevFact.Crea4Nodos;
var
prec: PTrecBase;
var i:integer;
begin
for i:= 0 to 3 do
begin
Result := arbol.AddChild(NIL);
prec := arbol.GetNodeData(Result);
prec.Nombre := 'nombre ' + inttostr(i);
prec.direccion := 'direccion ' + inttostr(i);
prec.nivel := i;
end;
end;
procedure TFrmPrevFact.arbolInitNode(Sender: TBaseVirtualTree;
ParentNode, Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
pRec: ^TRecBase;
begin
Sender.CheckType[Node] := ctTriStateCheckBox;
Sender.CheckState[Node] := csCheckedNormal;
end;
end;
procedure TFrmPrevFact.arbolGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: WideString);
var
pRec: ^TRecBase;
begin
pRec := Sender.GetNodeData(node);
case Column of
1: CellText := prec.Nombre;
2: CellText := prec.direccion;
3: CellText := prec.Nivel
end;
end;
Para hacerlo más potente, se puede crear un objeto dentro del registro, así puedes almacenar elementos heterogéneos.
Código Delphi
[-]
TNodoBase = class (TObject);
TRecBase = record
Obj: TNodoBase;
Nivel: Integer;
end;
PTrecBase = ^trecbase;
TObjEmpresa = class (TNodoBase)
public
Id: String;
Alias: String;
TotalFacturado: Currency;
end;
TObjCliente = class (tnodobase)
public
IdCliente: Integer;
Denominacion: String;
end;
TObjFactura = class (tnodobase)
public
NFactura: String;
end;
pero aquí ya depende tu pericia como programador y el nivel que tengas de programación orientada a objetos.
Ahora en el GetText podríamos hacer algo así:
Código Delphi
[-]
procedure TFrmPrevFact.arbolGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: WideString);
var
pRec: ^TRecBase;
begin
pRec := Sender.GetNodeData(node);
if prec.Object is TObjEmpresa then
With TObjEmpresa(prec.Object) do
case Column of
1: CellText := id;
2: CellText := alias;
3: CellText := CurToString(totalFacturado);
end
else if prec.Obj is TObjCliente then
With TObjCliente(prec.Object) do
case Column of
1: CellText := Inttostr(idCliente);
2: CellText := Denominacion;
3: CellText := '';
end;
end;
Saludos