数据库里有个表叫sale_dq 里面的结构如下
dq_dqbh dq_dqmc dq_level
01 中国 1
0102 北京 2
010205 北京朝阳区 3
010206 北京东城区 3
010207 北京西城区 3
0103 上海 2
0103 台湾 2
010301 台南 3
020202 台北 3
.... ..... ....
现在我在form1里有一个treeview1,我要在form1 ONSHOW的时候这个树就要出来。(通过dq_dqbh来分辨节点间的父子关系)我用的控件还有ADOConnection1 和ADOQuery1,请高手帮我提供详细的代码让小辈学习学习,必将全体投地以示感谢!!![请不要转帖其他的帖子给我看,因为搜索功能我也会~~~ (:] 第一个给出正确代码的70分重谢!!!如觉不够可另开帖再重分感谢`~
dq_dqbh dq_dqmc dq_level
01 中国 1
0102 北京 2
010205 北京朝阳区 3
010206 北京东城区 3
010207 北京西城区 3
0103 上海 2
0103 台湾 2
010301 台南 3
020202 台北 3
.... ..... ....
现在我在form1里有一个treeview1,我要在form1 ONSHOW的时候这个树就要出来。(通过dq_dqbh来分辨节点间的父子关系)我用的控件还有ADOConnection1 和ADOQuery1,请高手帮我提供详细的代码让小辈学习学习,必将全体投地以示感谢!!![请不要转帖其他的帖子给我看,因为搜索功能我也会~~~ (:] 第一个给出正确代码的70分重谢!!!如觉不够可另开帖再重分感谢`~
解决方案 »
- 操作Word Excel以及CheckBox控件
- Edit的问题
- aaa字段为number[20,0],当字段值的位数为18位时,ADOQuery1.Fields('aaa').AsString出错
- 简单问题:如何让程序一运行后就处于ShowModal状态?(60分来拣!)
- 如何将WAVE文件用内存映射再进行播放?(这样做是想避免频繁读取硬盘,加快播放速度)
- 数据源问题??急用呀??
- 请教 windowsmediaplayer控件使用方法
- 为什么我的程序一启动就有5个线程啊
- Delphi的TClientDataSet如何用Filter过滤日期
- 让人发疯的ADO!
- 求 Microsoft Internet Explorer 源码
- DELPHI中利用TreeView控件建立目录树
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls,DBTables, ImgList, DB, DBClient;
const
cTreeCodeFormat='122222'; //编码格式。
cTreeMaxLevel=6;
cTreeRootTxt='地区名称' ;
type
TfrmFunctionLook = class(TForm)
tree: TTreeView;
ImageListTree: TImageList;
treeDB:TADOQuery;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure treeClick(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
procedure LoadTree(treeDB:TClientDataSet);//初始化树
procedure UpdateTree(curNode:TTreenode;nodeTxt:string;state:string);//更新树
function GetNodeLevel(sFormat,sCode:string):integer;//得到结点Level
end;var
frmFunctionLook: TfrmFunctionLook;
gNodelevel: integer; // 树节点层次
gNodeID: String; // 树节点ID
gNode: ttreenode; //当前节点
implementationuses PublicDMUnit;{$R *.dfm}procedure TfrmFunctionLook.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action:=caFree;
end;function TfrmFunctionLook.GetNodeLevel(sFormat, sCode: string): integer;
var
i,level,iLen:integer;
begin
level:=-1 ;
iLen:=0;
if (sFormat<>'') and (sCode<>'') then
for i:=1 to Length(sFormat) do
begin
iLen:=iLen+StrToInt(sFormat[i]);
if Length(sCode)=iLen then
begin
level:=i;
break;
end;
end;
result:=level;
end;procedure TfrmFunctionLook.LoadTree(treeDB:TClientDataSet);
//initial tree when main form create
var
curID,nodeTxt:string;
level,chindex,cnode,num:integer;
mynode:array[0..6] of TTreenode;
begin
//ini value
Screen.Cursor:=crHourGlass;
tree.Enabled:=True;
tree.Items.Clear;
level:=0 ;
num:=1;
tree.items.clear;
mynode[level]:=tree.items.add(Tree.Topitem,cTreeRootTxt);
mynode[level].ImageIndex:=1;
with treeDB do
begin
try
if not Active then open;
first;
while not Eof do
begin
curID:=trim(FieldByName('dq_dqbh').AsString);
nodeTxt:=trim(FieldByName('dq_dqmc').AsString);
level:=GetNodeLevel(cTreeCodeFormat,curID);
if level>0 then
begin
mynode[level]:=tree.items.addchild(mynode[level-1],nodeTxt);
if level>4 then
mynode[level].ImageIndex:=3
else
mynode[level].ImageIndex:=1;
// mynode[level].tag:=curID;
end;
next;
end;
finally;
close;
End;
mynode[0].expand(False);
Screen.Cursor:=crDefault;
end;
end;procedure TfrmFunctionLook.UpdateTree(curNode: TTreenode; nodeTxt,
state: string);
begin
if state='add' then
begin
curNode:=tree.items.addchild(curNode,nodeTxt);
curNode.ImageIndex:=2;
end;
if state='del' then curNode.delete;
if state='edi' then curNode.Text:=nodeTxt;
end;procedure TfrmFunctionLook.treeClick(Sender: TObject);
vartemp,recID:string;
n,m:integer;
curLevel:integer;
begin
{ gNode:=tree.selected;
n:=Pos('-', gNode.text)-1 ;
recID:=Copy(gNode.text,1,n);
gNodeID:=recID; if gNode.text<>'地区名称' then
begin
if recID<>'' then
begin
//Locate table record
with treeDB do
begin
Open;
active:=true;
FindNearest([recID]);
end;
//set TField.EditMask
curLevel:= GetNodeLevel(cTreeCodeFormat,recID)+1;
end
else
curLevel:= 1;
end;
gNodelevel:=curLevel;
end;procedure TfrmFunctionLook.FormShow(Sender: TObject);
begin
treeDB.Open;
LoadTree(treeDB);
end;end.
这是我从我的程序中考出来的,已经调试通过,你可以对照看看
效率很高的一个算法
给你参考
给分吧
你要是象lmj2003(西才) 你真是太伟大了不管能不能通过都要感谢
机械工业出版社
刘艺
《Delphi 6 企业级解决方案及应用剖析》
第四部分 电子商务货物配送系统解决方案及应用剖析
第15章 代码维护模块
15.4 使用Treeview导航表数据(Page 517-519)
引用书中原话:“我们这里使用的是基于编码结构的高效算法,程序短小精悍,运行效率很高,特此向读者推荐。”
具体代码最好自己写,这样有利于提高自己实际动手能力。
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, ADODB, ComCtrls;type
TForm1 = class(TForm)
TreeView1: TTreeView;
ADOQuery1: TADOQuery;
BtnMakeTree: TButton;
procedure BtnMakeTreeClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}Const
SFirstNodeTxt ='销售地区列表';function LoadCode(crTbl:TADOQuery;tvwCode : TTreeview):Integer; var NowID,sName,ShowTxt:String; i,Level:Integer; MyNode:array[0..6]of TTreeNode;//保存各级节点,最长支持6级(重点) begin Screen.Cursor:=crHourGlass; Level:=0; With crTbl do begin try if not Active then Open; First; tvwCode.Items.Clear; //以下是增加第一项 MyNode[Level]:=tvwCode.Items.Add(tvwCode.TopItem,SFirstNodeTxt); MyNode[Level].ImageIndex:=0; MyNode[Level].SelectedIndex:=0; //以上是增加第一项 While Not Eof do begin NowID:=Trim(FieldByName('dq_dqbh').AsString); ShowTxt:=NowID+' '+FieldByName('dq_dqmc').AsString; Level:=FieldByName('dq_Level').AsInteger; //返回代码的级数 //以下是增加子项 //以下用上一级节点为父节点添加子节点 if Level>0 then//确保代码符合标准 begin MyNode[Level]:=tvwCode.Items.AddChild(MyNode[Level-1],ShowTxt); MyNode[Level].ImageIndex:=1; MyNode[Level].SelectedIndex:=2; end; //以上是增加子项 Next; end; finally Close; end; end; MyNode[0].Expand(False);//将首节点展开 Screen.Cursor:=crDefault; end;procedure TForm1.BtnMakeTreeClick(Sender: TObject);
var
ConnStr : String;
begin ConnStr :='Provider=SQLOLEDB.1;Persist Security Info=True;';
ConnStr := ConnStr + 'Password=dfasd;'; //把dfasd 换成你登陆数据库的密码
ConnStr := ConnStr + 'User ID=ApsuiteUser;'; //把ApsuiteUser换成你登陆数据库的用户名
ConnStr := ConnStr + 'Initial Catalog=DBapsuite;'; //把DBApsuite换成你的数据库名
ConnStr := ConnStr + 'Data Source=192.1.1.129'; //把192.1.1.129换成你的数据库IP
ADOQuery1.ConnectionString :=ConnStr;
ADOQuery1.SQL.Clear ;
ADOQuery1.SQL.Add('select * from sale_dq order by dq_dqbh asc ');
LoadCode(ADOQuery1,TreeView1)
end;end.