【问题标题】:expand/collapse TreeView only by node image click仅通过节点图像单击展开/折叠 TreeView
【发布时间】:2010-01-01 18:33:40
【问题描述】:

我的表单上有一个包含大量项目/节点的 TreeView。当我双击节点的一个项目时,我运行一个过程(取决于单击的项目)。我的问题是我希望它仅在我单击节点的图标(+ 或 - 符号)时展开/折叠,如果我双击一个项目,则不会

similar question

【问题讨论】:

  • 如果你不遵循该控件的约定,你会迷惑用户。

标签: delphi


【解决方案1】:

您可以使用 OnCollapsing 和 OnExpanding 事件的 AllowCollapse 和 AllowExpand 参数来防止节点被折叠或展开。

将其与适当的逻辑相结合,以识别被点击的节点部分。如果生成的点击是在图标上,让动作继续进行,如果不是,则忽略它(设置 AllowXxxxx:=false)

但请注意不要破坏键盘导航。因此,您需要检查事件的来源,并在键盘事件(左/右光标)的情况下离开操作进度。

要跟踪发起者事件,捕获 OnMouseDown 和 OnKeyDown 事件,并设置一个内部指示符来指示最近收到的事件的类型,以便您检查以后的 OnCollapsing 和 OnExpanding 事件过程。

【讨论】:

  • +1 以获得正确解释。我还注意到在 OnMouseDown 处理程序中使用 GetHitTestInfoAt 没有意义(如果允许扩展),因为控件已经更改了控件的视觉状态(已继承已调用),因此您最终可以使用 htOnIndent 而不是 htOnButton当点击展开器/折叠器时
【解决方案2】:

我知道,这不是一个好的解决方案,但它有效:)。

procedure TForm1.TWDblClick(Sender: TObject);
begin
TW.Items.BeginUpdate;
TW.Selected.Expanded:=not TW.Selected.Expanded;
TW.Items.EndUpdate;
end;

【讨论】:

  • 这可能会导致闪烁,尤其是当您在 TWDblClick() 中调用其他一些需要相当长的时间的函数时。要解决此问题,请在切换展开/折叠状态后立即调用 TW.Repaint。 (不需要调用 BeginUpdate/EndUpdate。)
【解决方案3】:
unit TreeViewNav;

interface

uses
  SysUtils, Classes, Controls, ComCtrls, Messages;

type
  TNavTreeView = class(TTreeView)
  private
    procedure WMLButtonDblClk(var Message: TWMLButtonDblClk);
      message WM_LBUTTONDBLCLK;

  protected
    FNoCollapse: Boolean;
    function CanCollapse(Node: TTreeNode): Boolean; override;
  end;

implementation

{ TNavTreeView }

function TNavTreeView.CanCollapse(Node: TTreeNode): Boolean;
begin
  Result := not FNoCollapse and inherited;
  FNoCollapse := False;
end;

procedure TNavTreeView.WMLButtonDblClk(var Message: TWMLButtonDblClk);
var
  PX, PY: Integer;
  HT: THitTests;
begin
  with Message do
    if (Width > 32768) or (Height > 32768) then
      with CalcCursorPos do
      begin
        PX := X;
        PY := Y;
      end
    else
    begin
      PX := XPos;
      PY := YPos;
    end;

  HT := GetHitTestInfoAt(PX, PY);
  if htOnItem in HT then
  begin
    FNoCollapse := True;
  end;

  inherited;
end;

end.

【讨论】:

    【解决方案4】:

    如果您使用的是 VirtalTreeView

    TreeOptions.MiscOptions中有一个控制双击展开的设置

    toToggleOnDblClick 双击时切换节点展开状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多