На примере проделанной мной работы я хочу рассказать, как работать с деревом TTreeView.
Имеется база данных, в которой есть таблица с продукцией или услугами. В таблице 3
поля:
- КодУслуги
- Наименование
- Родитель
При помощи компонента
TTreeView необходимо создать дерево. Для начала напишем процедуру AddNode, которая у нас будет добавлять ветки в дерево.
private
{ Private declarations }
procedure AddNode(ToTree:TTreeNode;ToId:cardinal);
procedure DeleteNode(Node:TTreeNode);
public
{ Public declarations }
end;
TNode=record
id:cardinal;
str:string[255];
parent_id:cardinal;
end;
var
derevo: Tderevo;
Nodes:array of TNode;
NodesCount:cardinal;
asas:TTreeNode;
cltrue:boolean;
cl:boolean;
implementation
uses Unit2;
{$R *.dfm}
procedure Tderevo.AddNode(ToTree:TTreeNode;ToId:cardinal); var i:cardinal; node:TTreeNode; begin // Проверяем каждую запись в базе for i:=1 to NodesCount do begin // Если родитель равен коду записи, то мы добавляем ее в дерево к этому родителю if nodes[i].parent_id=ToId then begin // Добавляем запись в дерево node:=TreeView1.Items.AddChildObject(ToTree,nodes[i].str,Pointer(nodes[i].id)); // Запускаем рекурсивно процедуру добавления с параметрами // ToTree=node - только что созданный объект дерева, тоесть к нему бем искать предков // ToId=nodes[i].id - будем искать объекты, у которых родитель текущий объект AddNode(node,nodes[i].id); end; end; end;
|
Для этого на событие OnCreate пишем следующий код:
procedure TForm1.FormCreate(Sender: TObject);
var i:cardinal;
begin
TreeView1.Items.Clear;
// Вначале считаем количество записей
NodesCount:=Datamodule2.Yslygi_12.RecordCount;
// Задаем размер динамического массива для базы
setlength(Nodes,NodesCount+1);
// Загружаем базу в память
Datamodule2.Yslygi_12.First;
for i:=1 to NodesCount do
begin
//Заносим в дерево код услуги, наименование и ссылку на родителя
Nodes[i].id:=Datamodule2.Yslygi_12.FieldValues['id'];
Nodes[i].str:=Datamodule2.Yslygi_12.FieldValues['name'];
try
Nodes[i].parent_id:=Datamodule2.Yslygi_12.FieldValues['parent'];
except
end;
Datamodule2.Yslygi_12.Next;
end;
// Теперь строим дерево
// Запускаем рекурсивную процедуру с параметром типа:
// Добавляем в корень (nil) все значения, у которых родитель = 0
AddNode(nil,0);
treeview1.Items.CustomSort(nil,0,true);
end; |
Ну вот и все, дерево построено.
|