Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Cargar un TTreeView desde una tabla (https://www.clubdelphi.com/foros/showthread.php?t=9019)

hibero 10-04-2004 18:43:16

Cargar un TTreeView desde una tabla
 
Necesito cargar un ttreeview desde una base de datos. Necsito información sobre cual es el metodo mas rápido para hacerlo

gracias

roman 10-04-2004 20:22:10

Podrías buscar en torry alguna componente TreeView "db aware" que quizá sería lo óptimo. Manualmente quizá podrías optar por cargar los nodos de un nivel y cargar los hijos sólo cuando el usuario expanda un nodo. Para ello, al insertar un nodo debes poner su propiedad HasChildren en true y controlar el evento OnExpand (te lo estoy diciendo un poco de memoria pero es algo así). En este evento leerías los subnodos (nuevamente sólo un nivel) sin leer subnodos de tercer nivel y así sucesivamente.

// Saludos

hibero 10-04-2004 20:34:11

conoces algun componente en particular que me puedas recomendar

roman 10-04-2004 20:45:00

Cita:

Empezado por hibero
conoces algun componente en particular que me puedas recomendar

Realmente no. Me viene en mente el VirtualTreeView que, a juzgar por los demos que incluye es verdaderamente sorprendente y en la página viene un descendiente para bases de datos. El problema con esta componente, según yo lo veo es que es un poco difícil comenzar a aprender a usarlo. Yo mismo no lo he hecho por falta de tiempo pero vale la pena. El control combina las capacidades de un TreeView y un ListView y sus resultados en cuanto a posibilidades de presentación son magníficos.

// Saludos

arj2000 07-06-2004 12:20:02

Como lo hago yo
 
El otro dia empecé un proyectillo que leia la informacion de una unidad, guardando los datos en una DB (carpetas, ficheros, tamaños, fechas, atributos, etc...).

Pues el TTreeView me daba problemas y encontré una solución bastante rápida:

El tema está en que cuando guardo los datos de las carpetas en la base de datos tengo un campo donde le indico la profundidad de dicha carpeta, y además los guardo por profundidad (C:\, C:\A, C:\A\B, C:\A\B\C, C:\D, ...). Para cargarlos después en un TTreeView hago:

1. Cargo un nombre de carpetas de la DB.
2. Le añado el carácter #9 (tab) tantas veces como profundidad tenga
3. Inserto el nombre modificado en un TListBox
4. Repito desde el 1 hasta que tenga ganas :)
5. Guardo el TListBox en un fichero temporal (C:\TEMP123.TMP)
6. Cargo el fichero con el TTreeView
7. Elimino el archivo temporal

Va muy bien en serio. Eso si: la base de datos ha de estar ordenada por profundidad para que todo sea correcto.

arj2000 07-06-2004 12:25:34

mini-apunte
 
Se me olvidaba deciros que para posteriormente desde el TTreeView a la base de datos se debe hacer con el AbsoluteIndex, lo que implica que en la tabla se ha de tener un indice absoluto de todas las filas :(

hibero 08-06-2004 21:54:12

gracias por vuestras respuestas
 
gracias por vuestras respuestas. Yo finalmente me lo he solucionado con un TTreeView:
No cargo el arbol de golpe, sino que cargo la parte que me interesa justo cuando hago clic sobre un signo + del arbol, en el evento onexpanding.

didier 15-07-2004 19:15:23

como cargar una tabla en un tTreeVieu
 
Adjunto codigo, con cortes de control

chao


procedure Tfrmmaestrochecklist.CargaTrv;
var
tnode, tnode0, tnode1, tnode2 : TTreeNode;

begin

Trv.Items.Clear;

tnode := TtreeNode.Create(Trv.Items);
tnode0 := TtreeNode.Create(Trv.Items);
tnode1 := TtreeNode.Create(Trv.Items);
tnode2 := TtreeNode.Create(Trv.Items);


qry.close;
qry.DatabaseName := gv_basedatos;
qry.RequestLive := false;
qry.sql.Clear;
qry.SQL.Add('select seccion from maestrochecklist ');
qry.SQL.Add('group by seccion order by seccion');
qry.Open;
while not qry.eof do
begin
tnode0 := Trv.Items.Add(tnode,qry.fieldbyname('seccion').asstring);
tnode0.ImageIndex := 0;
tnode0.SelectedIndex := 0;

qry0.close;
qry0.DatabaseName := gv_basedatos;
qry0.RequestLive := false;
qry0.sql.Clear;
qry0.SQL.Add('select item from maestrochecklist ');
qry0.SQL.Add('where seccion = :v_sec ');
qry0.SQL.Add('group by item order by item');
qry0.ParamByName('v_sec').asstring := qry.fieldbyname('seccion').asstring;
qry0.Open;
while not qry0.eof do
begin
tnode1 := Trv.Items.AddChild(tnode0,qry0.fieldbyname('item').asstring);
tnode1.ImageIndex := 1;
tnode1.SelectedIndex := 1;

qry1.close;
qry1.DatabaseName := gv_basedatos;
qry1.RequestLive := false;
qry1.sql.Clear;
qry1.SQL.Add('select subitem from maestrochecklist ');
qry1.SQL.Add('where seccion = :v_sec and item = :v_ite');
qry1.SQL.Add('group by subitem order by subitem');
qry1.ParamByName('v_sec').asstring := qry.fieldbyname('seccion').asstring;
qry1.ParamByName('v_ite').asstring := qry0.fieldbyname('item').asstring;
qry1.Open;
while not qry1.eof do
begin
tnode2 := Trv.Items.AddChild(tnode1,qry1.fieldbyname('subitem').asstring);
tnode2.ImageIndex := 2;
tnode2.SelectedIndex := 2;
qry1.Next;
end;
qry1.close;

qry0.Next;
end;
qry0.close;

qry.Next;
end;
qry.close;


Trv.FullExpand;

roman 15-07-2004 19:43:33

Sólo que de esta forma te cargas todos los registros relacionados de un sólo golpe, lo cual, dependiendo de la cantidad de registros puede tornarse en un proceso sumamente lento.

Lo sugerido anteriormente permite cargar el árbol por etapas solicitando los datos desde la base sólo cuando realmente se desea expandir un nodo.

// Saludos


La franja horaria es GMT +2. Ahora son las 04:34:35.

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