我现在想在edit1中输入一个值,如果此值是treeview中的一个节点值则相应展开,否则不变化,递归遍历的方法解决 谢谢大家了

解决方案 »

  1.   

    unit Main;interfaceuses
    Windows, Messages, SysUtils, Classes, Graphics, 
    Controls, Forms, Dialogs,
    StdCtrls, ExtCtrls;type
    TForm1 = class(TForm)
    SearchBtn: TButton;
    DirectoryEdt: TMemo;
    PathEdt: TEdit;
    Label1: TLabel;
    Image1: TImage;
    procedure SearchBtnClick(Sender: TObject);
    procedure MakeTree;
    private
    { Private declarations }
    public
    { Public declarations }
    end;var
    Form1: TForm1;implementation{$R *.DFM}procedure TForm1.MakeTree;
    var
    Sr: TSearchRec;
    Err: Integer;
    FilePath: string;
    begin
    Err := FindFirst(‘*.*‘,$37,Sr); //$37为除Volumn 
    ID Files外的所有文件
    // 如果找到文件
    while (Err = 0) do
    begin
    if Sr.Name[1] <> ‘.‘ then
    begin
    //找到文件
    if (Sr.Attr and faDirectory) = 0 then
    beginend;
    //找到子目录
    if (Sr.Attr and faDirectory) = 16 then
    begin
    FilePath := ExpandFileName(Sr.Name);
    DirectoryEdt.Lines.Add(FilePath);
    ChDir(Sr.Name);
    MakeTree;
    ChDir(‘..‘);
    end;
    end;//结束递归
    Err := FindNext(Sr);
    end;
    end;procedure TForm1.SearchBtnClick(Sender: TObject);
    begin
    DirectoryEdt.Lines.Clear;
    ChDir(PathEdt.Text);
    MakeTree;
    end;end.
    这是个递归搜文件的例子,
      

  2.   

    摘 要:将数据表连接到TreeView中
    关键字:数据表 TreeView
    类 别:API
    CoDelphi.com版权所有,未经允许,不得进行任何形式转载procedure 
    AddDataToTree(TreeView:TTreeView;DataSet:TDataSet) 
    var 
    TreeNodes:TTreeNodes 
    TreeNode:array[0..100] of TTreeNode; 
    i:Integer; 
    begin 
    DataSet.Close; 
    DataSet.Open; 
    TreeNodes=TTreeView.Items; 
    if DataSet.RecordCount&gt;0 then 
    begin 
    DataSet.First; 
    while not DataSet.Eof do 
    begin 
    TreeNode[0]=TreeNodes.Add(Nil,Data
    Set.Fields[0].AsString); 
    for i=1 to DataSet.Fields.Count-1 
    do 
    TreeNode[i]=TreeNodes.AddChild
    (TreeNode[i-1],DataSet.Fields[i].AsString); 
    DataSet.Next; 
    end; 
    end; 
    end;
      

  3.   

    其实看在线帮助是最好的了!另外就是要多用,Treeview我用
    的比较多,有什么问题可以问具体点!
    楼上的说的不错,要注意的是Node节点中的.data是一个指
    针,要小心使用!Delphi帮助文件里是这样写的:
    Set ToolTips to True to specify that items in the 
    tree view control have tooltips (Help Hints当前的节点为: TreeView1.Selected;
    他的字节点:child,父节点:Parent
    其中的TreeNode的类型下可以保存一个指针类型的值;
      

  4.   

    非用递归不可吗?zh这样行不行?
    N:TTreeNode;
    N:=tvWG.Items.Item[0];
          while not (N=nil) do
          begin
            if (N.Text=Trim(edtSearch.Text)) or
               (Pos(Trim(edtSearch.Text),N.Text)>0) then
            begin
              N.Selected := True;
              exit;
            end;
            N:=N.GetNext;
          end;
      

  5.   

    1楼把事情复杂化了,实现也的确不需要使用递归,这样就可以了procedure TForm1.Edit1Change(Sender: TObject);
      procedure FindAndExpandNode(str: String; tv: TTreeView);
      var
        i: Integer;
        node: TTreeNode;
      begin
        node := nil;    //查找是否有node符合条件
        for i := 0 to (tv.Items.Count - 1) do
          if (tv.Items[i].Text = str) then
          begin
            node := tv.Items[i];
            Break;
          end;    //有node符合条件,则循环把该node及其上级路径展开
        while (node <> nil) do
        begin
          node.Expand(False);
          node := node.Parent;
        end;
      end;
    begin
      FindAndExpandNode(Edit1.Text, TreeView1);
    end;
      

  6.   

    兄弟,你要试着把递归转化为非递归实现,以下是俺非递归保存/加载ttreeview的items的过程,希望
    对你有用.
    type
     TNodeInfo=record
        text:string;
        Deep:integer;//节点深度,从1开始
     end;
    procedure mLoadTreeviewProcess(treeNodes:TTreeNodes;fileName:string);
    //使用方法:在form的oncreate中加入:mLoadTreeviewProces(ttreeView1.items,'c:\NodesData.dat')
    var
      Node,NewNode:TTreeNode;
      deep:Integer;
      NewNodeInfo:TNodeInfo;
      s:string;
      F: TextFile;
    begin
      Node:=nil;
      deep:=1;
      Assignfile(F, fileName);
      reset(F);
      treeNodes.Clear;  while not eof(F) do
      begin
        //getNodeInfo(NewNodeInfo);
        Read(F,S);
        NewNodeInfo.text:=Copy(S,1,Pos(' ',S)-1);
        NewNodeInfo.Deep:=StrToInt(copy(S,Pos(' ',S)+1,Length(S)-Pos(' ',S)));
        if NewNodeInfo.deep>deep then
        begin
          newNode:=treeNodes.addchild(Node,NewNodeInfo.text);      deep:=deep+1;
          Node:=newNode;
          Readln(F,s);//moveNext;
        end else if NewNodeInfo.deep=deep then
        begin
          newNode:=treenodes.add(Node,NewNodeInfo.text);
          Node:=NewNode;
          Readln(F,s);
        end else
        begin
          repeat
            Node:=Node.Parent;
            deep:=deep-1;
          until deep=NewNodeInfo.Deep;
          newNode:=treenodes.add(Node,NewNodeInfo.text);
          Node:=NewNode;
          Readln(F,s);
        end;
      end;  CloseFile(F);
    end;procedure mSaveTreeviewProcess(treeNodes:TTreeNodes;fileName:string);
    //使用方法:在form的onclose中加入:mSaveTreeviewProcess(ttreeView1.items,'c:\NodesData.dat')
    var
      tNode,Node:TTreeNode;
      deep:integer;
      F: TextFile;
      newNodeInfo:TNodeInfo;
      s:string;
    begin
      if treeNodes.Count=0 then exit;
      Node:=treeNodes.GetFirstNode;
      deep:=1;
      Assignfile(F, fileName);
      rewrite(F);  //创建一个新文件  while Node<> nil do
      begin
        newNodeInfo.text:=Node.Text;
        newNodeInfo.Deep:=deep;
       // WriteNodeInfo(newNodeInfo);
        s:=Trim(newNodeInfo.text)+' '+IntToStr(newNodeInfo.Deep);
        Writeln(F,s);//写操作    if Node.HasChildren then
        begin
          Node:=Node.getFirstChild;
          deep:=deep+1;
        end else
        begin
          tNode:=Node;
          Node:=tNode.getNextSibling;
          while (Node=nil) and (deep>1) do
          begin
            tNode:=tNode.parent;
            Node:=tNode.getNextSibling;
            deep:=deep-1;
          end;
        end;
      end;
      CloseFile(F);
    end;
      

  7.   

    不需要递归,用hthunter的方法就可以了。
      

  8.   

    不需要用到递归hthunter方法就可
      

  9.   

    这个问题不难
    支持 hthunter