能否将一个数据库一次性按类别读入treeview里(不论节点多少),
然后,在程序运行中,无论点击哪一个节点都可以,用一个事件来触发
查询,查询当前点击节点的相关字段。最好能提供相关代码.........
然后,在程序运行中,无论点击哪一个节点都可以,用一个事件来触发
查询,查询当前点击节点的相关字段。最好能提供相关代码.........
解决方案 »
- idsmtp和idmessage 发邮件,接收乱码 (=?GB2312?B?MDA4xOoxMNTCKQ==?=)
- 关于多线程的一个问题,在线等,十万火急!!!
- 怎样做,大哥们帮忙
- StringGrid到底可不可以和Edit一样可以输入信息然后保存到数据库表里啊?
- 请问在Delphi中一个函数里如何等待另一个事件的发生?
- 俺现在还没搞懂怎样给分!?
- 请问如何把焦点移到DBGrid的某一列上????
- 请帮忙介绍一本Delphi基础的书
- delphi程序发布时,我如何自动加入odbc system DSN ??请大侠们帮忙!!!
- 急急(为什么我想给100分,可是只能强制给25分呢,呜呜)!内存中获取远程传来的图像并保存到硬盘或转换成jpg!
- 如何使当前程序控制另一程序的文本框
- 如何记录当天电脑开机的次数?谢谢
procedure LoadTree(treeDB:TDBDataSet);//初始化树
procedure UpdateTree(curNode:TTreenode; nodeTxt:string; state:string);//更新树
function GetNodeLevel(sFormat,sCode:string):integer; //获得节点层数
function GetNodeItem(sCode:string):integer;//获得item { Public declarations }
end; const
CTreeCodeFormat='122222';
cTreeMaxLevel=6;
CTreeRootTXT='所有图书';var
tsgzlfrom: Ttsgzlfrom;
_err:integer;
curUser:string[10];
mystate:string;
gNodeId:string;
gNodelevel:integer;
gNode:TtreeNode;
mynode:array[0..6] of TTreenode;
i,Already,CurMode:integer;
currow:integer;
iniFile:string;
HasSub:String; level:Integer;
implementationuses bgNewunit;
{$R *.DFM}procedure TtsgzlFrom.LoadTree(treeDB:TDBDataSet);//初始化树
var curID,nodeTxt:string;
level,num:integer;
begin
//初始化变量
Screen.Cursor:=crHourGlass;
tree.Enabled:=True;
tree.Items.Clear;
level:=1 ;
num:=1;
tree.items.clear;
//设置根节点
mynode[level]:=Tree.items.add(Tree.Topitem,cTreeRootTxt);
mynode[level].ImageIndex:=0;
mynode[level].SelectedIndex:=1;
//遍历数据表,利用编码字段记录排序规律,依次添加树节点
with TreeDb do
begin
try
if not Active then open;
first;
while not Eof do
begin
curID:=trim(FieldByName('tsglb').AsString);
nodeTxt:=curID+'-'+trim(FieldByName('tsglbn').AsString);
level:=GetNodeLevel(cTreeCodeFormat,curID);
//这里返回代码的层次数
if level>0 then
begin
//增加下一节点时,用添加子节点的方法可轻松实现节点间的层次关系。
//注意:这里的父节点是用当前节点的上一级节点mynode[level-1]
mynode[level]:=Tree.Items.AddChild(Mynode[level-1],NodeTxt);
mynode[level].ImageIndex:=2;
mynode[level].SelectedIndex:=3;
end;
next;//下一条记录
end;
finally;
close;
End;
mynode[1].expand(False);
Screen.Cursor:=crHourGlass;
end;
end;function TtsgzlFrom.GetNodeLevel(sFormat,sCode:string):integer;
var i,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;Function TtsgzlFrom.GetNodeItem(sCode:string):integer;//获得item
var i,iCount,val:integer;
tmp:string;
begin
Result:=0;
iCount:=Tree.Items.Count;
if iCount=0 then exit;
val:=0;
for i:=1 to iCount-1 do
begin
Tmp:=Tree.Items.Item[i].Text;
Tmp:=Copy(Tmp,0,pos('-',Tmp)-1);
if Tmp=sCode then begin
val:=i;
Break;
end;
end;
result:=val;
end;procedure TtsgzlFrom.UpdateTree(curNode:TTreenode; nodeTxt:string; state:string);
Begin
if state='add' then
begin
curNode:=Tree.Items.addchild(curNode,nodeTxt);
curNode.ImageIndex:=2;
curnode.SelectedIndex:=3;
end;
if state='del' then curNode.delete;
if state='edi' then curNode.Text:=nodeTxt;
end;
太复杂,能否简单点,不知是否有相关的VCL控件。
本想给分的,但是一给分就要结贴了,没办法,等有更好的答案就每人都有分
不分level的话就很easy了,你没说清楚啊