在Firemonkey中为TTreeViewItem实现OnExpand / OnCollapse事件

时间:2014-11-13 20:36:53

标签: delphi firemonkey collapse expand treeviewitem

我需要对TTreeViewItem的扩展/折叠用户操作做出反应。但似乎Firemonkey的TTreeView / TTreeViewItem缺少这些事件。所有可用的方法TTreeViewItem都是私有的,并不是虚拟的,所以我无法挂钩。 我尝试了MokeyStyler's blog中描述的解决方案,但至少在Delphi XE7中它有奇怪的副作用:

  • 事件发生两次;
  • 当您展开TreeViewItem2(示例名称)时,将触发TreeViewItem1的事件。

我正在使用Delphi XE7

有什么建议吗? :)

1 个答案:

答案 0 :(得分:2)

我错过了在XE6及更高版本中有SetIsExpanded方法的事实,这是虚拟的。所以我的解决方案有点微不足道:

TTreeViewItem = class(FMX.TreeView.TTreeViewItem)
  private
    FOnChangeExpanded,
    FOnChangeCollapsed: TNotifyEvent;
  protected
    procedure SetIsExpanded(const Value: Boolean); override;
  published
    property OnChangeExpanded: TNotifyEvent read FOnChangeExpanded write FOnChangeExpanded;
    property OnChangeCollapsed: TNotifyEvent read FOnChangeCollapsed write FOnChangeCollapsed;
end;

...

procedure TTreeViewItem.SetIsExpanded(const Value: Boolean);
var
  LWasExpanded: boolean;
begin
  LWasExpanded := IsExpanded;
  inherited;
  if (IsExpanded) AND (LWasExpanded = false) then
    if Assigned(OnChangeExpanded) then
      OnChangeExpanded(Self)
    else
  else
    if Assigned(OnChangeCollapsed) then
      OnChangeCollapsed(Self);
end;

就是这样:))

I posted a QC for enhancement,因为我认为这缺乏基本功能。