Перейти к содержанию
Fire Monkey от А до Я
  • 0

[TTreeView] При попытке создать дочерние итемы при разворачивании узла дерева, у меня возникает ошибка. В чем может быть проблема?


Dzuyba

Вопрос

Мне требуется динамически добавлять и удалять элементы дерева. И чтобы лучше понять как работать с FMX.TreeView.TTreeView я написал простой тестовый примерчик и который не могу заставить работать. Приложение вообще падает. Может подскажите где я ошибаюсь.

 

Описание тестового примера
Нужно когда пользователь разворачивает (Expand) элементы дерева, я хочу удалять все дочерние элементы затем добавлять новые дочерние элементы и потом уже пускай родительский TreeViewItem раскрывается (Expand) для показа новых дочерних элементов.

 

Для эмуляции OnExpand и OnCollapse пользуюсь способом, описанным тут: Как можно реализовать в TTreeView события OnExpand и OnCollapse?

 

Тест кейс

  1. Достаточно создать корневой элемент,
  2. В него добавит дочерний элемент 
  3. Потом раскрывать (Expand) корневой элемент.
  4. И приложение падает.

Когда происходит ошибка
Добавляешь корневой элемент дерева, потом в него дочерний элемент. Пытаешься развернуть (Expand) корневой элемент (кликая мышкой по плюсику) и приложение падает.

 

Тестовый проект: Test_Tree.zip

Изменено пользователем Brovin Yaroslav
Добавлен проект и описание тест кейса
Ссылка на комментарий

Рекомендуемые сообщения

  • 1
  • Администраторы

У вас простая ошибка в реализации OnExpandAction:

Вы вызываете 

Item.DeleteChildren

Этот метод удаляет все дочерние объекты. Но в FireMonkey в дочерние объекты так же входят объекты стиля. Поэтому вы по сути удалили все итемы и стиль этого элемента, хотя сами в OnClick (кнопки стиля узла дерева) еще находитесь в кнопке, которую разрушили.

 

Правило: удалять нужно только подитемы. Очистить подитемы в узле дерева можно так:

procedure RemoveSubNodes(ARoot: TTreeViewItem);
var
  SubNode: TTreeViewItem;
begin
  Assert(ARoot <> nil);

  while ARoot.Count > 0 do
  begin
    SubNode := ARoot.ItemByIndex(0);
    SubNode.Parent := nil;
    FreeAndNil(SubNode);
  end;
end;
Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...