复制代码代码如下 :
unité Unité1 ;
interface
utilise
Windows, messages, SysUtils, variantes, classes, graphiques, contrôles, formulaires,
Boîtes de dialogue, StdCtrls, ComCtrls, DB, ADODB ;
taper
PNodeInfoEx = ^TNodeInfoEx;
TNodeInfoEx = Enregistrement compressé
NodeID : entier ;
IDParent : Entier ;
Type de nœud : entier ;
ChnNodeTitle : Chaîne ;
Index d'image : SmallInt ;
Index sélectionné : SmallInt ;
fin;
TForm1 = classe(TForm)
tv1 : TTreeView ;
btn1 : TButton ;
qry1 : TADOQuery ;
procédure btn1Click(Expéditeur : TObject);
procédure FormDestroy (Expéditeur : TObject);
privé
{ Déclarations privées }
fonction StaticBuildTree(TreeView:TTreeView ):Boolean;
fonction AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
fonction FindTreeItem (TreeView:TTreeView; CurNodeID:integer) : TTreeNode;
publique
{ Déclarations publiques }
fin;
var
Formulaire1 : TForm1 ;
mise en œuvre
{$R *.dfm}
fonction TForm1.StaticBuildTree(TreeView:TTreeView ):Boolean;
var
AddNodeInfo : PNodeInfoEx;
commencer
Résultat := Faux ;
qry1.LoadFromFile('c:/AdminixTree.xml');//这里以XML文件做为数据源
Treeview.Items.BeginUpdate;//记住:在进行批量添加数据时要使用BeginUpdate, 来暂时关闭由于添加数据而触发的某些事件(如OnChange事件等)
Treeview.Items.Clear;//清空Treeview
essayer
essayer
si qry1.RecordCount >0 alors
commencer
qry1.Premier ;
while Pas qry1.Eof do
commencer
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.Suivant ;
fin;
fin;
sauf
Application.MessageBox('生成树结点失败',MB_ICONSTOP+MB_OK);
augmenter;//向上级抛异常
fin;
qry1.Fermer ;
Résultat := Vrai ;
enfin
Treeview.Items.EndUpdate;
fin;
fin;
//在加入结点时,应先判断加入的是父点还是子结点,判断ParentID
fonction TForm1.AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
var
Noeud parent : TTreeNode ;
commencer
ParentNode := FindTreeItem(Treeview,AddNodeInfo^.ParentID);
Si ParentNode <> nul alors
Résultat := Treeview.Items.AddChildObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo))
autre
Résultat := Treeview.Items.AddObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo));
si Résultat <> nul alors
commencer
Résultat.ImageIndex := AddNodeInfo.ImageIndex;
Result.SelectedIndex := AddNodeInfo.SelectedIndex;
fin;
fin;
//这里是判断是否存在其父结点
fonction TForm1.FindTreeItem(TreeView:TTreeView; CurNodeID:integer) : TTreeNode;
var
je : Entier ;
commencer
Résultat := nul;
pour i := 0 à Treeview.Items.Count-1 faire
commencer
si CurNodeID=PNodeInfoEx(Treeview.Items[i].Data)^.NodeID alors
commencer
Résultat := Treeview.Items[i];
Sortie;
fin;
fin;
fin;
//生成树结构
procédure TForm1.btn1Click(Expéditeur : TObject);
commencer
Arbre de construction statique (tv1)
fin;
//在窗体释放时一定要把树结点中的结构体指针给释放掉,对于在Dis pose
procédure TForm1.FormDestroy(Expéditeur : TObject);
var
je : Entier ;
commencer
pour i := 0 à tv1.Items.Count-1 faire
commencer
Disposer( PNodeInfoEx(tv1.Items[i].Data) )
fin;
fin;
fin.
复制代码代码如下 :
//如何访问树结点?
procédure TForm1.tv1MouseDown(Expéditeur : TObject ; Bouton : TMouseButton ;
Maj : TShiftState ; X, Y : Entier);
var
pNoeud : TTreeNode ;
commencer
pNode:=tv1.GetNodeAt(x,y);
si (pNode<>nil) et (Button=mbleft) alors
ShowMessage(PNodeInfoEx(pNode.Data)^.ChnNodeTitle);
fin;