2010-01-01 133 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. 
相關問題