ユニットUnit1は、 インターフェイスは 使用しています Windowsの、メッセージ、sysutilsの、バリアント、クラス、グラフィックス、コントロール、フォーム、 ダイアログ、StdCtrls、ComCtrls、DB、ADODBを。 入力 PNodeInfoEx = ^ TNodeInfoExを。 TNodeInfoEx = ランチ録音 のNodeID:整数; ParentID:整数; ノードタイプ:整数; ChnNodeTitle:文字列。 ImageIndexプロパティ:SMALLINT。 SelectedIndexを:SMALLINT。 エンド; TForm1 = クラス(TFormは) TV1:TTreeViewの。 BTN1:TButtonの。 QRY1:TADOQuery。 手順btn1Click(送信者:TObjectを); 手順FormDestroy(送信者:TObjectを); プライベート { プライベート宣言} 関数StaticBuildTree(ツリービュー:TTreeViewの):ブール。 関数AddTreeItem(ツリービュー:TTreeViewの; AddNodeInfo:PNodeInfoEx):TTreeNode。 関数FindTreeItem(ツリービュー:TTreeViewの; CurNodeID:整数):TTreeNode。 公共 { 公開宣言} 端; VAR をForm1:TForm1; 実装 { $ R * .DFM } 関数TForm1.StaticBuildTree(ツリービュー:TTreeViewの):ブール。 VAR AddNodeInfo:PNodeInfoEx; 始める の検索結果を: = falseは、 qry1.LoadFromFile(' C:/AdminixTree.xml '); // ここではXMLファイルへのデータソースとして Treeview.Items.BeginUpdate; //は覚えておいてください:大量のデータを追加する前にBeginUpdateメソッドを使用するために、一時的に近い特定のイベントは、(などのOnChangeイベント、など)データの追加によってトリガする ; Treeview.Items.Clearは// クリアツリービューは、 してみてください 試して IF qry1.RecordCount> 0は 、その後 始まる qry1.Firstを、 しばらくないQRY1 .EOF 行う 始まる 新しい(AddNodeInfoを); // 生成構造 AddNodeInfo ^ .NodeID:= qry1.FieldByName(' NODE_ID ' ).AsInteger。 AddNodeInfo ^ .ParentID: = qry1.FieldByName(' PARENT_ID ' ).AsInteger。 AddNodeInfo ^ .NodeType: = qry1.FieldByName(' ノードタイプ' ).AsInteger。 AddNodeInfo ^ .ChnNodeTitle: = qry1.FieldByName(' ChnNodeTitle ' ).AsString。 AddNodeInfo ^ .ImageIndex: = qry1.FieldByName(' ImageIndexプロパティ' ).AsInteger。 AddNodeInfo ^ .SelectedIndex: = qry1.FieldByName(' SelectedIndexを').AsInteger; AddTreeItem(ツリービュー、AddNodeInfo); // ツリービューに格納された構造体へのポインタ qry1.Next; エンド; エンド; 除く Application.MessageBox(' スパニングツリーノード障害'、MB_ICONSTOP + MB_OK); 上昇 ; / / 異常優れた投げ エンド; qry1.Close; 結果: = 真; 最後に Treeview.Items.EndUpdate; エンド; エンド; // ノードを結合するとき、追加すべきは、親ノードまたは子ノードを決定し、それが決定されますParentIDはで既存のツリーのノードにおけるノードの存在または非存在に基づいている 機能TForm1.AddTreeItem(ツリービュー:TTreeViewの; AddNodeInfo:PNodeInfoEx):TTreeNode; var のparentNode:TTreeNode; 開始 のparentNodeを: = FindTreeItem(ツリービュー、AddNodeInfo ^ .ParentID)。 もしのparentNode <> nilに 続い 結果: = Treeview.Items.AddChildObject(のparentNode、トリム(AddNodeInfo.ChnNodeTitle)、ポインタ(AddNodeInfo)) 他の 結果: = Treeview.Items.AddObject(のparentNode、トリム(AddNodeInfo.ChnNodeTitle)、ポインタ( AddNodeInfo)); もし <結果> nilを その後 始める Result.ImageIndex: =を AddNodeInfo.ImageIndexを。 Result.SelectedIndex: = AddNodeInfo.SelectedIndex; エンド; エンド; // これは、親ノードがあるか否かを判断する 関数TForm1.FindTreeItem(ツリービュー:;:整数CURNODEID TTreeViewの):TTreeNodeは、 VAR I:整数; 開始 結果: = nilを; のために、私は:= 0 に Treeview.Items.Count- 。1 行い 始める のIF。CURNODEID = PNodeInfoEx(Treeview.Items [I] .DATA)^がNodeIDの後、 開始 結果: =の; Treeview.Items [I] を終了し、 終了します。 エンド; エンド; // ツリー構造 手順TForm1.btn1Click(送信者:TObjectを); 始める StaticBuildTree(TV1) エンド; // ツリー内のノードに構造ポインタを解放するフォームがために、緩和するために取らなければなりませんなぜ、リリース後にキャストを処分しなければならない、特別な説明の前に、これは疲れていない 手順TForm1.FormDestroy(送信者:TObjectを); VAR I:整数; 始める ために 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。); エンド ;