我快要被TREEVIEW弄疯了!!(200分)

  • 主题发起人 主题发起人 ilovedelphi3
  • 开始时间 开始时间
I

ilovedelphi3

Unregistered / Unconfirmed
GUEST, unregistred user!
请教大家TREEVIEW的用法:
1:MAINFORM左边是TREEVIEW,右边是RICHEDIT,怎么做才能够让用户选中
左边TREEVIEW上子节点,然后在RICHEDIT上显示这个子节点的内容?
(如:子节点是“delphi.txt”,RICHEDIT上要显示这个文本文件的内容,
就象某些资料管理器那样)

2:还有如何保存住这种形式呢?如上面子节点是“delphi.txt,下次打开程序
时候仍然是这个样子。如何把这种节点形式写进INI文件?

3:还有,TREEVIEW上现有4个根节点,如何能够知道每个根节点的号码?
(如分别有a,b,c,d四个根节点,我如何操纵第四个根节点?)
如何在程序中动态的把子节点加入到第四个根节点?
(如要把"delphi.txt"用程序加入到d这个根节点内。)
如何只用程序来选中根节点?如何只展开被选中的根节点?
如何清除一个根节点下面所有的子节点?(treeview1.items.items.deletechild不行!)

关于TREEVIEW的问题多多(好象TREEVIEW比较难用),希望有知道的朋友能够
助我一臂之力!非常感谢!!!

我快要被TREEVIEW弄疯了!!
 
问题太多了,先看看帮助吧,剩下实在麻烦的再让大家帮你一把!
 
我本来想回答,可是看到问题实在太多了。
你这样一次问这么多问题,可能回答的人会大大减少
 
1 richedit1.lnes.loadfromfile(filename)

2 use tinifile is so easy

其他的问题查ttreenode的帮助吧
 
如果用数据库,我到可以帮你一点点
 
1.TreeView的Item有Data属性,你可以用它指向PChar,然后在PChar里保存文件名,
点击在RICHEDIT中显示还要我说么?但是要计住程序结束的时候要Dispose.
2. TreeView1.SaveToFile('c:/temp/a.txt');
TreeView1.LoadFromFile('c:/temp/a.txt');
3.脑袋都看大了,不答了。
 
大家帮帮忙嘛!我实在是第一次使用TREEVIEW啊!
 
给你一些代码,看看对你有没有所帮助???
var
RootNode, TvNode1, TvNode2, TvNode3, TvNode4, TvNode5: TTreeNode;
//以上是全局变量.
......
procedure TFormReceiveMail.FormCreate(Sender: TObject);
var
delDir: String;
I: Integer;
SearchRec: TSearchRec;
aList: TStringList;
begin
Table1.DatabaseName :='JTServer';
XiuGai1Form.ServerDatabase.DatabaseName :='JTServer';
XiuGai1Form.ServerDatabase.AliasName :='JTServer';
delDir :=ExtractFilePath(Application.ExeName)+
'MailBox/废纸篓';
if Not DirectoryExists(DIR) then
ForceDirectories(DIR);

if Not (DirectoryExists(delDir)) then
ForceDirectories(delDir);

RootNode :=TreeView1.Items.Add(nil,'邮件管理'); // 根目录
RootNode.ImageIndex :=0;
RootNode.SelectedIndex :=0;
RootNode.StateIndex :=0;

TvNode1 :=TreeView1.Items.AddChild(RootNode,'帐号'); // 一级子目录.
TvNode1.ImageIndex :=1;
TvNode1.SelectedIndex :=1;
TvNode1.StateIndex :=1;

TvNode2 :=TreeView1.Items.AddChild(RootNode,'附件'); // 二级子目录.
TvNode2.ImageIndex :=2;
TvNode2.SelectedIndex :=2;
TvNode2.StateIndex :=2;

TvNode3 :=TreeView1.Items.AddChild(RootNode,'回收站'); // 三级子目录.
TvNode3.ImageIndex :=3;
TvNode3.SelectedIndex :=3;
TvNode3.StateIndex :=3;

if FormMail.ListBox1.Items.Count >0 then
for I :=0 to FormMail.ListBox1.Items.Count -1 do
begin
TvNode5 :=TreeView1.Items.AddChild(TvNode1,FormMail.ListBox1.Items);
TvNode5.ImageIndex :=5;
TvNode5.SelectedIndex :=5;
TvNode5.StateIndex :=5;
end;
try
FindFirst(DIR+'/'+FormatDateTime('YYYY-MM-DD',Now)+'/*.*',faAnyFile,SearchRec);
if (Pos('.',SearchRec.Name)<>1) then
aList.Add(SearchRec.Name);
while FindNext(SearchRec)=0 do
begin
if (Pos('.',SearchRec.Name)<>1) then
aList.Add(SearchRec.Name);
end;
if (aList.Count >0)and(aList.Text <>'') then
begin
for I :=0 to aList.Count -1 do
begin
if Trim(aList.Strings) ='' then Continue;
TvNode4 :=TreeView1.Items.AddChild(TvNode2,aList.Strings);
TvNode4.ImageIndex :=4;
TvNode4.SelectedIndex :=4;
TvNode4.StateIndex :=4;
end;
end;

