powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Удаление узла из TreeView
3 сообщений из 3, страница 1 из 1
Удаление узла из TreeView
    #39818801
BorodaOleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня!

Имеется TreeView со структурой (в приложении)
Цель - удалить определенный узел

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
procedure ClearNode(node: TTreeNode);
var nNode : TTreeNode;
begin
  // очистка определенного узла
  while node <> nil do begin
    if node.HasChildren then
       ClearNode(node.GetLastChild);   // GetFirstChild
    if node <> nil then begin
      NodeData:= Node.Data;
      if NodeData <> nil then begin

        if Условие then 
          nNode := nil
        else begin
          FreeAndNil(NodeData);
          nNode := node.getPrevSibling;
          node.Delete;
        end;
      end;
    end;
    {if nNode <> nil then node := nNode
    else node := node.getPrevSibling;      //  GetNextSibling;   }
    if nNode <> nil then node := nNode
    else if node <> nil then
      node := node.getPrevSibling
    else node := nNode;
  end;
end;



Как не бьюсь, или что-то не до конца удаляется, или натыкаюсь на Access violation.
Где я баганулся? Сам в упор не могу понять.

Заранее благодарен
...
Рейтинг: 0 / 0
Удаление узла из TreeView
    #39818818
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выкинь весь этот код напрочь.
Освобождай Data в OnDeletion.
Для нужного узла просто вызывай Delete (и DeleteChildren если оно не вызывается
автоматически).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Удаление узла из TreeView
    #39819237
BorodaOleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дима, спасибо за ответ.
К сожалению, тупо воспользоваться delete не получается, т.к. часть данных нужно удалять, а часть - нельзя.
Но вроде как решить проблему удалось.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
procedure TframeTreeDataModule.ClearNode(node: TTreeNode);
var nNode : TTreeNode;
begin
  // добавить очистку определенного узла
  while node <> nil do begin
    if node.HasChildren then
       ClearNode(node.GetLastChild);   // GetFirstChild
    if node <> nil then begin
      NodeData:= Node.Data;
      if NodeData <> nil then begin
        if "условие" then begin
          nNode := nil;
          node.Collapse(True);
        end else begin
          REPV := NodeData.REPV;
          if REPV <> nil then FreeAndNil(REPV);
          FreeAndNil(NodeData);
          nNode := node.getPrevSibling;
          node.Delete;
          node := nil;
        end;
      end else if node.Text = '' then begin
        nNode := node.getPrevSibling;
        node.Delete;
        node := nil;
      end;
    end;
    if nNode <> nil then node := nNode
    else if node <> nil then
      node := node.getPrevSibling
    else node := nNode;
  end;
end;



Тупо забыл выход по условию if NodeData <> nil then begin
а там пустые записи были, на которых Access violation и срабатывал.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Удаление узла из TreeView
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]