FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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 |
#2
|
||||
|
||||
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 |
#3
|
|||
|
|||
conoces algun componente en particular que me puedas recomendar
|
#4
|
||||
|
||||
Cita:
// Saludos |
#5
|
|||
|
|||
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. |
#6
|
|||
|
|||
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
|
#7
|
|||
|
|||
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. |
#8
|
|||
|
|||
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; |
#9
|
||||
|
||||
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 |
|
|
|