复制代码代码如下:
unidad Unidad1;
interfaz
usos
Windows, Mensajes, SysUtils, Variantes, Clases, Gráficos, Controles, Formularios,
Diálogos, StdCtrls, ComCtrls, DB, ADODB;
tipo
PNodeInfoEx = ^TNodeInfoEx;
TNodeInfoEx = Registro empaquetado
ID de nodo: entero;
ID de padre: entero;
Tipo de nodo: entero;
ChnNodeTitle: Cadena;
Índice de imagen: SmallInt;
Índice seleccionado: SmallInt;
fin;
TForm1 = clase(TForm)
tv1: TtreeView;
btn1: Botón T;
qry1: TADOQuery;
procedimiento btn1Click(Remitente: TObject);
procedimiento FormDestroy(Remitente: TObject);
privado
{ Declaraciones privadas }
función StaticBuildTree(TreeView:TTreeView): booleano;
función AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
función FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
público
{ Declaraciones públicas }
fin;
var
Formulario1: TForm1;
implementación
{$R *.dfm}
función TForm1.StaticBuildTree(TreeView:TTreeView): booleano;
var
AddNodeInfo: PNodeInfoEx;
comenzar
Resultado := Falso;
qry1.LoadFromFile('c:/AdminixTree.xml');//这里以XML文件做为数据源
Treeview.Items.BeginUpdate;//记住:在进行批量添加数据时要使用BeginUpdate,来暂时关闭由于添加数据而触发的某些事件(如OnChange事件等)
Treeview.Items.Clear;//清空Treeview
intentar
intentar
si qry1.RecordCount >0 entonces
comenzar
qry1.Primero;
mientras que no qry1.Eof lo hace
comenzar
Nuevo(AddNodeInfo) ;//生成结构体
AddNodeInfo^.NodeID := qry1.FieldByName('NODE_ID').AsInteger;
AddNodeInfo^.ParentID := qry1.FieldByName('PARENT_ID').AsInteger;
AddNodeInfo^.NodeType := qry1.FieldByName('NodeType').AsInteger;
AddNodeInfo^.ChnNodeTitle := qry1.FieldByName('ChnNodeTitle').AsString;
AddNodeInfo^.ImageIndex := qry1.FieldByName('ImageIndex').AsInteger;
AddNodeInfo^.SelectedIndex := qry1.FieldByName('SelectedIndex').AsInteger;
AddTreeItem(Treeview,AddNodeInfo);//把结构体的指针存到Treeview中
qry1.Siguiente;
fin;
fin;
excepto
Application.MessageBox('生成树结点失败',MB_ICONSTOP+MB_OK);
subir;//向上级抛异常
fin;
qry1.Cerrar;
Resultado := Verdadero;
finalmente
Vista de árbol.Items.EndUpdate;
fin;
fin;
//在加入结点时,应先判断加入的是父结点还是子结点,判断ID de padre
función TForm1.AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
var
Nodo principal: TTreeNode;
comenzar
ParentNode := FindTreeItem(Treeview,AddNodeInfo^.ParentID);
Si ParentNode <> nulo entonces
Resultado: = Treeview.Items.AddChildObject (ParentNode, Trim (AddNodeInfo.ChnNodeTitle), puntero (AddNodeInfo))
demás
Resultado := Treeview.Items.AddObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo));
si resultado <> nulo entonces
comenzar
Resultado.ImageIndex := AddNodeInfo.ImageIndex;
Result.SelectedIndex := AddNodeInfo.SelectedIndex;
fin;
fin;
//这里是判断是否存在其父结点
función TForm1.FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
var
yo: Entero;
comenzar
Resultado := nulo;
para i: = 0 a Treeview.Items.Count-1 hacer
comenzar
si CurNodeID=PNodeInfoEx(Treeview.Items[i].Data)^.NodeID entonces
comenzar
Resultado := Treeview.Items[i];
Salida;
fin;
fin;
fin;
//生成树结构
procedimiento TForm1.btn1Click(Remitente: TObject);
comenzar
Árbol de construcción estática (tv1)
fin;
//在窗体释放时一定要把树结点中的结构体指针给释放掉,对于在Dis pose时为什么要进行强制转型后释放,以前有专门的讲解,在此不在累述
procedimiento TForm1.FormDestroy(Remitente: TObject);
var
yo: Entero;
comenzar
para i: = 0 a tv1.Items.Count-1 hacer
comenzar
Disponer( PNodeInfoEx(tv1.Items[i].Data) )
fin;
fin;
fin.
复制代码代码如下:
//如何访问树结点?
procedimiento TForm1.tv1MouseDown(Remitente: TObject; Botón: TMouseButton;
Cambio: TShiftState; X, Y: Entero);
var
pNodo:TTreeNodo;
comenzar
pNodo:=tv1.GetNodeAt(x,y);
si (pNode<>nil) y (Button=mbleft) entonces
ShowMessage(PNodeInfoEx(pNode.Data)^.ChnNodeTitle);
fin;