关于树Treeview控件的运用。---在线等 ( 积分: 100 )

  • 主题发起人 主题发起人 zhangjensy
  • 开始时间 开始时间
Z

zhangjensy

Unregistered / Unconfirmed
GUEST, unregistred user!
请高手救命!
现在用树的方式来管理基本资料,左边是树,右边是相应的详细基本资料编辑。左边的树的层多少是没规定的,每一层代表一个类型,总之最后一层才为详细基本资料编码。这样一个界面如何处理,谁能帮帮我,要不然就要打包走人!
有根据数据库的数据显示树的算法?还有最后一层是一种类型的图标,其它各级是另一种图标表示是父级,这是如何设置的?
最好能有一个完整源代码例子!请发zhangjensy@163.com

1---基本资料
2---布面料
3----帆布
4------[a0001]10n帆布
3----双拼布
3----麻布
4------[a10002]11b麻布
2----部件
3------[b10003]
2----包装物
左边如上图,右边是根据左边的点击显示编辑界面,最后一级且为材料明细时显示一种界面,其它各级分类则显示相同的编辑界面。
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, DB, ADODB, ImgList;

type
Tfrm = class(TForm)
btn: TButton;
qry1: TADOQuery;
imaList: TImageList;
tvw1: TTreeView;
lbl1: TLabel;
lbl2: TLabel;
lbl3: TLabel;
edtID: TEdit;
edtName: TEdit;
edtBelong: TEdit;
procedure FormCreate(Sender: TObject);
procedure tvw1Change(Sender: TObject;
Node: TTreeNode);
procedure btnClick(Sender: TObject);
private
procedure FmtTree;
public
{ Public declarations }
end;


var
frm: Tfrm;

implementation

{$R *.dfm}

procedure Tfrm.FmtTree();
var
i,j :integer;
leafList,leafListPlus: TList;
leaf,subNode: TTreeNode;
tv: TTreeView;//引用窗体控件
qry: TADOQuery;//引用窗体控件
begin

//初始化
leafList:=TList.Create;
leafListPlus:=TList.Create;
tv:=tvw1;
tv.Items.Clear;
qry:=qry1;
subNode:=tv.Items.AddChild(nil,'月夜风筝(我)的公司');
leafList.Add(subNode);
//处理
while leafList.Count > 0do

begin

leafListPlus.Clear;
for i:=0 to leafList.Count-1do

begin

leaf:=leafList;
if leaf.Level = 0 then

qry.SQL.Text:=Format('select code,name,belong from TB where belong = ''%s''',['--'])
else

qry.SQL.Text:=Format('select code,Name,belong from TB where belong = ''%d''',[leaf.StateIndex]);
qry.Open;
for j:= 0 to qry.RecordCount-1do

begin

subNode:=tv.Items.AddChild(leaf,qry.FieldByName('name').AsString);
subNode.ImageIndex:=subNode.Level;
subNode.StateIndex:=StrToInt(qry.FieldByName('code').AsString);
leafListPlus.Add(subNode);
qry.Next;
end;

end;

leafList.Assign(leafListPlus);
end;

//清理
tv.FullExpand;
leafListPlus.Free;
leafList.Free;
end;


procedure Tfrm.btnClick(Sender: TObject);
begin

FmtTree;
end;


procedure Tfrm.tvw1Change(Sender: TObject;
Node: TTreeNode);
begin

edtID.Text:=InttoStr(tvw1.Selected.StateIndex);
edtName.Text:=tvw1.Selected.Text;
if tvw1.Selected.Level <> 0 then

edtBelong.Text:=tvw1.Selected.Parent.Text
else

edtBelong.Text:='无';
end;


procedure Tfrm.FormCreate(Sender: TObject);
begin

qry1.Close;
qry1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+ExtractFilePath(ParamStr(0))+'DBTree.mdb;Persist Security Info=False';
end;


end.
 
这个你可以将它们的关系存在一张表里,表的结构:id,parentid,name,isleaf。通过递归将整个树读出来。至于要显示的图标,你可判断该节点下是否还有子节点来设置图标
 
你可以翻翻我以前发的帖
http://www.delphibbs.com/keylife/iblog_show.asp?xid=17185
对你这挺合适,算法效率不优化了
 
