Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-09-2005
porreres porreres is offline
Registrado
 
Registrado: sep 2005
Posts: 3
Poder: 0
porreres Va por buen camino
Wink VirtualTreeview

Agradecería si alguien me indicase cómo se hace para poder añadir
un "nodo hijo" a un nodo determinado.
p.e. : Añadir al nodo cuyo index es el nº3 del VirtualTreeview, un nodo hijo y ponerle luego un nombre.

Muchas gracias.
Responder Con Cita
  #2  
Antiguo 18-09-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
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 13:43:11.
Responder Con Cita
  #3  
Antiguo 18-09-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Yo he usado un Objeto dentro del registro asociado, pero puede hacerse de otra forma, por ejemplo:

Código Delphi [-]
type   TRecBase = record
              col1IdCliente:integer;
              col2Nombre:String;
              col3Direccion:String;
  end;
  PTrecBase = ^trecbase;

De esta forma, sabes que en la columna 1 irá el IdCliente, y puede ser más facil la codificación.

Un saludo de nuevo.
Responder Con Cita
  #4  
Antiguo 18-09-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Parece que no se entiende como funciona el VT, así que vamos con Aristóteles:

Filosofía del VirtualTreeview:

Primero hay que entender que su funcionamiento es muy distinto al que trae delphi.

La maravilla de este componente es que en apariencia, puede ser un Treeview + Grid de delphi, con checkbox independientes para cada nodo, es decir, para un nodo (o fila de datos), se puede ocultar el Checkbox.

Cada "celda", puede tener una fuente distinta, negrita, subrayados, etc. Por tanto la apariencia visual queda limitada a la imaginación del programador... vamos... casi nada .

Al ser un componente tan general, y que permite tantas opciones, es normal que todo ha de hacerse por código

Como cada celda tiene muchos parámetros modificables,, en el nodo de un Treeview, no se guarda NADA. Todo lo que quiera mostrarse en un nodo determinado, debe hacerse mediante un registro auxiliar (TRecBase), en ese registro, guardamos la información a mostrar en todas las columnas. Al tiempo de mostrar el arbol, es cuando le decimos por código, que dato va en cada columna.

Al tiempo de mostrar el arbol, es cuando se lanza una serie de eventos que tenemos que controlar. Los más útiles son:

- BeforeCellPaint (podemos cambiar el color de fondo de una celda, por ejemplo).
- GetText (texto que se mostrará en una columna y fila determinada)
- PaintText (usado para modificar la fuente usada en esa celda)

La creación de un nodo (padre, hijo) es bastante facil, su definición es esta:
Código Delphi [-]
    function AddChild(Parent: PVirtualNode; UserData: Pointer = nil): PVirtualNode;
Por tanto necesitamos el nodo padre, el UserData nos olvidamos de él.

Código Delphi [-]
var nodoPadre : PvirtualNode;
     nodoHijo:PvirtualNode;
begin 
  nodoPadre:=   VirtualTreeview1.AddChild(nil);
  nodoHijo   := VirtualTreeview1.AddChild(nodoPadre);
En nodoPadre, tendremos el primer nodo de un Treeview que esté en blanco.
Obviamente nodoHijo, será hijo de su padre

Con esto creamos el nodo, pero la información asociada a cada nodo, tenemos que rellenarlas nosotros. Quiero decir que el VirtualTreeView crea una variable del tipo TRecord por cada nodo creado, pero inicialmente está en blanco, nosotros tenemos que:

- Al crear el nodo: rellenar ese registro.
- Al mostrar el nodo en pantalla: decir qué campo de ese registro se muestra en la columna 1, 2 o en la 3
- Opcionalmente, cambiar la fuente y colores de la celda.

Y todo eso lo hace el ejemplo que he puesto anteriormente que he editado para aclarar algunas cosas.
Responder Con Cita
  #5  
Antiguo 18-09-2005
porreres porreres is offline
Registrado
 
Registrado: sep 2005
Posts: 3
Poder: 0
porreres Va por buen camino
Finalidad de mi consuta

La finalidad de la consulta que he realizado es conseguir traspasar los datos de una tabla db al VirtualTreeview.

Id IdPadre Texto
1 -1 Raiz
2 1 Baleares
3 2 Mallorca
4 2 Menorca
5 2 Ibiza
6 3 Palma
7 3 Porreres

Saludos.

Última edición por porreres fecha: 18-09-2005 a las 17:03:10.
Responder Con Cita
  #6  
Antiguo 18-09-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Gracias Lepe por la información.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 18-09-2005 a las 17:10:51. Razón: Ampliación del texto.
Responder Con Cita
  #7  
Antiguo 18-09-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Desde luego el componente Virtual TreeView parece una joya.

Los interesados pueden informarse en la página Web del mismo.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #8  
Antiguo 19-09-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Existe tambien un VTDBTree para bases de datos, pero la verdad, usando un VTStringTree con un simple bucle, creas el arbol, y además tienes control total sobre cómo quieres añadirlos, así que no lo he usado el componente Dataware.

Un saludo
Responder Con Cita
  #9  
Antiguo 19-09-2005
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Cita:
Empezado por pagina web de VT
Borland Delphi 2005

Written by Borland.

Delphi 2005 is Borland's latest integrated development environment (IDE) and it should not be necessary to explain it to you as Delphi developer. Virtual Treeview is used in several places all over the IDE. See the screen shot where I marked a couple of windows.
Esto no lo sabía, pero me alegra verlo
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 19:58:38.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi