Red de conocimiento informático - Computadora portátil - Usando la vista de árbol en Delphi

Usando la vista de árbol en Delphi

Ejemplo 1

// 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>

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