复制代码代码如下:
блок Unit1;
интерфейс
использует
Windows, сообщения, SysUtils, варианты, классы, графика, элементы управления, формы,
Диалоги, StdCtrls, ComCtrls, DB, ADODB;
тип
PNodeInfoEx = ^TNodeInfoEx;
TNodeInfoEx = упакованная запись
NodeID: целое число;
ParentID: целое число;
Тип узла: Целое число;
ChnNodeTitle: Строка;
ИмиджИндекс: СмоллИнт;
ВыбранныйИндекс: SmallInt;
конец;
ТФорм1 = класс (ТФорма)
ТВ1: TTreeView;
кнопка1: кнопка T;
qry1: TADOQuery;
процедура btn1Click (Отправитель: TObject);
процедура FormDestroy (Отправитель: TObject);
частный
{ Частные заявления }
функция StaticBuildTree(TreeView:TTreeView):Boolean;
функция AddTreeItem(TreeView:TTreeView; AddNodeInfo:PNodeInfoEx):TTreeNode;
функция FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
общественный
{ Публичные заявления }
конец;
вар
Форма1: ТФорм1;
выполнение
{$R *.dfm}
функция TForm1.StaticBuildTree(TreeView:TTreeView):Boolean;
вар
Адднодеинфо: Пнодеинфоекс;
начинать
Результат: = Ложь;
qry1.LoadFromFile('c:/AdminixTree.xml');//Передача файлов 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;
конец;
конец;
//在加入结点时,应先判断加入的是父结点还是子结点,判断Родительский идентификатор 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));
если Результат<>ноль, то
начинать
Result.ImageIndex := AddNodeInfo.ImageIndex;
Результат.SelectedIndex := AddNodeInfo.SelectedIndex;
конец;
конец;
// 这里是判断是否存在其父结点
функция TForm1.FindTreeItem(TreeView:TTreeView; CurNodeID:integer): TTreeNode;
вар
я: целое число;
начинать
Результат:= ноль;
for i := 0 для Treeview.Items.Count-1 do
начинать
если CurNodeID=PNodeInfoEx(Treeview.Items[i].Data)^.NodeID тогда
начинать
Результат: = Treeview.Items[i];
Выход;
конец;
конец;
конец;
//生成树结构
процедура TForm1.btn1Click(Отправитель: TObject);
начинать
Статикбилдтри (tv1)
конец;
//在窗体释放时一定要把树结点中的结构体指针给释放掉,对于在Dis поза时为什么要进行强制转型后释放,以前有专门的讲解,在此不在累述
процедура TForm1.FormDestroy(Отправитель: TObject);
вар
я: целое число;
начинать
для i := 0 до tv1.Items.Count-1 сделать
начинать
Dispose( PNodeInfoEx(tv1.Items[i].Data))
конец;
конец;
конец.
复制代码代码如下:
//如何访问树结点?
процедура TForm1.tv1MouseDown(Отправитель: TObject; Кнопка: TMouseButton;
Сдвиг: Тшифтстате; X, Y: целое число);
вар
pNode:TTreeNode;
начинать
pNode:=tv1.GetNodeAt(x,y);
если (pNode<>nil) и (Button=mbleft), то
ShowMessage(PNodeInfoEx(pNode.Data)^.ChnNodeTitle);
конец;