Перейти к содержанию
  • 0
Dzuyba

Как можно реализовать в TTreeView события OnExpand и OnCollapse?

Вопросы

Как можно реализовать данное событие а лучше целых 2 события OnExpand и OnCollapsed

Поделиться сообщением


Ссылка на сообщение

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

  • 0

Реализовать данные события можно через стили. Находишь в стиле элемент клик на который должен вызывать раскрытие или закрытие дочернего элемента (плюсик, стрелочка и т.д.). Как правило это элемент класса TButton или TButtonStyleObject, что бы мог изменять состояние при нажатии автоматически. Создаешь процедуру которая будет присваивать элементу стиля обработчик нажатия.

procedure TFForder.TreeView2ApplyStyleLookup(Sender: TObject);
var
  Item: TTreeViewItem;
begin
  Item := TTreeViewItem(Sender);
  Item.StylesData['button'] := TValue.From<TNotifyEvent>(Click);
end;

При создании дочернего элемента TTreeView:

It.OnApplyStyleLookup := Treeview2.OnApplyStyleLookup;

И пишешь саму процедуру при нажатии на элемент стиля где выясняешь надо свернуть или развернуть элемент:

function FindItemParent(Obj: TFmxObject; ParentClass: TClass): TFmxObject;
begin
  Result := nil;
  if Assigned(Obj.Parent) then
    if Obj.Parent.ClassType = ParentClass then
      Result := Obj.Parent
    else
      Result := FindItemParent(Obj.Parent, ParentClass);
end;
procedure TFForder.Click(Sender: TObject);
var
 Item: TTreeViewItem;

begin
  TreeView2.BeginUpdate;
  Item := TTreeViewItem(FindItemParent(Sender as TFmxObject,TTreeViewItem));

  if Item <> nil then
    if Item.IsExpanded = False then 
    begin
      //здесь пишешь то что надо сделать при разворачивании элемента
      Item.Expand;
    end 
    else 
    begin
      //здесь пишешь что надо сделать при сворачивании элемента
      Item.Collapse;
    end;
  TreeView2.EndUpdate;
end;
Отредактировал Brovin Yaroslav
Отформатирован код

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.

  • Похожий контент

    • От x11
      Может кому пригодится.
      Немножко запутался я, т.к. в FMX почти любая визуальная компонента может быть контейнером для другой компоненты.
       
      Рабочий код.
      function GetPathFromNode(AItem: TTreeViewItem): String; begin if AItem = nil then exit('ничего не выбрано'); while Assigned(AItem) and (AItem is TTreeViewItem) do begin Result := AItem.Text + '/' + Result; AItem := TTreeViewItem(AItem.ParentItem); end; Delete(Result, Length(Result), 1); end;  
      проблема была у меня AItem.Parent
      а правильно - AItem.ParentItem
    • От x11
      Почему этот цикл "видит" только первый уровень дерева?
      Тогда как правильно организовать поиск нужного TreeViewItem`а по всем узлам, по всему дереву?
       
      function TfmTree.FindItemByIndex(id_parent: Integer): TTreeViewItem; var i: Integer; begin Result := nil; for i:= 0 to Pred(TreeView1.Count) do if TreeView1.Items[i].Tag = id_parent then begin Result := TreeView1.Items[i]; break; end; end;  
    • От david_yusupov
      Точнее, как работает наследование.
        TNodeItem = class(TTreeViewItem)   public     constructor Create(AOwner: TComponent); override;     destructor Destroy; override;   end;     TNodeItem2 = class(TNodeItem)   public     constructor Create(AOwner: TComponent); override;     destructor Destroy; override;   end; реализация { TNodeItem } constructor TNodeItem.Create(AOwner: TComponent); begin   inherited Create(AOwner); end; destructor TNodeItem.Destroy; begin   inherited; end; { TNodeItem2 } constructor TNodeItem2.Create(AOwner: TComponent); begin   inherited Create(AOwner); end; destructor TNodeItem2.Destroy; begin   inherited; end; // Вот самое интересное, не много не понятно почему так
      procedure TForm1.Button2Click(Sender: TObject); var   xTree: TTreeViewItem; begin   // Тут все работает   xTree := TTreeViewItem.Create(nil);   xTree.Text := 'Тест2';   xTree.Parent := TreeView1; end; procedure TForm1.Button3Click(Sender: TObject); var   xTree: TNodeItem; begin   // И тут все работает   xTree := TNodeItem.Create(nil);   xTree.Text := 'Тест3';   xTree.Parent := TreeView1; end; procedure TForm1.Button4Click(Sender: TObject); var   xTree: TNodeItem2; begin   // А вот тут не работает, узел добавляется, а текста нет.   xTree := TNodeItem2.Create(nil);   xTree.Text := 'Тест4';   xTree.Parent := TreeView1; end;  
    • От golomeen
      Поэкспериментировал и нашел простейший случай - узел и в нем два листа.
      Алгоритм следующий (упрощенно)
      каждый лист показывает пару key=value
      при клике в узел остается только key= и показывается листвью с выбором value. Затем мы получаем грубо key=new value (хотя не обязательно)
      После такой операции вы обязательно получаем то что 2 листа меняются местами
       
      С узлом ничего не происходит ни программно ни фактически
       
      В более сложных случаях тоже шевеление наблюдается, но я его не изучал подробно
    • От slava_d2000
      Добрый день!
       
      Прошу подсказать как программно выделить элемент дерева.
    • От Dzuyba
      Мне требуется динамически добавлять и удалять элементы дерева. И чтобы лучше понять как работать с FMX.TreeView.TTreeView я написал простой тестовый примерчик и который не могу заставить работать. Приложение вообще падает. Может подскажите где я ошибаюсь.
       
      Описание тестового примера
      Нужно когда пользователь разворачивает (Expand) элементы дерева, я хочу удалять все дочерние элементы затем добавлять новые дочерние элементы и потом уже пускай родительский TreeViewItem раскрывается (Expand) для показа новых дочерних элементов.
       
      Для эмуляции OnExpand и OnCollapse пользуюсь способом, описанным тут: Как можно реализовать в TTreeView события OnExpand и OnCollapse?
       
      Тест кейс
      Достаточно создать корневой элемент, В него добавит дочерний элемент  Потом раскрывать (Expand) корневой элемент. И приложение падает. Когда происходит ошибка
      Добавляешь корневой элемент дерева, потом в него дочерний элемент. Пытаешься развернуть (Expand) корневой элемент (кликая мышкой по плюсику) и приложение падает.
       
      Тестовый проект: Test_Tree.zip
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...