找TreeView的应用事例.UP有分
怎样实现treeview读数据库循环显示:
如:顶级地区,上级地区,地区分枝.....
还有当点某一节点时候再按添加可以鼠标焦点处加入地区.
最好有事例,我刚学delphi,现在项目太紧张了.
推荐阅读
unit sc_sbtj;
interface
uses
windows, messages, sysutils, variants, classes, graphics, controls, forms,
dialogs, comctrls, extctrls, grids, stdctrls, toolwin;
type
tshebeileibie = class(tform)
panel1: tpanel;
sbtreeview: ttreeview;
sbstringgrid1: tstringgrid;
toolbar1: ttoolbar;
toolbutton1: ttoolbutton;
toolbutton4: ttoolbutton;
toolbutton2: ttoolbutton;
toolbutton3: ttoolbutton;
toolbutton5: ttoolbutton;
toolbutton6: ttoolbutton;
procedure formcreate(sender: tobject);
procedure sbtreeviewclick(sender: tobject);
procedure toolbutton1click(sender: tobject);
procedure toolbutton2click(sender: tobject);
procedure toolbutton3click(sender: tobject);
procedure toolbutton5click(sender: tobject);
private
{ private declarations }
procedure mysbdggc(node:ttreenode;id:integer);
public
{ public declarations }
end;
var
shebeileibie: tshebeileibie;
mykzbl:boolean;
mysbarray:array of array[0..3] of variant;
mysbcount:integer;
//定义数据存储
type
pmysbpro=^tmysbpro;
tmysbpro = record
fid:integer;
ffuid:integer;
ftaizhangmoban:string;
end;
implementation
uses sc_sjmk, sc_shebeiedit;
{$r *.dfm}
//递归过程调用
procedure tshebeileibie.mysbdggc(node:ttreenode;id:integer);
var
i:integer;
myboolean:boolean;
mysbprodata: pmysbpro;
begin
for i:=0 to mysbcount-1 do
begin
if mysbarray[i,2]=id then
begin
new(mysbprodata);
pmysbpro(mysbprodata)^.fid:=mysbarray[i,0];
pmysbpro(mysbprodata)^.ffuid:=mysbarray[i,2];
pmysbpro(mysbprodata)^.ftaizhangmoban:=mysbarray[i,3];
if myboolean=false then node:=sbtreeview.items.addchildobject(node,mysbarray[i,1],mysbprodata)
else
begin
node:=sbtreeview.items.addobject(node,mysbarray[i,1],mysbprodata);
myboolean:=false;
end;
mysbdggc(node,mysbarray[i,0]);
myboolean:=true;
end;
end;
end;
//init shebeileibie
procedure tshebeileibie.formcreate(sender: tobject);
var
i:integer;
begin
with sjmk do
begin
cx1.close;
cx1.sql.clear;
cx1.sql.add(select id, leixingname, fuid, taizhangmoban from sb_leixing);
cx1.open;
mysbcount:=ds1.dataset.recordcount;
setlength(mysbarray,mysbcount);
for i:=0 to mysbcount-1 do
begin
mysbarray[i,0]:= ds1.dataset.fields[0].asinteger;
mysbarray[i,1]:= ds1.dataset.fields[1].asstring;
mysbarray[i,2]:= ds1.dataset.fields[2].asinteger;
mysbarray[i,3]:= ds1.dataset.fields[3].asstring;
ds1.dataset.next;
end;
end;
sbtreeview.items.clear;
mysbdggc(nil,0);
sbstringgrid1.cells[0,0]:=设备编号;
sbstringgrid1.cells[1,0]:=设备类别;
sbstringgrid1.cells[2,0]:=上级编号;
sbstringgrid1.cells[3,0]:=台帐路径;
end;
// show shebei
procedure tshebeileibie.sbtreeviewclick(sender: tobject);
begin
if (sbtreeview.items.count<1) or (sbtreeview.selected=nil) then exit;
sbstringgrid1.rows[1].clear;
sbstringgrid1.cells[0,1]:=inttostr(pmysbpro(sbtreeview.selected.data)^.fid);
sbstringgrid1.cells[1,1]:=sbtreeview.selected.text;
sbstringgrid1.cells[2,1]:=inttostr(pmysbpro(sbtreeview.selected.data)^.ffuid);
sbstringgrid1.cells[3,1]:=pmysbpro(sbtreeview.selected.data)^.ftaizhangmoban;
end;
//add shebei
procedure tshebeileibie.toolbutton1click(sender: tobject);
begin
if ((sender as ttoolbutton).name=toolbutton6) and (sbtreeview.items.count<1) and (sbtreeview.selected=nil) then exit;
shebeiedit:=tshebeiedit.create(self);
shebeiedit.caption:=设备类别添加;
with sjmk do
begin
cx1.close;
cx1.sql.clear;
cx1.sql.add(select max(id) as id from sb_leixing);
cx1.open;
shebeiedit.sbbh.text:=inttostr(ds1.dataset.fields[0].asinteger+1);
if (sender as ttoolbutton).name=toolbutton1 then //add the same node
begin
mykzbl:=true;
if (sbtreeview.items.count>1) and (sbtreeview.selected<>nil) and (sbtreeview.selected.parent<>nil) then
//不是选择顶级节点
begin
shebeiedit.sjsbbh.text:=inttostr(pmysbpro(sbtreeview.selected.data)^.ffuid);
shebeiedit.sjbh.text:=sbtreeview.selected.parent.text;
end
else//没有数据或者选择顶级节点
begin
shebeiedit.sjsbbh.text:=0;
shebeiedit.sjbh.text:=;
end;
end
else//add the childen node
begin
mykzbl:=false;
shebeiedit.sjsbbh.text:=inttostr(pmysbpro(sbtreeview.selected.data)^.fid);
shebeiedit.sjbh.text:=sbtreeview.selected.text;
end;
end;
try
shebeiedit.showmodal;
finally
shebeiedit.free;
end;
end;
//edit shebei
procedure tshebeileibie.toolbutton2click(sender: tobject);
begin
if sbtreeview.selected=nil then exit;
shebeiedit:=tshebeiedit.create(self);
shebeiedit.caption:=设备类别编辑;
shebeiedit.sbbh.text:=inttostr(pmysbpro(sbtreeview.selected.data)^.fid);
if sbtreeview.selected.parent=nil then //设置顶级节点
begin
shebeiedit.sjbh.text:=;
shebeiedit.sjsbbh.text:=0;
end
else//不是顶级节点
begin
shebeiedit.sjbh.text:=sbtreeview.selected.parent.text;
shebeiedit.sjsbbh.text:=inttostr(pmysbpro(sbtreeview.selected.data)^.ffuid);
end;
shebeiedit.sbname.text:=sbtreeview.selected.text;
shebeiedit.tzlj.text:=pmysbpro(sbtreeview.selected.data)^.ftaizhangmoban;
shebeiedit.oldfilename.text:=shebeiedit.tzlj.text;
try
shebeiedit.showmodal;
finally
shebeiedit.free;
end;
end;
//delete shebei
procedure tshebeileibie.toolbutton3click(sender: tobject);
begin
if sbtreeview.selected=nil then exit;
if sbtreeview.selected.haschildren=true then
begin
showmessage(设备类型下面还有数据,不能删除!);
exit;
end;
if application.messagebox(你确实要删除这个设备吗?,删除窗口,mb_yesno)=idno then exit;
with sjmk do
begin
cx1.close;
cx1.sql.clear;
cx1.sql.add(delete from sb_leixing where (id=+inttostr(pmysbpro(sbtreeview.selected.data)^.fid)+));
try
cx1.execsql;
except
showmessage(删除出错!可能下面还有设备!);
exit;
end;
sbtreeview.deselect(sbtreeview.selected);
sbstringgrid1.rowcount:=2;
sbstringgrid1.rows[1].clear;
dispose(sbtreeview.selected.data); //free the selected node data
sbtreeview.items.delete(sbtreeview.selected);
end;
end;
procedure tshebeileibie.toolbutton5click(sender: tobject);
var
i:integer;
begin
for i:=0 to sbtreeview.items.count-1 do//free pointer
dispose(sbtreeview.items[i].data);
close;
end;
end.


讨论区