复代码代码如下:
단위 Unit1;
인터페이스
용도
Windows, 메시지, SysUtils, 변형, 클래스, 그래픽, 컨트롤, 양식,
대화 상자, StdCtrls, ComCtrls, DB, ADODB;
유형
PNodeInfoEx = ^TNodeInfoEx;
TNodeInfoEx = 압축된 레코드
NodeID : 정수;
ParentID : 정수;
노드 유형: 정수;
ChnNodeTitle : 문자열;
이미지 인덱스: SmallInt;
SelectedIndex: SmallInt;
끝;
TForm1 = 클래스(TForm)
tv1: TTreeView;
btn1: T버튼;
qry1: TADO쿼리;
절차 btn1Click(보내는 사람: TObject);
절차 FormDestroy(보내는 사람: TObject);
사적인
{ 비공개 선언 }
함수 StaticBuildTree(TreeView:TTreeView ):Boolean;
함수 AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
함수 FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
공공의
{ 공개 선언 }
끝;
var
Form1: TForm1;
구현
{$R *.dfm}
함수 TForm1.StaticBuildTree(TreeView:TTreeView ):Boolean;
var
AddNodeInfo : PNodeInfoEx;
시작하다
결과 := 거짓;
qry1.LoadFromFile('c:/AdminixTree.xml');//这里以XML文件做为数据源
Treeview.Items.BeginUpdate;//记住:현재 이동 횟수가 添加数据时要使사용 BeginUpdate,来暂时关闭由于添加数据而触发的某些事件(如OnChange事件等)
Treeview.Items.Clear;//清공Treeview
노력하다
노력하다
qry1.RecordCount >0이면
시작하다
qry1.먼저;
qry1.Eof가 아닌 동안
시작하다
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.다음;
끝;
끝;
제외하고
Application.MessageBox('生成树结点失败',MB_ICONSTOP+MB_OK);
인상;//向上级抛异常
끝;
qry1.닫기;
결과 := 참;
마지막으로
Treeview.Items.EndUpdate;
끝;
끝;
//여기서 加入结点时,应先判断加入的是父结点还是子结点,判断依据是는 树结点中是否存에서 该结点의 부모 ID로 사용됩니다.
함수 TForm1.AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
var
상위 노드: TTreeNode;
시작하다
ParentNode := FindTreeItem(Treeview,AddNodeInfo^.ParentID);
ParentNode <> nil이면
결과 := Treeview.Items.AddChildObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo))
또 다른
결과 := Treeview.Items.AddObject(ParentNode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(AddNodeInfo));
결과<>nil이면
시작하다
Result.ImageIndex := AddNodeInfo.ImageIndex;
Result.SelectedIndex := AddNodeInfo.SelectedIndex;
끝;
끝;
//여기서 其父结点
함수 TForm1.FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
var
i : 정수;
시작하다
결과 := 없음;
for i := 0 ~ Treeview.Items.Count-1 do
시작하다
CurNodeID=PNodeInfoEx(Treeview.Items[i].Data)^.NodeID인 경우
시작하다
결과 := Treeview.Items[i];
출구;
끝;
끝;
끝;
//생성 树结构
절차 TForm1.btn1Click(Sender: TObject);
시작하다
정적빌드트리(tv1)
끝;
//현재 사용 중인 네트워크에서 사용 가능한 상태를 확인하세요. 포즈를 취하는 것은 불가능합니다.
절차 TForm1.FormDestroy(Sender: TObject);
var
i : 정수;
시작하다
for i := 0 ~ tv1.Items.Count-1 do
시작하다
처리( PNodeInfoEx(tv1.Items[i].Data) )
끝;
끝;
끝.
复代码代码如下:
//如何访问树结点?
절차 TForm1.tv1MouseDown(Sender: TObject; 버튼: TMouseButton;
시프트: TShiftState; X, Y: 정수);
var
pNode:TTreeNode;
시작하다
pNode:=tv1.GetNodeAt(x,y);
if (pNode<>nil) 및 (Button=mbleft) then
ShowMessage(PNodeInfoEx(pNode.Data)^.ChnNodeTitle);
끝;