树状图的问题

lijucheng8 2010-08-02 11:11:47
下面是我用delphi 写的显示树状图的代码,只能显示一个部门,不知那里错了:
qryexec(qry1,'select * from bumen order by bmm');
TreeView1.Items.Clear ; //TreeView1是中文,TreeView2是ID,隐藏的
TreeView2.Items.Clear ;
inittree(qry1,TreeView1,TreeView2,0,true);

procedure inittree(qry:tadoquery;treeview:ttreeview;treeview1:ttreeview;parentid:integer;isExpanded:boolean);
var i:integer;
MyTreeNode,MyTreeNode1: TTreeNode;
tmpqry:tadoquery;
abc:string;
begin
if parentid=0 then
begin
MyTreeNode:=treeview.Items.Add(nil,'所有部门');
MyTreeNode.SelectedIndex :=1;
MyTreeNode1:=treeview1.Items.Add(nil,'id部门');
MyTreeNode1.SelectedIndex :=1;
end;
tmpqry:=tadoquery.Create(nil);
tmpqry:=qry;
tmpqry.Filter:='dirid='''+inttostr(parentid)+'''';
tmpqry.Filtered:=true;
tmpqry.first;
while not tmpqry.Eof do
begin
MyTreeNode:=treeview.Items.AddChild(MyTreeNode,tmpqry.fieldbyname('bm').asstring);
MyTreeNode1:=treeview1.Items.AddChild(MyTreeNode1,tmpqry.fieldbyname('id').asstring);
MyTreeNode.SelectedIndex:=1;
MyTreeNode1.SelectedIndex:=1;
inittree(tmpqry,treeview,treeview1,tmpqry.fieldbyname('id').AsInteger ,true);
tmpqry.Next;
end;
end;
...全文
119 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ilovemovieboy 2010-08-03
  • 打赏
  • 举报
回复
不必自己写了,用Ehlib 5.2直接显示树形结构记录。
kye_jufei 2010-08-03
  • 打赏
  • 举报
回复
3.還有,不是多階樹狀圖關係請盡量不要使用遞歸的方法(如果確定需要遞歸,請在遞歸中再使用線程);不然產生樹狀關係圖時速度會讓你吃不消...
kye_jufei 2010-08-03
  • 打赏
  • 举报
回复
2.調用過程並生成樹:

procedure TRES_BOM_VIEW_F.btnSB_SearchClick(Sender: TObject);
begin
inherited;
try
RES_LOADING_F:=TRES_LOADING_F.Create(Self);
RES_LOADING_F.Label1.Caption:='正在檢索相關數據......';
RES_LOADING_F.Show;
RES_LOADING_F.Update;
CREATETREEVIEWMODEL;
finally
RES_LOADING_F.Close;
end;
end;
kye_jufei 2010-08-03
  • 打赏
  • 举报
回复
請參考以下代碼再作修改:

1.自定義生成樹的過程:
procedure TRES_BOM_VIEW_F.CREATETREEVIEWMODEL;
var
iLoop:Integer;
Master,MasterNode:TTreeNode;
begin
adoq_getop.Close;
//SELECT distinct PARN_TYP FROM WWW where parn_typ<>'.' and parn_typ is not null order by PARN_TYP desc
adoq_getop.SQL.Text:='SELECT distinct PARN_TYP FROM WWW where parn_typ<>''.'' and parn_typ is not null order by PARN_TYP desc';
adoq_getop.Open;
adoq_getop.First;
cx_TV.Items.BeginUpdate;
cx_TV.Items.Clear;
Master:=cx_TV.Items.Add(nil,'昆盈BOM表檢視');
while not adoq_getop.Eof do
begin
if adoq_getop.FieldByName('PARN_TYP').AsString<>'' then
begin
Screen.Cursor:=crSQLWait;
MasterNode:=cx_TV.Items.AddChild(Master,VarToStr(adoq_getop.FieldValues['PARN_TYP']));
Application.ProcessMessages;
qry_op.Close;
qry_op.SQL.Text:='SELECT DISTINCT PARN_LITM FROM WWW WHERE PARN_TYP='''+ VarToStr(adoq_getop.FieldValues['PARN_TYP'])+''' GROUP BY PARN_LITM';
qry_op.Open;
for iLoop:=0 to qry_op.RecordCount -1 do
begin
cx_TV.Items.AddChild(MasterNode,VarToStr(qry_op.FieldValues['PARN_LITM']));
qry_op.Next;
end;
Application.ProcessMessages;
cx_TV.Items.EndUpdate;
Screen.Cursor:=crDefault;
end;
adoq_getop.Next;
Application.ProcessMessages;
end;
{
ThreadTView:=cx_TV;
ViewThread:=TExpandLH.Create;
ViewThread.Resume;
}
end;
iamduo 2010-08-03
  • 打赏
  • 举报
回复
Filter 以后
First
Next
也是我喜欢的写法。

不过上次失败的时候,是我用 D2010 了。那个版本下,对这种做法貌似会无法执行。
D7下应该不会有问题。

你的版本是?
lijucheng8 2010-08-02
  • 打赏
  • 举报
回复
高手没在吗
lijucheng8 2010-08-02
  • 打赏
  • 举报
回复
去掉这句也是一样的:tmpqry.first;
风之谷 2010-08-02
  • 打赏
  • 举报
回复
tmpqry.first;


逻辑错误
bdmh 2010-08-02
  • 打赏
  • 举报
回复
每次执行时,都会tmpqry.first;永远在第一条

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