Ver Mensaje Individual
  #2  
Antiguo 18-09-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 29
Lepe Va por buen camino
Por el index no lo he hecho nunca, siempre a partir de un nodo, la sintaxis es:

Código Delphi [-]

//definimos un registro asociado a cada nodo
type   TRecBase = record
    Obj:   TObject;
  end;
  PTrecBase = ^trecbase;


var Result :PVirtualNode;
begin
// añado el nodo al arbol
  Result   := arbol.AddChild(NodoCliente); 

// saco los datos asociados, (estará en blanco, porque está recien creado)
  prec     := arbol.GetNodeData(Result); 

// Creo un Objeto de factura asociado a ese nodo.
  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);// del nodo actual, sacamos el registro asociado
  if pRec.Obj <> NIL then
    if TextType = ttnormal then 
    begin
// Obviamente CellText es el texto que se va a mostrar en el Arbol.
          case Column of // saco el texto guardado en mi objeto
            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' // esto es si tu arbol permite 
     // StaticText, es decir, un texto adicional a la columna principal del 
    // Virtual Treeview, no es editable este texto, pero algunas veces es 
   // muy util.

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 // Guardo el texto del usuario en mi objeto.
            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.

Última edición por Lepe fecha: 18-09-2005 a las 12:43:11.
Responder Con Cita