仅通过节点图像单击来展开/折叠TreeView

时间:2010-01-01 18:33:41

标签: delphi

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

similar question

4 个答案:

答案 0 :(得分:3)

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

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

但请注意不要破坏键盘导航。因此,您需要检查事件的来源,如果是键盘事件(光标左/右),请保留操作进度。

要跟踪创建者事件,请捕获OnMouseDown和OnKeyDown事件,并设置收到的最新事件类型的内部指示器,以便检查以后的OnCollapsing和OnExpanding事件过程。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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.

答案 3 :(得分:0)

如果您使用的是VirtalTreeView

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

toToggleOnDblClick 双击节点展开状态。