Usando la vista de árbol en Delphi
// Actualizar árbol 1
procedimiento TMainForm.RefTree();
var
Etiquetas:string ;
RootNode0,RootNode1,RootNode2,.RootNode3,RootNode4,RootNode5: TtreeNode;
i: entero;
Inicio
TreeView1.Items.Clear ;
RootNode0:=TreeView1.Items.Items.Add(nil,'situación');
RootNode4:=TreeView1.Items.Add(nil,'ubicación');
RootNode5:=TreeView1.Items.Add(nil ,'Way');
TreeView1.Items[0].ImageIndex:=11;
TreeView1. Elementos[1].ImageIndex:=54;
TreeView1.Items[2].ImageIndex:=54;
TreeView1.Items[3].ImageIndex:=54; p> p>
TreeView1.Items[4].ImageIndex:=54;
TreeView1.Items[5].ImageIndex:=54;
RootNode0.SelectedIndex:= RootNode0. ImageIndex;
RootNode1.SelectedIndex:=RootNode1.ImageIndex;
RootNode2.SelectedIndex.=RootNode2.ImageIndex;
RootNode3.SelectedIndex:=RootNode3. p>
RootNode5.SelectedIndex:=RootNode5.ImageIndex;
/Sort
Usar DataM.q1 para
comenzar
SQL.Clear;
SQL.Add('Seleccione Nombre1 de Navtree donde etiqueta=''Categoría''');
Abrir;
mientras no comience
comenzar
TreeView1.Items.
AddChild(RootNode1,FieldValues['Name1']);
siguiente;
end;
end;
(omitido aquí 365 palabras.... Oh)
end;
Ejemplo 2
procedimiento TForm1.showtree; //showtree personalizado
var
mynode:ttreenode;
comenzar
con adoquery1
comenzar
cerrar;
p >sql.Clear;
sql.Add('select * from aa donde valor = ''1'');
abrir;
si recordcount <> 0 entonces
comenzar
treeview1.Items.Add('select * from aa where len(name) = 4');
abrir ;
mientras no sea así,
comenzar
mynode:= treeview1.Items.AddChild(treeview1.TopItem,fieldbyname('name').AsString);
con adoquery3
comenzar
cerrar;
sql.Clear;
sql.Add( ' seleccione * de aa donde nombre como '''+ '%'+ mynode.Text+ ''' y len(nombre) = 6');
abrir;
if recordcount < > 0 luego
comenzar
primero;
comenzar
treeview1.Items.AddChild(mynode, mynode, mynode, mynode, mynode , minodo, minodo, minodo, minodo, minodo, minodo, minodo, minodo, minodo, minodo, minodo, minodo, minodo, minodo, minodo, minodoAddChild(miodo, fieldbyname('nombre').AsString);
siguiente;
fin;
fin;
siguiente;
fin;
fin; /p>
Ejemplo 3
I. Creación de un árbol de indicadores
El método específico es: crear una base de datos, diseñar la tabla de indicadores t_pub_index, incluidos los campos index_id, parent_id, index_name. y otros Los campos se determinan de acuerdo con el negocio real. El nombre del indicador index_name se mostrará en el nodo del control de árbol. El campo index_id guarda el número de identificación único del nodo parent_id. el nodo actual. Estos números de identificación forman una "lista vinculada" que registra la estructura de los nodos del árbol. Diseñe un formulario Frm_sys_index con un control TreeView tv_zb, un control Query Query1 y otros controles de visualización y edición de propiedades que indiquen.
El nodo del árbol contiene Texto y Datos. El texto es una clase de cadena que se utiliza para mostrar el nombre del indicador o directorio del indicador. Los datos son un puntero sin tipo que apunta a la estructura de datos asociada con el nodo. campos como el ID del indicador y el ID del nodo principal.
Query1 es un control de consulta utilizado para mostrar las propiedades del indicador. /La expresión del control de consulta es:
seleccione index_id, parent_id, index_name de t_pub_index
comience con index_id=0 conecte antes index_id= parent_id
donde comenzar con y conectar por son palabras reservadas en las declaraciones SQL de Oracle, que se utilizan para hacer que el valor de la columna parent_id de un registro sea igual al valor de la columna index_id del registro anterior, comenzando desde el registro con parent_id igual a 0.
La idea básica de construir un árbol es:
Proceso TFrm_sys_index.createtree
var
curValue: indexPointer; / Datos relacionados con el nodo Puntero de estructura
curNode .first;
mientras no sea Query_index.Eof
begin
new(curValue);
Con curValue^ haga
Asigne cada valor de campo de la tabla de métricas de la base de datos t_pub_index a curValue. Asigne cada valor de campo a la estructura de datos a la que hace referencia curValue
mientras. ( curid <> curValue.parent_id) do // El identificador del nodo actual no es igual al número del nodo principal del registro actual
begin
curNode := curNode.parent
curid := indexPointer(curNode.data).index_id;
end;
curNode := tv_zb.Items.AddChildObject.Items.AddChildObject.Items.AddChildObject.Items AddChildObject.Items.AddChildObject.Items.AddChildObject.Items.AddChildObject(curNode,
curValue^. index_name,curValue); //Agrega un nodo secundario al nodo actual, muestra el nombre del índice del nodo. y apunte al puntero a la estructura de datos conectada a los datos del índice
curid := indexPointer(curNode.data).index_id
Query_ index.next;
fin;
fin;
p>
Query_index.close;
añadir; eliminar y modificar nodos de Treeview
Agregar, eliminar y modificar nodos en Treeview. Simplemente use sus propios Treeview.AddChildObject, Treeview.AddChildObject, Treeview.AddChildObject y Treeview.AddChildObject. Puede usar AddChildObject, Treeview.Selected.Delete, Treeview.Selected.EditText y otros métodos, pero para modificar los datos en la base de datos en consecuencia, debe llamar a la misma función (para eliminar opciones) de forma recursiva para recorrer todos los elementos secundarios bajo el nodo nodo seleccionado.
El siguiente es un ejemplo de un proceso de eliminación de nodos:
function TFrm_sys_index.delnode(node1:TTreenode):TTreenode;
var
childnode:TTreenode <; /p >
comenzar
childnode:=node1.GetLastChild; //Obtiene los niños en orden inverso porque la lista cambia cuando eliminas opciones
mientras que childnode<>nil do
childnode:=delnode( childnode); // si el niño no está vacío, realiza una llamada recursiva
index_id:=inttostr(indexpointer(node1.data).index_id);// Obtener estos indicadores correspondientes del nodo
Eliminar los indicadores correspondientes en la base de datos
result.= node1.parent.GetPrevChild(node1); node
node1.delete; //eliminar el nodo del árbol
end;
3. Arrastra el nodo del árbol
Arrastrando el árbol El nodo es básicamente El proceso de mover una opción se completa creando una nueva subclave del elemento de destino, copiando el elemento de origen a esa subclave y eliminando el elemento original. De manera similar a la operación de eliminación anterior, todos los nodos secundarios bajo el nodo seleccionado se mueven en orden inverso llamando a la misma función (utilizada para la opción de movimiento) de forma recursiva.
El siguiente es el código para el proceso recursivo:
procedure TFrm_sys_index.CopyNodeUnder(treeview:TTreeview;
sourcenode,targetnode:ttreenode
var < p); >newnode: ttreenode;
i:integer;
comenzar
newnode:=treeview.items.addchildfirst(targetnode:ttreenode); p>newnode :=treeview.items.addchildfirst(targetnode:ttreenode)addchildfirst(targetnode,''); //crea el elemento de destino
newnode .assign(sourcenode); //copia las propiedades del elemento de origen
for i:=sourcenode.count-1 downto 0 do //llamada recursiva para mover todos sus elementos secundarios en orden inverso
CopyNodeUnder (treeview,sourcenode.item [i],newnode) ;
p>treeview.items.delete(sourcenode); //eliminar el elemento fuente
end
Treeview admite operaciones de arrastre, configuramos DragKind; propiedad del componente en dkDrag, la propiedad DragMode se establece en dmAutomatic y se escriben controladores para los eventos OnDragOver y OnDragDrop. El controlador de eventos OnDragOver determina las condiciones bajo las cuales se permite el movimiento y excluye casos especiales que deben evitarse.
El código es el siguiente:
Proceso TFrm_sys_index.tv_zbDragOver(Remitente, Fuente: TObject; X,
Y: Entero; Estado: TDragState; var Aceptar:
var
targetnode,sourcenode:TTreenode;
comenzar
targetnode:=tv_zb.getnodeat(x,y); (Fuente= Remitente) y ( targetnode<>nil) luego //garantiza que el movimiento se realiza en un TreeView y que el nodo de destino no está vacío
begin
Aceptar:=true;
sourcenode:=tv_zb.selected;
// El siguiente código evita que el usuario arrastre una opción a su nodo hijo (se mueve con la opción, provocando un bucle infinito)
while (targetnode.parent<>nil) y (targetnode <> sourcenode) hacen
targetnode:= targetnode.parent
if (targetnode = sourcenode) luego Accept:=false
end
else Accept:=false
end
El controlador de eventos OnDragDrop inicia lo anterior; mueva el proceso CopyNodeUnder para modificar los datos de la base de datos. Además, al agregar datos a Treeview en lotes, es mejor usar TreeView.Items.BeginUpdate y TreeView.Items.EndUpdate para acelerar la visualización. p>
Proceso TFrm_sys_index.tv_zbDragDrop(Sender), Fuente: TObject;
sourcenode:=tv_zb.selected; //obtener el nodo de destino
Modificar el parent_id del actual nodo en la base de datos para igualar el número de identificación del nodo de destino
tv_zb.items .beginupdate; //Deshabilitar la operación de redibujado de TreeView
prueba
copynodeunder( tv_zb,sourcenode,targetnode); //inicia el proceso de movimiento
tv_zb.selected :=targetnode;
finalmente
tv_zb.items.endupdate; restablecer
fin
fin
fin
fin
Ejemplo 4
Para darle un código muy breve, el campo de título es su campo de valor, ya que valor es una palabra reservada, así que lo cambié a esto.
p>
ss.Add(StringOfChar(#9,(Length(Trim(AdoQuery1.SQL.Text := 'SELECT nombre,caption FROM test8 ORDER BY nombre')));
AdoQuery1.Open;
ss := TStringList.Create;
mientras no AdoQuery1.P>
+AdoQuery1.FieldValues['nombre']) excepto Toma 2)-1)
+ AdoQuery1.FieldValues['caption']);
AdoQuery1.Next;
end;
ShowMessage(ss.SaveToFile('d:\test8.txt');
ss.Free;
TreeView1.LoadFromFile('d:\test8.txt');
fin