aList.Clear ;

FindFirst(delDir+'/*.*',faAnyFile,SearchRec);
if (Pos('.',SearchRec.Name)<>1) then
aList.Add(SearchRec.Name);
while FindNext(SearchRec)=0 do
begin
if (Pos('.',SearchRec.Name)<>1) then
aList.Add(SearchRec.Name);
end;
if (aList.Count >0)and(aList.Text <>'') then
begin
for I :=0 to aList.Count -1 do
begin
if Trim(aList.Strings) ='' then Continue;

TvNode5 :=TreeView1.Items.AddChild(TvNode3,aList.Strings);
TvNode5.ImageIndex :=4;
TvNode5.SelectedIndex :=4;
TvNode5.StateIndex :=4;
end;
end;

finally
FindClose(SearchRec);
aList.Free;
end;

end;
// 以上仅供参考

 
1.很简单,自己想。
2。自己定义一个。INI文件:你这个TreeView结构很简单,只有两层。可以含这样一个段:
[status]
a=open
b=close
c=open
d=open 表示结点处于展开。
明白了吧?
3。也很简单。最后一句话你可以遍历这个结点下的所有支结点,然后删除,再删除这个D结点。
 
我几乎写任何一个程序都离不开TreeView. 不过初学者掌握进来确实有些困难.
看看我写的离线浏览器的原代码.
1.用TreeNode的Data 属性是肯定的不过我的经验是让它指向一个类实例.这样
你写的代码最少.
2.用树型数据.如:
[node 1] ;第一个根节点
parent=0 ;无父节点
text=Delphi 1 ;节点的标题
file=delphi1.txt ;节点对应的文章
[node 2]
parent=0
text-Delphi 2
file=delphi2.txt
[node 3]
...
[node 4]
parent=3 ;父节点为节点3
text=Delphi 5
file=
3.虽然通过查询TreeNode的子节点可以找着任何一个节点但我还是建议自己来管理,
很容易找到,既快又不乱.比例建立一个类在这个类中有线型管理节点的机制直接
根据ID 号找节点.
 
给你一个源代码,我做的,单击二级结点时,在treeview中动态添加三级结点,然后把选中的结点
内容在edit中显示 并在单击父结点时展开子结点:

unit untsd;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Db, DBTables, ComCtrls, StdCtrls, ExtCtrls;

type
Tfrmsd = class(TForm)
Query1: TQuery;
GroupBox1: TGroupBox;
TreeView1: TTreeView;
edtsd: TEdit;
btnok: TButton;
Bevel1: TBevel;
procedure FormCreate(Sender: TObject);
procedure TreeView1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btnokClick(Sender: TObject);
procedure TreeView1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;

var
frmsd: Tfrmsd;

implementation

uses getin;

{$R *.DFM}

procedure Tfrmsd.FormCreate(Sender: TObject);
var treenode:ttreenode;
begin
treeview1.items.clear;
treenode:=treeview1.items.add(nil,'各行政区划一览表');
query1.Close ;
query1.sql.Clear;
query1.sql.add('select dvs,cod from admd where cod like ''__0000'' order by dvs');
query1.open;
with TreeView1.Items do
begin
while not query1.eof do
begin
addchild(treenode,query1.fieldbyname('dvs').asstring);
query1.next;
end;
end;
end;

procedure Tfrmsd.TreeView1Click(Sender: TObject);
var selnode,parentnode:ttreenode;
begin
selnode:=treeview1.selected;
parentnode:=treeview1.selected.Parent ;
if not treeview1.selected.expanded then
begin
//若为根结点
if parentnode=nil then exit;
//若为二级结点且
if parentnode.parent=nil then
begin
if (not selnode.haschildren) then // 此时还没有添加三级结点
begin
query1.close;
query1.sql.clear;
query1.SQL.add('select * from admd where dvs like :pdvs order by dvs');
query1.parambyname('pdvs').asstring:=''+treeview1.selected.text+'%'+'';
query1.open;
query1.next; //从第2个记录开始写,因为查找出的第一个记录为xx省
while not query1.eof do
begin
treeview1.items.addchild(selnode,query1.fieldbyname('dvs').asstring);
query1.next;
end;
edtsd.text:=selnode.text;
selnode.Expand (true);
end
else // 此时已经添加三级结点
edtsd.text:=selnode.text;
end
else
if (not selnode.haschildren) then edtsd.text:=selnode.text //若为三级结点
end
else
if parentnode<>nil then edtsd.text:=selnode.text;
end;

