Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Tutorial del VirtualTreeview (https://www.clubdelphi.com/foros/showthread.php?t=43017)

Chandra 28-04-2007 18:27:28

Tutorial del VirtualTreeview
 
Hola.

Llevo semanas intentando encontrar por internet algún manualillo o tutorial para aprender a usar el VirtualTreeview, pero no encuentro nada en español.

Ya sé que en la web del componente hay un magnífico manual con ejemplos en pdf... pero está en inglés:( y, aunque normalmente me defiendo bien con el inglés, para cosas así muy nuevas para mí, como éste componente, digamos que me hago un lio :confused:.

Y es que, como el componente además se pone "espeso" con los punteros y las mil y una posibilidades que tiene (y, para colmo, yo quiero usarlo para bases de datos), pues la verdad es que se me hace muy cuesta arriba hincarle el diente.

Me he bajado todos los ejemplos que he podido encontrar (VST_DatabaseExample, VirtualStringTree, etc...), pero así, a pelo, es como intentar descifrar una transmisión alienígena.:eek:

¿Existe algún manualillo básico en español, para luego continuar yo ya en inglés?


Gracias

Maury Manosalva 28-04-2007 20:39:28

TreeView BD
 
que quieres hacer con el treeview?

Chandra 28-04-2007 21:01:34

Se supone que el usuario va creando categorías en una base de datos (carpetas o contenedores) que, a su vez, pueden contener más subcategorías (subcarpetas) o, directamente, datos (por ejemplo, texto, imágenes, campos binarios para representar cualquier tipo de información...)

Es una especie de Explorador de archivos, pero en base de datos. Los "archivos" serían los datos y las carpetas serían la forma en que el usuario categoriza la información.

No sé si me explico...

Es una extructura que se puede aplicar a casi cualquier tipo de información categorializable: una colección de música (con géneros y subgéneros con varios niveles de anidamiento... y campos binarios para contener la propia música), un videoclúb (géneros y subgéneros y fichas con la película), una biblioteca (lo mismo... géneros, subgéneros y más subgéneros y, al final, la ficha del libro).

Pues eso, que yo quiero traducir la estructura gerárquica a una estructura arbórea y representarla. He hecho pruebas con un TTreeView de Delphi, pero cuando pasas de 10.000 o 20.000 registros, la cosa se hace insostenible, por el tiempo que tarda en reconstruir el árbol (unos 10 segundos con 20.000 nodos). En los ejemplos que he visto del VirtualTreeview aguanta mucho más (siempre que no le metas más de 5 millones de registros, porque entonces también se hace insostenible su utilización).

Pues eso :)

Lepe 29-04-2007 02:35:06

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

Chandra 29-04-2007 02:59:43

Muchísimas gracias, Lepe.

Estoy analizándo todo lo que me pones y, la verdad, ya sí parece más abordable que hincarle el diente en inglés de primeras;).

Lo dicho, muchas gracias; sigo mirándomelo con detenimento.

Chandra 02-05-2007 18:56:41

Pero qué burro soy...
 
Me acabo de dar cuenta de que estaba rompiéndome los cuernos con el documento:

- "Virtual Treeview Help (pdf)"
(http://www.soft-gems.net/supplement/download.php?ID=67)

...y no había visto más abajo otro más corto y accesible, que va directamente al grano:

- "Virtual Treeview Tutorial translation"
English translation of the german VT tutorial written by Phillip Frenzel (PDF)
(http://www.soft-gems.net/supplement/download.php?ID=79)

Éste último es el que debería de haberme leído desde un principio :o.

Ahora sí que resulta comprensible el compo ;)


La franja horaria es GMT +2. Ahora son las 15:13:14.

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