Дошли руки доделать дерево.
Создал юнит
TTreeDataU , где объявил класс:
Код: Выделить всё
...
TTreeData = class
private
FValue : integer;
public
constructor Create(i : integer);
property Value : integer read FValue;
end;
....
constructor TTreeData.Create(i: integer);
begin
FValue := i;
end;
Дерево заполняю теперь так:
Код: Выделить всё
procedure TForm1.FillTree(); // заполнение дерева
var
i, iTree: integer;
begin
with Tree1 do
begin
BeginUpdate;
TreeClear();
Items.AddObject(nil, dbArr[0, 2], TTreeData.Create((integer(dbArr[0, 0]))));
// добавляем корневой объект
for i := 0 to Length(dbArr) - 2 do // перебираем в цикле
begin
if i = 0 then
Log('iTree= ' + IntToStr(0) + ' Node= ' + string(dbArr[i, 0]) + ' Parent= ' +
string(dbArr[i, 1]) + ' Name= ' + string(dbArr[i, 2]));
iTree := 0;
while iTree < Items.Count do
begin
if TTreeData(Items.Item[iTree].Data).Value = integer(dbArr[i + 1, 1]) then
begin
Log('iTree= ' + IntToStr(iTree) + ' Node= ' + string(dbArr[i + 1, 0]) +
' Parent= ' + string(dbArr[i + 1, 1]) + ' Name= ' + string(dbArr[i + 1, 2]));
Items.AddChildObject(Items.Item[iTree],
string(dbArr[i + 1, 2]), TTreeData.Create((integer(dbArr[i + 1, 0])))); // добавляем дочерние объекты
break;
end;
Inc(iTree);
end;
end;
Items[0].Expand(True);
EndUpdate;
end;
end;
Очищаю так:
Код: Выделить всё
procedure TForm1.TreeCLear;
var
i:integer;
begin
with Tree1 do
begin
for i:=Items.Count-1 downto 0 do
begin
TTreeData(Items[i].Data).Free;
end;
Items.Clear;
end;
end;
Правда при редактировании обновления дерева надо ставить, как говорил
vitaly_l:
Код: Выделить всё
procedure TForm1.Tree1EditingEnd(Sender: TObject; Node: TTreeNode;
Cancel: Boolean);
begin
FillTree();
end;
Ну или через асинхронный вызов процедуры, по версии
zub.
------
vitaly_l, теперь я верно заполняю Items.Data ? Утечек не будет?
Проект:
https://yadi.sk/d/yYbRgJTm3N3grJ