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. 这是个递归搜文件的例子,
摘 要:将数据表连接到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>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;
其实看在线帮助是最好的了!另外就是要多用,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的类型下可以保存一个指针类型的值;
非用递归不可吗?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;
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;
兄弟,你要试着把递归转化为非递归实现,以下是俺非递归保存/加载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;
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.
这是个递归搜文件的例子,
关键字:数据表 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>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;
的比较多,有什么问题可以问具体点!
楼上的说的不错,要注意的是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的类型下可以保存一个指针类型的值;
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;
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;
对你有用.
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;
支持 hthunter