动态从数据表中(结构未知)读取数据,然后构成TreeView树(多级,且级数未知),望高手不吝赐教:最优算法及数据存储方法??不是最优的也行,只能给我点启示就好!希望来点完整的源代码,如果必要请发到,非常谢谢! :)
解决方案 »
- delphi2007的dbclient.pas文件在哪?
- delphi中写带有"(双引号)字符串的sql语句,执行时会出错
- 我的程序为什么不能运行,看不到啊,
- combobox.Items.AddObject问题
- 两个ACCESS数据库如何将一个的数据合并到另一个!
- 各位大侠请问DELPHI里的反正弦函数是什么
- 如何解决:Insufficient memory for this operation.
- @@@@@ D5程序升级到D6时出现严重错误。你能解决吗?因为觉得几乎没有解决的希望,所以也不给高分了。 // adailee 2002-04-28
- 有谁会用Delphi写测试程序
- 请赐教:WIN2000下写的代码,在WIN98下出现问题
- 程序运行的时候提示说不能连接到数据库 请大家帮忙分析! 200410
- 急,怎樣解決這個的報表,解決馬上給分
主要是设置构成树的两个节点字段就可以了
可以从TTreeView继承出来,生成一个新的树节点
看看Virtual Control里面的树形组件,好快!
id
parentidparentid与id关联起来就可以了。
呵呵。这个好像不是算法:)但是满足你的数据库表未知等要求。
procedure Tfrm_OrganizeM.AddChildNode(CurrentNode: TTreeNode) ;
var
ChildNode : TTreeNode;
Q_Temp : TADOQuery;
NodeText ,Dep06 ,tvDepCaption: String;
begin
NodeText := CurrentNode.Text;
Dep06 := Copy(NodeText,Pos('[',NodeText)+1,Pos(']',NodeText)-Pos('[',NodeText)-1);//父节点
Q_Temp :=TADOQuery.Create(nil);
Q_Temp.Connection := DMEnterpriseInfo.Q_DepTemp.Connection;
Q_Temp.SQL.Add('Select Dep01,Dep02 From Dep Where Dep06 ='+ Dep06);
Q_Temp.Open;
if Q_Temp.IsEmpty then
begin
Q_Temp.Free;
Exit;
end;
while not Q_Temp.Eof do
begin
tvDepCaption := Q_Temp.FieldbyName('Dep02').AsString +'['+ Q_Temp.FieldbyName('Dep01').AsString+']';
ChildNode := tvOrganize.Items.AddChild(CurrentNode,tvDepCaption);
AddChildNode(ChildNode);//递归调用
Q_Temp.Next;
end;
Q_Temp.Free;
end;
name1 0 root 1
name2 00 0 2
name3 01 0 2
name4 010 01 3
name5 1 root 1
name6 10 1 2
..................
也就是说第一个记录节点名称(name),第二个记录节点代码(code),第三个记录父节点代码(parent),第四个记录节点级别(grade)
用这个函数来读入treeview:function GradeToSpace(SpaceCount: Integer): string;
var
I: Integer;
S: string;
begin
S := ' ';
result := '';
if SpaceCount <> 1 then
for I := 1 to SpaceCount - 1 do
begin
result := result + S;
end;
end;procedure DeptToText(LsQuery: TQuery; LoadView: TTreeView; LsGrade, LsName,LsCode:string);
var
FileId: Integer;
f: textfile;
begin
FileId := FileCreate(ExtractFilePath(ParamStr(0)) + 'Dept.txt');
FileClose(FileId);
assignfile(f, ExtractFilePath(ParamStr(0)) + 'Dept.Txt');
Append(f);
with LsQuery do
begin
DisableControls;
First;
while not Eof do
begin
Writeln(f, GradeToSpace(FieldByName(LsGrade).asinteger)
+ FieldByName(LsName).AsString+'[' + FieldByName(lscode).AsString + ']');
Next;
end;
First;
EnableControls;
end;
Flush(f);
closefile(f);
LoadView.Items.Clear;
LoadView.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Dept.Txt');
DeleteFile(Pchar((ExtractFilePath(ParamStr(0)) + 'Dept.Txt')));
end;使用时:
procedure TForm1.FormCreate(Sender: TObject);
begin
adoquery1.sql.text :='select * from tablename order by code';
adoquery1.open;
DeptToText(adoquery1,treeview1,'grade','name','code');
end;