帮你顶一个,接分
 
应该使用ehlib控件,
看里面例子:EhLib_4.1.4/DEMOS/TreeView
这样做最好不过了.
好容易的.
有用的话,记得来顶顶我贴
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3767839
 
注意了
千万不要在for while 使用
使用TADOQuery查询,花上几秒都不行.
比如:执行TADOQuery,1000千次,要花5秒左右.
用自己定义一个数组一次读完,再循环.
 
to ICC
想问一下,编号:code”,名称:name,所属:belong各具体的表现是什么?
比如我是这样的:
code是节点的代码,是STRING,不是规则的,例如:bl,pc,amyk,a001,bdcc等
name是相应节点的描述
belong是保存节点的父节点代码:象code一样。

不知我理解是否正确?
谢谢!
 
接受答案了.
 
但我关心是
谁能帮帮我,要不然就要打包走人!
要继续呆下去,记得Email我,我会很高兴能帮上点点忙.
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, DB, ADODB, ImgList;

type
Tfrm = class(TForm)
btn: TButton;
qry1: TADOQuery;
imaList: TImageList;
tvw1: TTreeView;
lbl1: TLabel;
lbl2: TLabel;
lbl3: TLabel;
edtID: TEdit;
edtName: TEdit;
edtBelong: TEdit;
procedure FormCreate(Sender: TObject);
procedure tvw1Change(Sender: TObject;
Node: TTreeNode);
procedure btnClick(Sender: TObject);
private
procedure FmtTree;
public
{ Public declarations }
end;


var
frm: Tfrm;

implementation

{$R *.dfm}

procedure Tfrm.FmtTree();
var
i,j :integer;
leafList,leafListPlus: TList;
leaf,subNode: TTreeNode;
tv: TTreeView;//引用窗体控件
qry: TADOQuery;//引用窗体控件
begin

//初始化
leafList:=TList.Create;
leafListPlus:=TList.Create;
tv:=tvw1;
tv.Items.Clear;
qry:=qry1;
subNode:=tv.Items.AddChild(nil,'月夜风筝(我)的公司');
leafList.Add(subNode);
//处理
while leafList.Count > 0do

begin

leafListPlus.Clear;
for i:=0 to leafList.Count-1do

begin

leaf:=leafList;
if leaf.Level = 0 then

qry.SQL.Text:=Format('select code,name,belong from TB where belong = ''%s''',['--'])
else

qry.SQL.Text:=Format('select code,Name,belong from TB where belong = ''%d''',[leaf.StateIndex]);
qry.Open;
for j:= 0 to qry.RecordCount-1do

begin

subNode:=tv.Items.AddChild(leaf,qry.FieldByName('name').AsString);
subNode.ImageIndex:=subNode.Level;
subNode.StateIndex:=StrToInt(qry.FieldByName('code').AsString);
leafListPlus.Add(subNode);
qry.Next;
end;

end;

leafList.Assign(leafListPlus);
end;

//清理
tv.FullExpand;
leafListPlus.Free;
leafList.Free;
end;


procedure Tfrm.btnClick(Sender: TObject);
begin

FmtTree;
end;


procedure Tfrm.tvw1Change(Sender: TObject;
Node: TTreeNode);
begin

edtID.Text:=InttoStr(tvw1.Selected.StateIndex);
edtName.Text:=tvw1.Selected.Text;
if tvw1.Selected.Level <> 0 then

edtBelong.Text:=tvw1.Selected.Parent.Text
else

edtBelong.Text:='无';
end;


procedure Tfrm.FormCreate(Sender: TObject);
begin

qry1.Close;
qry1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+ExtractFilePath(ParamStr(0))+'DBTree.mdb;Persist Security Info=False';
end;


end.

這個算法程度比較慢啊!
誰有更好的算法!
 
http://hi.baidu.com/worf/blog/item/8e4efc1144d94cc4a7ef3fa8.html
改良了一下,请再测试一下,效率是否可以
 

Similar threads

D
回复
0
查看
925
DelphiTeacher的专栏
D
D
回复
0
查看
880
DelphiTeacher的专栏
D
D
回复
0
查看
853
DelphiTeacher的专栏
D
后退
顶部