2010-01-01 19 views
1

많은 항목/노드가 포함 된 TreeView에 대한 양식이 있습니다. 노드의 항목을 두 번 클릭하면 (클릭 한 항목에 따라) 프로 시저를 실행합니다. 내 문제는 노드의 아이콘 (+ 또는 - 부호)을 클릭 할 때만 노드를 확장/축소하려는 경우입니다. 나는 :)이 좋은 해결책은 아니지만 작동 항목 내가 아는확장/축소 노드 이미지 클릭에 의한 TreeView 클릭

similar question

+0

해당 컨트롤에 대한 규칙을 따르지 않으면 사용자를 혼동하게됩니다. –

답변

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에 대한 호출은 불필요합니다.) 정확한 설명은 –

3

당신은 축소 또는 확대되는 노드를 방지하기 위해 OnCollapsing 및 OnExpanding 이벤트의 AllowCollapse 및 AllowExpand 매개 변수를 사용할 수 있습니다.

적절한 논리를 사용하여 클릭 한 노드의 일부를 인식합니다. 클릭에 생성 된 클릭이 아이콘에있는 경우 액션을 진행시키고 무시한 다음 (AllowXxxxx : = false로 설정)

그러나 키보드 탐색을 중단하지 않도록주의하십시오. 따라서 이벤트의 출처를 확인해야하며, 키보드 이벤트 (커서 왼쪽/오른쪽)의 경우 작업 진행 상태를 유지해야합니다.

발신자 이벤트를 추적하고 OnMouseDown 및 OnKeyDown 이벤트를 캡처하고 수신 된 최신 이벤트 유형의 내부 표시기를 설정하여 나중에 OnCollapsing 및 OnExpanding 이벤트 프로세스를 확인할 수 있습니다.

+0

+1입니다. 컨트롤이 이미 컨트롤의 시각적 상태 (이미 호출 된)로 변경되었으므로 OnMouseDown 핸들러 내에서 GetHitTestInfoAt를 사용하는 것이 이해가되지 않는 것으로 나타났습니다 (이미 상속 됨). 그러면 htOnButton 대신 htOnIndent로 끝날 수 있습니다 확장기/collapser를 클릭하면 – Maksee

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. 
관련 문제