Имеем дерево. Слево - дерево. Справа - лог из процедуры заполнения.
Процедура заполнения:
- Код: Выделить всё
procedure FillTree();
var
i:integer;
begin
// Корневой узел (Root), должен быть первым в выборке Query
if not Connect1.Connected then Connect1.Open;
with Query1 do
begin
Tree1.BeginUpdate;
Close;
SQL.Clear;
SQL.Text:='SELECT * FROM '+TableName+' ORDER BY '+idParent+', '+cNodeName+';'; // запрос на выборку
Open;
First;
Tree1.Items.Clear;
Tree1.Items.AddObject(nil, FieldByName(cNodeName).AsString,
Pointer(FieldByName(idNode).asInteger)); // добавляем корневой объект
Next;
while not Eof do // перебираем в цикле все записи в Query
begin
i := 0;
while i < Tree1.Items.Count do
if Tree1.Items.Item[i].Data = Pointer(FieldByName(idParent).asInteger)
then
begin
Form1.Log('i= '+IntToStr(i)+' Node= '+FieldByName(idNode).AsString+' Name= '+FieldByName(cNodeName).AsString); //ЗАПИСЬ В ЛОГ
Tree1.Items.AddChildObject(Tree1.Items.Item[i],
FieldByName(cNodeName).AsString,
Pointer(FieldByName(idNode).asInteger)); // добавляем дочерние объекты
break;
end
else
Inc(i);
Next;
end;
end;
Tree1.EndUpdate;
end;
-----
Изменяем один из узлов: событие onEdited, обработчик:
- Код: Выделить всё
procedure TForm1.EditItemName(Node: TTreeNode; var S: ansistring);
var
i:integer;
begin
SQLTransaction1.Active:=False;
if not Connect1.Connected then Connect1.Open;
SQLTransaction1.Active:=true;
with Query1 do
begin
Close;
SQL.Clear;
SQL.Text:='UPDATE '+TableName+' SET '+cNodeName+'=:NameText WHERE '+idNode+' = :idNodeWhereValue ;'; // запрос на выборку
Params.ParamByName('NameText').Value:=S;
Params.ParamByName('idNodeWhereValue').Value:=IntToStr(Integer(Node.Data));
execSQL;
SQLTransaction1.Commit;
SQLTransaction1.Active:=false;
Clear();
FillTree();
end;
end;
Далее чистим дерево процедурой:
- Код: Выделить всё
procedure Clear();
var
i:integer;
begin
with Tree1 do
begin
for i:=Items.Count-1 downto 0 do
begin
Items[i].Data:=nil;
Items[i].Free;
end;
end;
end;
И заново заполняем
- Код: Выделить всё
FillTree()
И получаем странный результат, а именно Node7 (см лог) имеет имя, которое мы указали при изменении Node14. Слево - дерево. Справа - лог из процедуры заполнения.
Не могу понять отчего так происходит. Притом, если кинуть кнопку и назначить процедуру очистки и заполнения на нее, то все обновляется ок.
Накидал текстовый проект (~460кб) скачать можно здесь (YandexDisk):
https://yadi.sk/d/t_7oRPBs3MTyow
-------------------
Вариант без БД.
Изначальный вариант с ошибкой. Пробуем править узел.
https://yadi.sk/d/uo3W0J-g3MYqXY
Вариант, предложенный zub.
https://yadi.sk/d/6ZYVCZQC3MYqaV
Проверил компиляцию Win/Mac - норм.