procedure Tfrmsd.FormClose(Sender: TObject; var Action: TCloseAction);
begin
edtsd.Text :='';
treeview1.FullCollapse;
end;

procedure Tfrmsd.btnokClick(Sender: TObject);
begin
if edtsd.Text <>'' then regist.edtsd.Text :=edtsd.Text;
close;
end;

procedure Tfrmsd.TreeView1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then edtsd.text:=treeview1.selected.text;
end;

end.
 
让我们一个一个来回答:
第一个:取出节点的text属性值,赋给Richedit的Lines.text即可;
例如: self.RichEdit1.Lines.text:= self.Treeview1.selected.text;
第二个:TtreeView控件有函数保存和载入树的结构到文件
例如:self.Treeview1.SaveToFile('文件名');//保存结构
self.TreeView1.LoadFromFile('文件名');//载入结构
第三个:TreeView的每个节点都有ItemID(句柄),AbsoluteIndex(相对于树头节点的索引位置),
Index(在当前层的位置),Level(本节点的层数)通过访问这些可以知道其位置;
例如:self.TtreeView1.selected.ItemID;//返回句柄
self.TreeView1.selected.Level;//返回层数
self.TreeView1.Items.count//返回所有节点的个数;
**寻找某一个节点的话,就只有写一个循环来遍历整个树,直到找到符合条件的节点为止,
关于查找节点的代码我也在想,先参考上面同志们的回答吧;

??**为某个节点加上子节点,例如:
var NewNode:TTreeNode;
begin
NewNode:=self.Treeview1.Items.addChild(self.Treeview1.Items[3],'新的字节点');
//为self.Treeview1.Items[3]加上一个字节点,标签是'新的字节点',
//还有其他的ADD方法,可以查找Delphi帮助
//然后可以给刚加上去的子节点赋值;
NewNode.ImageIndex:=n;
NewNode.SelectedIndex:=M;
NewNode.Data:=X;//注意X是一个指针类型;关于这方面的帮助
//可以找一下TTreeNode.Data 属性例子
end;
??**想选中某个节点:self.TreeView1.Items[n].selected:=true;//这样就选中了
??**展开某节点就容易了:self.TreeView1.Items[n].Expand;//展开啦!
//想合上就用Collapse(Recurse: Boolean)函数,
总之呢,去查一下TtreeNode的帮助吧!
??**清除某节点下的所有子节点,用DeleteChildren是没错的,例如:
self.Treeview1.Items[n].DeleteChildren;//OK,下面都没了!
******************************
哎,好累呀,写了这么多,更多的信息去看帮助吧:
查找 TtreeView,TtreeNodes,TtreeNode的相关内容可以啦!
************************
 
用infopower abc for delphi
 
1.RichEdit1.Lines.LoadFromFile
2.TreeView1.SaveToFile
3.TreeView1.Items.AddChild(TreeView1.Items[3],'abc');
 
1、可以建立一个 TStringList ,同 TreeView 的 Items 一一对应,StringList 里面存放
文件名字,二者通过 TStringList.Items[Index] 和 TTreeNode.AbsoluteIndex 对应。
剩下的知道怎么办了吧!
2、TStringList 可以 SaveToFile ,也不用写 INI 了。
3、找到第一个根节点,然后循环 GetNextSibling ...

本来看你只 Love Delphi 3 ,不想帮你的,看在大富翁的份上... :-P
 
分不少,进来一看问题更多,幸好已有不少答案了,走了
 
这里就是要比CSXX好!感谢大家帮助!

另外说声,我注册这个帐户号码时候还在用D3,不是我喜欢用D3,
但我现在还在用D3,因为我的机器实在.....P100/16M/1G disk,您看不用D3,还能用什么?
 
1、其他一些空间的ttreeview可以存个字符串,这样容易多了
2、用ini很容易,不会的话用ahm里的trestoredata?好象是这个
3、帮助里都有,看不懂英文,就去买书叫delphi类参考和高级类参考,情话出的,两本
 
这样吧,我回去给你写一个关于Treeview使用的例子程序,明天给你,
只是不知道Delphi5写的Delphi3能不能编译??
明天见!
 
接受答案了.
 
后退
顶部