Для этого надо найти ближайшего родителя у элемента класса, нужного класса (прошу прощения за тавтологию). С помощью вот такой вот универсальной функции.
Item := TListBoxItem(FindItemParent(Sender as TFmxObject,TListBoxItem));
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;
Что бы получить дочерний item зная его индекс надо воспользоваться функцией ItemByIndex самого ListBox-а:
var
Item: TListBoxItem;
Index: Integer;
begin
Item := ListBox1.ItemByIndex(Index);
end;
Реализовать данные события можно через стили. Находишь в стиле элемент клик на который должен вызывать раскрытие или закрытие дочернего элемента (плюсик, стрелочка и т.д.). Как правило это элемент класса 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;
Спасибо, я уже разобрался, всё дело было в том что требуется задавать обработчики событий для элементов стилей еще и в OnApplyStyleLookup задавать иначе они затираются.