【问题标题】:Implementing OnExpand/OnCollapse events for TTreeViewItem in Firemonkey在 Firemonkey 中为 TTreeViewItem 实现 OnExpand/OnCollapse 事件
【发布时间】:2014-11-13 20:36:53
【问题描述】:

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

  • 事件触发两次;
  • 当您展开 TreeViewItem2(示例名称)时,会为 TreeViewItem1 触发该事件。

我正在使用 Delphi XE7

有什么建议吗? :)

【问题讨论】:

  • 我不明白你的第二点,“该事件触发了尚未分配 OnChangeExpanded 的 TTreeViewItem 项。” OnChangeExpanded触发的事件,不赋值怎么触发呢?
  • @MikeSutton 我的意思是当您展开 TreeViewItem2 时,分配给 TreeViewItem1 的事件会被触发。我会改进那个子弹。
  • 在这种情况下,样式系统听起来有些奇怪(样式缓存可能会出现问题)。我会回来的,但可能需要几天时间。
  • @MikeSutton 我认为它与重新触发动画的 Realign 方法有关。但我找到了答案,我目前正在添加它。

标签: delphi firemonkey collapse expand treeviewitem


【解决方案1】:

我错过了在 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,因为我认为这是缺乏基本功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多