复制番号代番号次のように:
ユニットユニット1;
インタフェース
用途
ウィンドウ、メッセージ、SysUtils、バリアント、クラス、グラフィックス、コントロール、フォーム、
ダイアログ、StdCtrls、ComCtrls、DB、ADODB;
タイプ
PNodeInfoEx = ^TNodeInfoEx;
TNodeInfoEx = パックされたレコード
ノードID: 整数;
親ID : 整数;
ノードタイプ: 整数;
ChnNodeTitle : 文字列;
画像インデックス: SmallInt;
SelectedIndex: SmallInt;
終わり;
TForm1 = クラス(TForm)
tv1:TTreeView;
btn1: Tボタン;
qry1: TADOクエリ;
プロシージャ btn1Click(送信者: TObject);
プロシージャ FormDestroy(Sender: TObject);
プライベート
{ プライベート宣言 }
関数 StaticBuildTree(TreeView:TTreeView ):Boolean;
関数 AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
関数 FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
公共
{ 公的宣言 }
終わり;
変数
フォーム1: TForm1;
実装
{$R *.dfm}
関数 TForm1.StaticBuildTree(TreeView:TTreeView ):Boolean;
変数
AddNodeInfo : PNodeInfoEx;
始める
結果 := False;
qry1.LoadFromFile('c:/AdminixTree.xml');//このXML文書はデータソースとなっています
Treeview.Items.BeginUpdate;//记住:大量のデータ追加を行うときに使用するBeginUpdate、データの追加によって引き起こされる特定のイベント(OnChangeイベントなど)による停止
Treeview.Items.Clear;//清空Treeview
試す
試す
qry1.RecordCount >0 の場合
始める
qry1.最初に;
while Not qry1.Eof do
始める
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);// 構造体の指针をツリービュー中に保存します
qry1.次へ;
終わり;
終わり;
を除外する
Application.MessageBox('生成树结点失败',MB_ICONSTOP+MB_OK);
raise;//向上级抛异常
終わり;
qry1.閉じる;
結果 := True;
ついに
Treeview.Items.EndUpdate;
終わり;
終わり;
// 追加ポイントの際、追加されるのは親ポイントであるか子ポイントであるかが先に判断され、判断の基準はすでに存在する親ポイントにそのポイントが存在するかどうかの ParentID です。
関数 TForm1.AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
変数
親ノード: 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;
変数
i : 整数。
始める
結果 := nil;
for i := 0 から Treeview.Items.Count-1 まで
始める
if CurNodeID=PNodeInfoEx(Treeview.Items[i].Data)^.NodeID then
始める
結果 := Treeview.Items[i];
出口;
終わり;
終わり;
終わり;
// 生成树结构
プロシージャ TForm1.btn1Click(送信者: TObject);
始める
静的ビルドツリー (tv1)
終わり;
// ボディの解放時には、必ずポイント内の構造体が解放される必要があります。これは、廃棄時に何かが実行される前に解放されるためのものであり、ここには蓄積されません
プロシージャ TForm1.FormDestroy(送信者: TObject);
変数
i : 整数。
始める
for i := 0 から tv1.Items.Count-1 まで
始める
Dispose( PNodeInfoEx(tv1.Items[i].Data) )
終わり;
終わり;
終わり。
复制番号代番号次のように:
// どのように访问树结点?
プロシージャ TForm1.tv1MouseDown(送信者: TObject; ボタン: TMouseButton;
シフト: TShiftState; X、Y: 整数);
変数
pNode:TTreeNode;
始める
pNode:=tv1.GetNodeAt(x,y);
if (pNode<>nil) かつ (Button=mbleft) then
ShowMessage(PNodeInfoEx(pNode.Data)^.ChnNodeTitle);
終わり;