2010-01-01 120 views
1

我在我的窗体上有很多项目/节点的TreeView。当我双击一个节点的一个项目时,我运行一个程序(取决于点击的项目)。我的问题是,我希望它只在点击节点图标(+或 - 号)时展开/折叠,不,如果我双击一个项目展开/折叠只有节点图像的TreeView点击

similar question

+0

如果您不遵循该控件的约定,您会混淆用户。 – 2010-01-04 16:21:42

回答

1

我知道,这不是一个很好的解决方案,但它的工作原理:)。

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

这可能会导致闪烁,尤其是如果您在TWDblClick()中调用其他函数需要花费大量时间。要解决这个问题,请在切换展开/折叠状态后立即调用TW.Repaint。 (对BeginUpdate/EndUpdate的调用是不必要的。) – 2011-03-24 13:34:13

3

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

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

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

为了跟踪创始者事件,捕获OnMouseDown和OnKeyDown事件,并设置收到的最新事件类型的内部指示符,以便您可以检查以后的OnCollapsing和OnExpanding事件过程。

+0

+1为正确解释。我还注意到,在OnMouseDown处理程序中使用GetHitTestInfoAt(如果允许扩展)是没有意义的,因为控件已经改变了控件的视觉状态(继承已经调用),所以你最终可以用htOnIndent而不是htOnButton当点击扩展器/收缩器时 – Maksee 2012-06-20 14:59:16

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. 
相关问题