Ver Mensaje Individual
  #4  
Antiguo 29-04-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 29
Lepe Va por buen camino
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 [-]

// definimos el registro:
 TRecBase = record
    Nombre:string[50];
    direccion :string[80];   
    Nivel: Integer;
  end;
  PTrecBase = ^trecbase; // puntero al registro, se usa siempre.

procedure TFrmPrevFact.FormCreate(Sender: TObject);
begin
  arbol.NodeDataSize := SizeOf(TRecbase);
  // le decimos el tamaño del registro
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;
  // añadimos casilla de verificación o CheckBox a cada nodo
end;
end;


procedure TFrmPrevFact.arbolGetText(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
  var CellText: WideString);
var
  pRec: ^TRecBase;
begin
  pRec := Sender.GetNodeData(node);
// según la columna, ponemos un dato u otro.
  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 [-]

// definimos el registro:
  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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita