2014-10-19 2 views
0

이것은 모든 노드에 체크 박스가있는 treeview 구현입니다.델파이 Treeview에서 모든 체크 노드의 텍스트를 얻는 방법

procedure TTreeView.CreateParams(var Params: TCreateParams); 
begin 
inherited; 
    Params.Style := Params.Style or TVS_CHECKBOXES; 
end; 

지금, 나는 트 리뷰의 모든 검사 노드의 모든 텍스트를 가져오고 TTVItem에 필요한 상태 정보를 검색하는 TreeItem의 손잡이에 TVM_GETITEM 메시지 보내기 메모

+0

http://stackoverflow.com/questions/14045263/iterate-recursively-through-nodes-in- a-tree-view), 포커스는 체크되어지고 반복되지 않는다. 적어도 이전 버전에서는 체크 할 수있는 직접적인 접근이 없다. – bummi

답변

0

에를 추가하려면 올바른 마스크 및 항목 ID로 호출되는 경우 CommCtrl에 정의 된 레코드입니다.
이 작업은 TreeView_GetItem CommCtrl에서 찾을 수 있습니다 (복사).

그래서 상태가 점검되면 트리 뷰 항목을 반복해서 검사하면됩니다.

{type 
    TTreeView = Class(ComCtrls.TTreeView) 
    procedure CreateParams(var Params: TCreateParams); override; 
    End;} 

uses CommCtrl; 

Function TreeNodeChecked(n:TTreenode):Boolean; 
Const 
    TVIS_CHECKED = $2000; 
var 
    Item: TTVItem; 
begin 
    Item.mask := TVIF_STATE or TVIF_HANDLE; 
    Item.hItem := n.ItemId; 
    if Bool(SendMessage(n.Handle, TVM_GETITEM, 0, lParam(@Item))) then 
     Result := (Item.State and TVIS_CHECKED) = TVIS_CHECKED 
    else 
     Result := false; 
end; 

procedure TForm4.Button1Click(Sender: TObject); 
var 
    i: Integer; 
begin 
    ListBox1.Items.Clear; 
    for i := 0 to TV.Items.Count - 1 do 
    begin 
    if TreenodeChecked(TV.Items[i]) then 
     ListBox1.Items.Add(TV.Items[i].Text); 
    end; 
end; 

{ TTreeView } 

procedure TTreeView.CreateParams(var Params: TCreateParams); 
begin 
    inherited; 
    Params.Style := Params.Style or TVS_CHECKBOXES; 
end; 
난이, [트리 뷰의 노드를 통해 재귀 적으로 반복? (중복 생각하지 않습니다
관련 문제