Por el index no lo he hecho nunca, siempre a partir de un nodo, la sintaxis es:
Código Delphi
[-]
type TRecBase = record
Obj: TObject;
end;
PTrecBase = ^trecbase;
var Result :PVirtualNode;
begin
Result := arbol.AddChild(NodoCliente);
prec := arbol.GetNodeData(Result);
prec.Obj := TObjFactura.Create;
end;
La filosofia es algo distinta, el nombre de ese nodo recien creado se coge del registo asociado, no se guarda con el mismo nodo, por tanto en el evento OnGetText, decidimos el texto que ha de mostrar, según la columna actual:
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.Obj <> NIL then
if TextType = ttnormal then
begin
case Column of COLELEMENTO: CellText :=
TObjEmpresa(prec.Obj).Id + ' - ' + TObjEmpresa(prec.Obj).Alias;
coltotal: CellText :=
Format('%m', [TObjEmpresa(prec.Obj).totalfacturado]);
else CellText := '';
end;
end
else
Celltext := 'Quillo pasa del tema'
Si ademas permites que el usuario pueda editar una "celda", (a través del VTEditor que trae), entonces debes usar el evento OnNewText
Código Delphi
[-]
procedure TFrmPrevFact.arbolNewText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; NewText: WideString);
var dTrecbase;
begin
d:= arbol.getnodedata(Node);
case Column of COLELEMENTO: TObjEmpresa(d.Obj).Id := Newtext;
coltotal: TObjEmpresa(d.Obj).Totalfacturado := StrToFloatDef(NewText,0.00);
end;
Por definición, tienes que añadir siempre este evento, para que el VT sepa cual es el tamaño del registro asociado a cada objeto, y pueda crearlo por tí.
Código Delphi
[-]
procedure TFrmPrevFact.FormCreate(Sender: TObject);
begin
arbol.NodeDataSize := SizeOf(TRecbase);
end;
Si necesitas en algun momento que se "refresque" la información desde los registros asociados a cada nodo, simplemente añades Arbol.Refresh.
EDITO: COLELEMENTO, COLTOTAL, son simples constantes. No suelo recordar si el nombre iba en la columna 1 o en la columna 2, y si el total lo muestro en la columna 3 o en la 4, por tanto, me creo las constantes y me olvido del tema.
En cuanto a crear los nodos por su indice, esto
no es viable. He leido que ese "index" se modifica muy a menudo, y por tanto no identifica a un nodo inequivocamente.
Cita:
Empezado por ayuda de VT
TBaseVirtualTree.AbsoluteIndex
Similar to TotalCount also with AbsoluteIndex the entire tree will be validated, with all consequences like high memory
usage etc. And since Virtual Treeview is a highly changing environment there is not much sense to use the absolute index.
You cannot use it in any method or property of the control.
|
Si necesitas otra cosa, avisa
Un saludo.