还没有解决啊!!!!!如何将treeview的内容保存到一个自定义的文件格式里,能读写且可修改节点。超急! ( 积分: 100 )

  • 主题发起人 主题发起人 media21
  • 开始时间 开始时间
M

media21

Unregistered / Unconfirmed
GUEST, unregistred user!
现在想把treeview的节点内容保存到文件里,可以[red]添加、修改、删除节点和子节点[/red]等操作,现在我说的更详细一点,谢谢诸位了!!!
每个节点的信息包括如下:
type
TMethod = Record
Name: string[20];
Condition: string[40];
Result: integer;
Expression:string[20];
end;

具体的要求是:
(1)新建文件(如aaa.txt)
(2)添加节点或子节点(用edit控件赋值给Name; Condition: Result:Expression
(3)点击每个节点时显示该节点的上述4个值。
(4)可以修改、删除节点,包括上面的4个值。
(5)打开aaa.txt时可以将数据还原到treeview内,可以增加、修改、删除节点。
谢谢!
将全部节点存到文件,读文件的时候可以读出上面的值,还可以修改。
 
现在想把treeview的节点内容保存到文件里,可以[red]添加、修改、删除节点和子节点[/red]等操作,现在我说的更详细一点,谢谢诸位了!!!
每个节点的信息包括如下:
type
TMethod = Record
Name: string[20];
Condition: string[40];
Result: integer;
Expression:string[20];
end;

具体的要求是:
(1)新建文件(如aaa.txt)
(2)添加节点或子节点(用edit控件赋值给Name; Condition: Result:Expression
(3)点击每个节点时显示该节点的上述4个值。
(4)可以修改、删除节点,包括上面的4个值。
(5)打开aaa.txt时可以将数据还原到treeview内,可以增加、修改、删除节点。
谢谢!
将全部节点存到文件,读文件的时候可以读出上面的值,还可以修改。
 
重要的是我想在添加节点的时候可以通过判断某节点属于第几层的第几个自动给出该节点的标示号,保存在预先设定好的字段上,然后读的时候可以通过这些值将其放到treeview的相应位置上。

1
11
111
112
113
12
121
122
123
13
2
21
22
23
24
.......
 
我感觉Delphi自带的Treeview的存储和读取速度算8错了(没用过其他Tree)
你要做的就是自定义一个TreeNode
TXXXTreeNode = class(TTreeNode)
...
end;
把你需要的属性添加进去
然后再继承一下TreeView
TXXXTreeView = class(TTreeView)
protected
function CreateNode: TTreeNode; override;
function CanCollapse(Node: TTreeNode): Boolean; override;
public
procedure LoadTreeFromStream(Stream: TStream); override;
procedure SaveTreeToStream(Stream: TStream);override;
end;
覆盖上面的几个函数,具体的代码照抄Delphi的实现,特殊的就是再将Node内容转成字符串的时候,将额外的属性用特点的分隔符写进去,读取的时候则想法处理就可以

这个是我的处理方法,应该不是一个很好的答案:)
 
这太容易了吧 我晕
你遍历整个TREE就行了
因为它是按照这个INDEX排序的
你检查NODE的LEVEL 看是几
是几 就空几个空格前面
加入到TSTRINGLIST
然后写入文件即可
读时从前面空格最少的根结点读起 记录每个结点出现的位置
然后从相应的位置再读下一级结点
这是个递归的过程...
 
楼上的方法也就是delphi带treeview的存储方法,只不过要将节点带的结构信息存入还是要转换一下的
 
你直接treeview1.savetofile(文件名);treeview1.loadtofile(文件名);就可把树全部存在文件里了,操作就利用它自身的方法就行。
 
jlutt-sadan,我是个菜鸟,请能给个例子吗?谢谢!
 
delphi从入门到精通有例子呀
 
你可以到我的网站上面下载一个hwkdbtree看看!
www.startor.cn
 
0
0
1
2
3
4
5
6
7
8
9
1
0
1
2
3
4
5
6
7
8
9
2
0
1
2
3
4
5
6
7
8
9
这个是我从树型控件里面保存出来的内容,我在其中一个节点上设置了Node的Data属性,就是说是有指针的,但是保存出来以后没有这个属性,在标准的TTreeVeiw中的SaveToStream只有存TTreeNode的Text,它的SaveToFile方式其实也是调用的SaveToStream,所以你可以考虑重载TCustomTreeView的SaveToStream和LoadFromStream方法

活在你自己在外部写方式在读写TreeView节点的时候设置对应的指针
 
一个简单思路,希望对你有帮助

function TForm1.LoadTreeInfoFromFile(AFileName: string): Boolean;
var
ANode, NextNode: TTreeNode;
ALevel: Integer;
CurrStr: string;
s : array[0..255] of char;
F: file;
P: pNodeInfo;
pLevel: PInteger;
I : Integer;
begin
// 严格顺序
Result := False;
if not FileExists(AFileName) then Exit;

AssignFile(F, AFileName);
Reset(F, 1);
try
TreeView1.Items.Clear;
ANode := nil;
GetMem(PLevel, sizeof(Integer));
CurrStr := '';
while not Eof(F) do begin
GetMem(P, sizeof(pNodeInfo));
BlockRead(F, pLevel^, sizeof(Integer));
BlockRead(F, s, 256);
BlockRead(F, P^, sizeof(TNodeInfo));
CurrStr := s;
ALevel := pLevel^;

if ANode = nil then
ANode := TreeView1.Items.AddChild(nil, CurrStr)
else if ANode.Level = ALevel then
ANode := TreeView1.Items.AddChild(ANode.Parent, CurrStr)
else if ANode.Level = (ALevel - 1) then
ANode := TreeView1.Items.AddChild(ANode, CurrStr)
else if ANode.Level > ALevel then begin
NextNode := ANode.Parent;
while NextNode.Level > ALevel do
NextNode := NextNode.Parent;
ANode := TreeView1.Items.AddChild(NextNode.Parent, CurrStr);
end;
end;
FreeMem(PLevel, sizeof(Integer));
finally
CloseFile(F);
end;
Result := True;
end;

function TForm1.SaveTreeInfoToFile(AFileName: string): Boolean;
var
I, j: Integer;
Node: TTreeNode;
F: file;
P : PNodeInfo;
PLevel: PInteger;
NodeText: array[0..255] of char;
begin
// 逐一设置节点,暂时假定每个节点都是有指针的情况
AssignFile(F, AFileName);
ReWrite(F, 1);
GetMem(PLevel, sizeof(Integer));
for I := 0 to TreeView1.Items.Count - 1 do begin
Node := TreeView1.Items.Item;
P := pNodeInfo(Node.Data);
FillChar(NodeText,256, #0);
for j := 0 to Length(Node.Text) - 1 do
NodeText[j] := Node.Text[j + 1];

PLevel^ := Node.Level;
BlockWrite(F, PLevel^, sizeof(Integer));
BlockWrite(F, NodeText, 256);
BlockWrite(F, P^, sizeof(TNodeInfo));
end;
FreeMem(PLevel, sizeof(Integer));
CloseFile(F);
Result := True;
end;
 
其实用treeview本身的savetofile就行

如果楼主不放心可以手动遍历树存入文件
个人推荐使用XML文件来储存数结构最简单,至于为什么。。。楼主研究一下XML文件的结构就明白了,其实就可以理解为一个树。。有父节点子节点,每个节点可以存自己的属性
 
同意hs-kill
 
TreeView1.LoadFromFile()
TreeView1.SaveToFile()
 
哎~~~~看楼主的样子还要存成文件后通过文件对数进行增删改?
给你个例子

存入XML的:
procedure TForm1.Button1Click(Sender: TObject);
begin
XMLDocument1.Active:=false;
XMLDocument1.Active:=true;
getnodechild(treeview1.Items.GetFirstNode,nil);
XMLDocument1.SaveToFile('c:/11.xml');
end;

procedure Tform1.getnodechild(node:Ttreenode;xmlnode:Ixmlnode);
var
_xmlnode:Ixmlnode;
_node:Ttreenode;
begin
_node:=node;
while _node<>nil do
begin
if xmlnode=nil then
XMLDocument1.AddChild(_node.Text)
else
_xmlnode:=xmlnode.AddChild(_node.Text);
// _xmlnode.SetAttributeNS(attrname,'',value); //储存该节点属性
getnodechild(_node.getFirstChild,_xmlnode);
_node:=_node.getNextSibling;
end;
end;

取XML到treeview:
procedure Tform1.xmltotree(node:Ttreenode;xmlnode:Ixmlnode);
var
_xmlnode:Ixmlnode;
_node:Ttreenode;
begin
_xmlnode:=xmlnode.ChildNodes.First;
while _xmlnode<>nil do
begin
_node:=treeview1.Items.AddChild(node,_xmlnode.NodeName);
xmltotree(_node,_xmlnode);
_xmlnode:=_xmlnode.NextSibling;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
XMLDocument1.Create('c:/11.xml');
treeview1.Items.Clear;
xmltotree(nil,XMLDocument1.DocumentElement);
end;


至于XML的增删改:
var
xmlnode:Ixmlnode;
begin
//增加节点
xmlnode.AddChild('nodename');
//删除节点
xmlnode.ChildNodes.Delete(1);
xmlnode.ChildNodes.Delete('nodename');
//修改节点
xmlnode.NodeName:='新节点名';
xmlnode.SetAttributeNS('属性名','','属性值');
end;


能给分了吧~~~~~~~
 
哪些都不是大问题了,我给你的例子是保存成二进制文件,主要目的是让你保存节点上的指针,想不出来指针你用其他方式怎么保存,已经写到二进制文件里面的内容你自己想怎么删除都是可以的,用XML或者ini也上可以的,就看你自己怎么保存节点上的信息,如果我没理解错的话你要保存每个节点上的内容,是吗
 
我不会用xml啊,给个例子吧 谢谢。
我的要求是通过增加节点和子节点,并将edit的内容分别给
Name: string[20];
Condition: string[40];
Result: Real;
Expression:string[20]; ,即点击每个节点时显示着三个值
将全部节点存到文件,读文件的时候可以读出上面的值,还可以修改。
 
各位高手们,我将问题重新描述了,请哥哥们帮忙了 ,谢谢!!!
 
建议保存成INI文件,每一级都有一个定位。
 

Similar threads

D
回复
0
查看
802
DelphiTeacher的专栏
D
D
回复
0
查看
747
DelphiTeacher的专栏
D
D
回复
0
查看
696
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部