复制代码代码如下:
unidade Unidade1;
interface
usa
Windows, Mensagens, SysUtils, Variantes, Classes, Gráficos, Controles, Formulários,
Diálogos, StdCtrls, ComCtrls, DB, ADODB;
tipo
PNodeInfoEx = ^TNodeInfoEx;
TNodeInfoEx = Registro Empacotado
NodeID: Inteiro;
ParentID: Inteiro;
NodeType: Inteiro;
ChnNodeTitle: String;
Índice de imagem: SmallInt;
Índice Selecionado: SmallInt;
fim;
TForm1 = classe(TForm)
tv1: TTreeView;
btn1: Botão T;
qry1: TADOQuery;
procedimento btn1Click(Remetente: TObject);
procedimento FormDestroy(Remetente: TObject);
privado
{Declarações privadas}
função StaticBuildTree(TreeView:TTreeView ):Boolean;
função AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
função FindTreeItem(TreeView:TTreeView; CurNodeID:inteiro): TTreeNode;
público
{Declarações públicas}
fim;
var
Formulário1: TForm1;
implementação
{$R *.dfm}
função TForm1.StaticBuildTree(TreeView:TTreeView ):Boolean;
var
AddNodeInfo : PNodeInfoEx;
começar
Resultado := Falso;
qry1.LoadFromFile('c:/AdminixTree.xml');//这里以XML文件做为数据源
Treeview.Items.BeginUpdate;//记住:在进行批量添加数据时要使用BeginUpdate,来暂时关闭由于添加数据而触发的某些事件(如OnChange事件等)
Treeview.Items.Clear;//清空Treeview
tentar
tentar
se qry1.RecordCount >0 então
começar
qry1.Primeiro;
enquanto não qry1.Eof faz
começar
New(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.Próximo;
fim;
fim;
exceto
Application.MessageBox('成树结点失败',MB_ICONSTOP+MB_OK);
raise;//向上级抛异常
fim;
qry1.Fechar;
Resultado := Verdadeiro;
finalmente
Treeview.Items.EndUpdate;
fim;
fim;
//在加入结点时,应先判断加入的是父结点还是子结点,判断ParentID
função TForm1.AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
var
ParentNode: TTreeNode;
começar
ParentNode := FindTreeItem(Treeview,AddNodeInfo^.ParentID);
Se ParentNode <> nulo então
Resultado:= Treeview.Items.AddChildObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Ponteiro(AddNodeInfo))
outro
Resultado:= Treeview.Items.AddObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo));
se Resultado<>nil então
começar
Result.ImageIndex := AddNodeInfo.ImageIndex;
Result.SelectedIndex := AddNodeInfo.SelectedIndex;
fim;
fim;
//这里是判断是否存在其父结点
função TForm1.FindTreeItem(TreeView:TTreeView; CurNodeID:inteiro): TTreeNode;
var
eu: Inteiro;
começar
Resultado := nulo;
para i := 0 para Treeview.Items.Count-1 faça
começar
se CurNodeID=PNodeInfoEx(Treeview.Items[i].Data)^.NodeID então
começar
Resultado:= Treeview.Items[i];
Saída;
fim;
fim;
fim;
//生成树结构
procedimento TForm1.btn1Click(Remetente: TObject);
começar
StaticBuildTree (tv1)
fim;
//在窗体释放时一定要把树结点中的结构体指针给释放掉,对于在Dis pose时为什么要进行强制转型后释放,以前有专门的讲解,在此不在累述
procedimento TForm1.FormDestroy(Remetente: TObject);
var
eu: Inteiro;
começar
para i := 0 para tv1.Items.Count-1 faça
começar
Dispose( PNodeInfoEx(tv1.Items[i].Data) )
fim;
fim;
fim.
复制代码代码如下:
//如何访问树结点?
procedimento TForm1.tv1MouseDown(Remetente: TObject; Botão: TMouseButton;
Mudança: TShiftState; X, Y: Inteiro);
var
pNode:TTreeNode;
começar
pNode:=tv1.GetNodeAt(x,y);
se (pNode<>nil) e (Button=mbleft) então
ShowMessage(PNodeInfoEx(pNode.Data)^.ChnNodeTitle);
fim;