复制代码代码如下:
หน่วย หน่วยที่ 1;
อินเตอร์เฟซ
การใช้งาน
Windows, ข้อความ, SysUtils, ตัวแปร, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม,
กล่องโต้ตอบ, StdCtrls, ComCtrls, DB, ADODB;
พิมพ์
PNodeInfoEx = ^TNodeInfoEx;
TNodeInfoEx = บันทึกที่บรรจุ
NodeID : จำนวนเต็ม;
ParentID : จำนวนเต็ม;
NodeType : จำนวนเต็ม;
ChnNodeTitle : สตริง;
ดัชนีรูปภาพ: SmallInt;
SelectedIndex: SmallInt;
จบ;
TForm1 = คลาส (TForm)
tv1: TTreeView;
btn1: TButton;
qry1: TADOQuery;
ขั้นตอน btn1Click (ผู้ส่ง: TObject);
ขั้นตอน FormDestroy (ผู้ส่ง: TObject);
ส่วนตัว
{ การประกาศส่วนตัว }
ฟังก์ชัน StaticBuildTree(TreeView:TTreeView ):บูลีน;
ฟังก์ชัน AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
ฟังก์ชัน FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
สาธารณะ
{ คำประกาศสาธารณะ }
จบ;
var
แบบฟอร์ม 1: TForm1;
การดำเนินการ
{$R *.dfm}
ฟังก์ชัน TForm1.StaticBuildTree(TreeView:TTreeView ):บูลีน;
var
AddNodeInfo : PNodeInfoEx;
เริ่ม
ผลลัพธ์ := เท็จ;
qry1.LoadFromFile('c:/AdminixTree.xml');//这里以XML文件做为数据源
Treeview.Items.BeginUpdate;//记住:在进行批量添加数据时要使用BeginUpdate,来暂时关闭由于添加数据而触发的某些事件(如OnChange事件等)
Treeview.Items.Clear;//Treeview
พยายาม
พยายาม
ถ้า qry1.RecordCount >0 แล้ว
เริ่ม
qry1.อันดับแรก;
ในขณะที่ไม่ใช่ qry1.Eof ทำ
เริ่ม
ใหม่(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.ถัดไป;
จบ;
จบ;
ยกเว้น
Application.MessageBox('生成树结点失败',MB_ICONSTOP+MB_OK);
ยก;//向上级抛异常
จบ;
qry1.ปิด;
ผลลัพธ์ := จริง;
ในที่สุด
Treeview.Items.EndUpdate;
จบ;
จบ;
//在加入结点时,应先判断加入的是父结点还是子结点,判断依据是在已存在的树结点中是否存在该结点的ParentID
ฟังก์ชัน TForm1.AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
var
โหนดหลัก: TTreeNode;
เริ่ม
ParentNode := FindTreeItem(Treeview,AddNodeInfo^.ParentID);
ถ้า ParentNode <> ไม่มีเลย
ผลลัพธ์ := Treeview.Items.AddChildObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo))
อื่น
ผลลัพธ์ := Treeview.Items.AddObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo));
ถ้าผลลัพธ์<>ไม่มีเลย
เริ่ม
Result.ImageIndex := AddNodeInfo.ImageIndex;
Result.SelectedIndex := AddNodeInfo.SelectedIndex;
จบ;
จบ;
//这里是判断是否存在其父结点
ฟังก์ชัน TForm1.FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
var
ฉัน : จำนวนเต็ม;
เริ่ม
ผลลัพธ์ := ไม่มี;
สำหรับ i := 0 ถึง Treeview.Items.Count-1 ทำ
เริ่ม
ถ้า CurNodeID=PNodeInfoEx(Treeview.Items[i].Data)^.NodeID แล้ว
เริ่ม
ผลลัพธ์ := Treeview.Items[i];
ออก;
จบ;
จบ;
จบ;
//生成树结构
ขั้นตอน TForm1.btn1Click (ผู้ส่ง: TObject);
เริ่ม
StaticBuildTree (tv1)
จบ;
//在窗体释放时一定要把树结点中的结构体指针给释放掉,对于在Dis โพสท่า时为什么要进行强制转型后释放,以前有专门的讲解,在此不在累述
ขั้นตอน TForm1.FormDestroy (ผู้ส่ง: TObject);
var
ฉัน : จำนวนเต็ม;
เริ่ม
สำหรับ i := 0 ถึง tv1.Items.Count-1 ทำ
เริ่ม
กำจัด ( PNodeInfoEx(tv1.Items[i].Data) )
จบ;
จบ;
จบ.
复制代码代码如下:
//如何访问树结点?
ขั้นตอน TForm1.tv1MouseDown (ผู้ส่ง: TObject; ปุ่ม: TMouseButton;
กะ: TShiftState; X, Y: จำนวนเต็ม);
var
pNode:TTreeNode;
เริ่ม
pNode:=tv1.GetNodeAt(x,y);
ถ้า (pNode<>ไม่มี) และ (ปุ่ม=mbleft) แล้ว
ShowMessage(PNodeInfoEx(pNode.Data)^.ChnNodeTitle);
จบ;