一个treeview和imagelist关联,treeview的节点层次不定,ImageList有3个图片,0是节点未选中的效果,1是节点和其所有子节点被选中的效果,2是节点的子节点有的未被选中的效果。(瑞星和金山毒霸设置杀毒路径的效果类似),以上功能都已实现。我想遍历所有节点,如果选中则找和它同一个父节点的所有同级节点,如果所有同级节点被选中,则它的父节点就是要找的。现在如何快速找到所有这样的父节点?
for i:=0 to TreeView1.Items.Count-1 do
begin
  if TreeView1.Items[i].ImageIndex =1 then
  begin
     我只会找到这样的节点,然后的代码就不会了   
  end;
end;

解决方案 »

  1.   

    var
     TreeNode:TTreeNode;
    begin
    TreeNode:=TreeView.Selected; //获得被选中的节点
    if not (TreeNode=nil) then begin
      //TreeNode.Parent //获得父节点
    end;
    end;
      

  2.   

    procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
      procedure pSelect(mTreeNode: TTreeNode; mChecked: Boolean);
      var
        I: Integer;
      begin
        mTreeNode.ImageIndex := Ord(mChecked);
        mTreeNode.SelectedIndex := Ord(mChecked);
        for I := 0 to mTreeNode.Count - 1 do pSelect(mTreeNode[I], mChecked);
      end;
      procedure pUpdate(mTreeNode: TTreeNode);
      var
        I: Integer;
        S: set of Byte;
      begin
        while Assigned(mTreeNode.Parent) do
        begin
          S := [];
          for I := 0 to mTreeNode.Parent.Count - 1 do
            Include(S, mTreeNode.Parent[I].ImageIndex);
          if S = [0] then
          begin
            mTreeNode.Parent.ImageIndex := 0;
            mTreeNode.Parent.SelectedIndex := 0;
          end else
          if S = [1] then
          begin
            mTreeNode.Parent.ImageIndex := 1;
            mTreeNode.Parent.SelectedIndex := 1;
          end else
          begin
            mTreeNode.Parent.ImageIndex := 2;
            mTreeNode.Parent.SelectedIndex := 2;
          end;
          mTreeNode := mTreeNode.Parent;
        end;
      end;
    var
      vTreeNode: TTreeNode;
    begin
      if not (htOnIcon in TTreeView(Sender).GetHitTestInfoAt(X, Y)) then Exit;
      vTreeNode := TTreeView(Sender).GetNodeAt(X, Y);
      TTreeView(Sender).Items.BeginUpdate;
      try
        pSelect(vTreeNode, vTreeNode.ImageIndex = 0);
        pUpdate(vTreeNode);
      finally
        TTreeView(Sender).Items.EndUpdate;
      end;
    end;
      

  3.   

    楼主是想做一个带有checkBox的树吧,呵呵,
    我改写了DELPHI的代码,做了一个这个东西.最好是把它的底层代码也改进一下,就不要你用
    图片的编号了标志该节点是否被checked.
      

  4.   

    给TTreeNode加一个Checked:Boolean属性比较好用.