加载TtreeView树型控件有几种方式其各方法的好处是什么? 头大不会用树型控件请指教! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://community.csdn.net/Expert/topicview.asp?id=3095462 可用递归算法procedure CreateTree(AId: integer; FatherNode: TTreeNode);var QryTmp: TADOQuery; myNode: TTreeNode;begin QryTmp := TADOQuery.Create(self); QryTmp.Connection:=alldata.AdoConn; QryTmp.SQL.Add('select * from t_Item'); QryTmp.SQL.Add('where FParentID=' + inttostr(AId)); QryTmp.Open; while not QryTmp.Eof do begin myNode := CategoryTree.Items.AddChild(FatherNode,QryTmp.fieldbyname('FName').AsString); myNode.StateIndex:=QryTmp.FieldByName('FitemId').AsInteger; CreateTree(QryTmp.fieldbyname('FitemId').AsInteger, myNode); //递归调用过程 QryTmp.Next; end; QryTmp.Free;end;或者用第三方空间DBTree 能否帮忙顶一下?http://community.csdn.net/Expert/topic/3095/3095447.xml?temp=.3237879 帮你顶一下吧!现在有好多DBTreeview的,连接非常方便,可以去下载的帮你贴篇文章,你可以参考一. 如何初始化一个TreeView? 弄一个窗口,放上一个TreeView和一个Button,分别取名为TV1和Btn1。如果需要 在每个节点前有个图,请在窗口上放上一个ImageList,取名为ImageList1,双击 它,加入六个图标。还要记得记得将TV1的Images属性改为ImageList1噢。双击按 钮Btn1,在里面填入以下代码,然后按F9运行,点击Btn1就可以看到效果了。 procedure TForm1.Btn1Click(Sender: TObject); Const MyDocDir = 'C:\My Documents'; PersonDir = '3hSoft'; Var Var I : Word; SubNodeName : array [1..5] of ShortString; RootNode, SubNode : TTreeNode; P : PString; begin SubNodeName[1] := '便笺'; SubNodeName[2] := '发件箱'; SubNodeName[3] := '联系人'; SubNodeName[4] := '任务'; SubNodeName[5] := '日记'; TV1.Items.Clear; TV1.Items.BeginUpdate; New(P); P^ := MyDocDir + '\' + PersonDir; RootNode := TV1.Items.AddObject(Nil, '个人文件夹', P); // 此 Node 的图标已对 Images 属性中取第 0 个了。 For I := 1 to 5 do begin New(P); P^ := MyDocDir + '\' + PersonDir + '\' + SubNodeName[I]; SubNode := TV1.Items.AddChildObject(RootNode, SubNodeName[I], P) ; ; // 如果不想使用图标的话请删除以下两行 SubNode.ImageIndex := I; SubNode.SelectedIndex := I; end; TV1.Items.EndUpdate; end; 二.在TreeView中如何设置选中结点 var i:integer; {i为设置的选中结点的索引值} begin if i>treeview1.items.count then treeview1.items[i].selected:=true; 或 treeview1.selected:=treeview1.items[i]; 三。设置TreeView结点的图形 1. 设置TreeView的images属性为已存在的images对象 treeview1.images:=imagelist1; 2. 在加入结点后执行: var anode:TTreeNode; begein anode:=Treeview1.add(nil,'item1'); anode.imageindex:=0; {结点未选中时显示的图标} anode.selectedindex:=1; {结点选中时显示的图标} end 3. 如果结点图形在改变后未发生变化,可以执行: treeview1.refresh; 四。如何批量处理TreeView结点 使用TreeView的items属性的BeginUpdate和EndUpdate方法,例: TreeView1.items.BeginUpdate; for i:=0 to TreeView1.items.count-1 do begin //将每个结点的文字改成为小写字母 TreeView1.items[i].text:=lowercase(TreeView1.items[i].text); end; TreeView1.items.EndUpdate; 五。实现TreeView结点拖拽的实例 下面的程序片段演示了如何实现拖拽treeview构件结点的例子 {鼠标按下时执行的语句} procedure TForm1.Treeview1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin {判断左键按下并且鼠标点在一个结点上开始实现拖拽} if ( Button = mbLeft ) and ( htOnItem in Treeview1.GetHitTestInfoAt( X, Y ) ) then begin Treeview1.BeginDrag( False ); end; end; {鼠标拖动执行语句} procedure TForm1.Treeview1DragOver( Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); var Node : TTreeNode; begin if Source = Treeview1 then begin Node := Treeview1.GetNodeAt( X, Y ); {取当前结点} if Node <> nil then {当前结点不为空才能实现拖拽,accept:=true} Accept := true; end; end; {鼠标释放时执行的语句} procedure TForm1.Treeview1DragDrop( Sender, Source: TObject; X, Y : Integer ); var TempNode : TTreeNode; AttachMode : TNodeAttachMode; begin if Treeview1.Selected = nil then Exit; AttachMode := naAddChild; {设置结点移动模式,设移动结点为子结点} { 注意在这里存在一个bug,当移动结点时,如果目标结点没有子结点,} { 则加入的新的子结点会失败,所以先在当前目标结点的下面 } { 加入一个临时子结点,移动完毕后,再将临时结点删除 } Treeview1.Items.BeginUpdate; try TempNode := Treeview1.Items.AddChild( Treeview1.DropTarget, 'Temp' ); try { 移动选中的结点到目标结点 } Treeview1.Selected.MoveTo( Treeview1.DropTarget, AttachMode ); finally TempNode.Free; { 不要忘了释放临时结点 } end; finally Treeview1.Items.EndUpdate; end; end; 我觉得可以不用这么复杂吧,我最近也在学用treeview。最好从顶部开始一层一层的建立树,每新增加一节点先寻找父节点,然后再添加。我试验了一下,还挺好使。 file of 起一个什么样的作用 怎样才能是Panel组件看起来象凹下去的? 有关三层结构的问题 请教dll 散分啦!谁有免费的mapobject2.0或以上的软件,下载的网址也可以!高分相送!上者有分! pankun (剑神一笑)来拿分!!!! 如何一个一个字节的读取widestring 字符串的asc 码值 famu (伐木),我送分给你,把你的软件改了改 在客户服务器系统中如何向服务器中请求查询数据? 请教如何将一个十进制数格式化为十六进制数。 如何用程序修改本机名称? 如何知道windows是否在锁定模式??
procedure CreateTree(AId: integer; FatherNode: TTreeNode);
var
QryTmp: TADOQuery;
myNode: TTreeNode;
begin
QryTmp := TADOQuery.Create(self);
QryTmp.Connection:=alldata.AdoConn;
QryTmp.SQL.Add('select * from t_Item');
QryTmp.SQL.Add('where FParentID=' + inttostr(AId));
QryTmp.Open;
while not QryTmp.Eof do
begin
myNode := CategoryTree.Items.AddChild(FatherNode,QryTmp.fieldbyname('FName').AsString);
myNode.StateIndex:=QryTmp.FieldByName('FitemId').AsInteger;
CreateTree(QryTmp.fieldbyname('FitemId').AsInteger, myNode); //递归调用过程
QryTmp.Next;
end;
QryTmp.Free;
end;
或者用第三方空间DBTree
http://community.csdn.net/Expert/topic/3095/3095447.xml?temp=.3237879
现在有好多DBTreeview的,连接非常方便,可以去下载的
帮你贴篇文章,你可以参考
一. 如何初始化一个TreeView?
弄一个窗口,放上一个TreeView和一个Button,分别取名为TV1和Btn1。如果需要
在每个节点前有个图,请在窗口上放上一个ImageList,取名为ImageList1,双击
它,加入六个图标。还要记得记得将TV1的Images属性改为ImageList1噢。双击按
钮Btn1,在里面填入以下代码,然后按F9运行,点击Btn1就可以看到效果了。
procedure TForm1.Btn1Click(Sender: TObject);
Const
MyDocDir = 'C:\My Documents';
PersonDir = '3hSoft';
Var
Var
I : Word;
SubNodeName : array [1..5] of ShortString;
RootNode, SubNode : TTreeNode;
P : PString;
begin
SubNodeName[1] := '便笺';
SubNodeName[2] := '发件箱';
SubNodeName[3] := '联系人';
SubNodeName[4] := '任务';
SubNodeName[5] := '日记';
TV1.Items.Clear;
TV1.Items.BeginUpdate;
New(P);
P^ := MyDocDir + '\' + PersonDir;
RootNode := TV1.Items.AddObject(Nil, '个人文件夹', P);
// 此 Node 的图标已对 Images 属性中取第 0 个了。
For I := 1 to 5 do
begin
New(P);
P^ := MyDocDir + '\' + PersonDir + '\' + SubNodeName[I];
SubNode := TV1.Items.AddChildObject(RootNode, SubNodeName[I], P)
;
;
// 如果不想使用图标的话请删除以下两行
SubNode.ImageIndex := I;
SubNode.SelectedIndex := I;
end;
TV1.Items.EndUpdate;
end;
二.在TreeView中如何设置选中结点
var
i:integer; {i为设置的选中结点的索引值}
begin
if i>treeview1.items.count then
treeview1.items[i].selected:=true;
或
treeview1.selected:=treeview1.items[i];
三。设置TreeView结点的图形
1. 设置TreeView的images属性为已存在的images对象
treeview1.images:=imagelist1;
2. 在加入结点后执行:
var
anode:TTreeNode;
begein
anode:=Treeview1.add(nil,'item1');
anode.imageindex:=0; {结点未选中时显示的图标}
anode.selectedindex:=1; {结点选中时显示的图标}
end
3. 如果结点图形在改变后未发生变化,可以执行:
treeview1.refresh;
四。如何批量处理TreeView结点
使用TreeView的items属性的BeginUpdate和EndUpdate方法,例:
TreeView1.items.BeginUpdate;
for i:=0 to TreeView1.items.count-1 do
begin
//将每个结点的文字改成为小写字母
TreeView1.items[i].text:=lowercase(TreeView1.items[i].text);
end;
TreeView1.items.EndUpdate; 五。实现TreeView结点拖拽的实例
下面的程序片段演示了如何实现拖拽treeview构件结点的例子
{鼠标按下时执行的语句}
procedure TForm1.Treeview1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
{判断左键按下并且鼠标点在一个结点上开始实现拖拽}
if ( Button = mbLeft ) and
( htOnItem in Treeview1.GetHitTestInfoAt( X, Y ) ) then
begin
Treeview1.BeginDrag( False );
end;
end;
{鼠标拖动执行语句}
procedure TForm1.Treeview1DragOver( Sender, Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean);
var
Node : TTreeNode;
begin
if Source = Treeview1 then
begin
Node := Treeview1.GetNodeAt( X, Y ); {取当前结点}
if Node <> nil then {当前结点不为空才能实现拖拽,accept:=true}
Accept := true;
end;
end;
{鼠标释放时执行的语句}
procedure TForm1.Treeview1DragDrop( Sender, Source: TObject;
X, Y : Integer );
var
TempNode : TTreeNode;
AttachMode : TNodeAttachMode;
begin
if Treeview1.Selected = nil then
Exit;
AttachMode := naAddChild; {设置结点移动模式,设移动结点为子结点}
{ 注意在这里存在一个bug,当移动结点时,如果目标结点没有子结点,}
{ 则加入的新的子结点会失败,所以先在当前目标结点的下面 }
{ 加入一个临时子结点,移动完毕后,再将临时结点删除 }
Treeview1.Items.BeginUpdate;
try
TempNode := Treeview1.Items.AddChild( Treeview1.DropTarget,
'Temp' );
try
{ 移动选中的结点到目标结点 }
Treeview1.Selected.MoveTo( Treeview1.DropTarget, AttachMode );
finally
TempNode.Free; { 不要忘了释放临时结点 }
end;
finally
Treeview1.Items.EndUpdate;
end;
end;