文本文件到treeview(在线等啊!) ( 积分: 100 )

  • 主题发起人 主题发起人 gengxinxing
  • 开始时间 开始时间
G

gengxinxing

Unregistered / Unconfirmed
GUEST, unregistred user!
文本文件如下
0:画面a|1:画面aa|2:画面aaa|3:画面aaaa|2:画面aab|1:画面ab|0:画面b|1:画面ba|1:画面bb

怎样生成如下的树啊
root
|-画面a
|-画面aa
|-画面aaa
|-画面aaaa
|-画面aab
|-画面ab
|-画面b
|-画面ba
|-画面bb
 
基本的操作啊
都是些字符串处理、treeview的基本操作, 会了这些基本操作,就自然完成任务了
 
应该用到递归算法吧,怎么处理呢?能给个具体办法么?
 
这不就是很简单的树的问题吗,通常是数据放在数据库文件中,
这里是放在普通文本文件中,有区别吗?没有啊。
除了普通文本文件,一般还用xml文件,都是一样的。
delphi 已封装好许多的类,这里可以用TStringList;

astringList: tstringList;
astringList.loadfromFile('文本文件');
astringList.delimiter:= '|';
...余下操作自己搞,如真不行,不行下班后帮你搞定
 
lisongmagic:
具体有多少层不清楚啊!想的头有点大了,数据库用递归我用过,可是这个想不出来啊!
麻烦你了,帮助解决一下好么?
 
看看"广义表"可能有灵感,哈
 
已我理解的规则 是把tree完全展开
自上而下生成的子串

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;

type
RIndo = record
Level: Integer;
Text: String;
end;
PIndo = ^RIndo;

TForm1 = class(TForm)
TreeView1: TTreeView;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
Nodes: array of TTreeNode;
{ Private declarations }
procedure CreateTree(p_Ptr: PIndo);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
v_Str: String;
v_Strs: TStringList;
v_Count: Integer;
v_Ptr: PIndo;
begin
v_Str := '0:画面a|1:画面aa|2:画面aaa|3:画面aaaa|2:画面aab|1:画面ab|0:画面b|1:画面ba|1:画面bb';
v_Strs := TStringList.Create;
v_Strs.Delimiter := '|';
v_Strs.DelimitedText := v_Str;

for v_Count := 0 to v_Strs.Count - 1 do
begin
New(v_Ptr);
v_Ptr^.Level := StrToInt(Copy(v_Strs.Strings[v_Count], 1, Pos(':', v_Strs.Strings[v_Count]) - 1));
v_Ptr^.Text := Copy(v_Strs.Strings[v_Count], Pos(':', v_Strs.Strings[v_Count]) + 1, Length(v_Strs.Strings[v_Count]));
v_Strs.Objects[v_Count] := TObject(v_Ptr);
end;
SetLength(Nodes, v_Strs.Count);

for v_Count := 0 to v_Strs.Count - 1 do
begin
CreateTree(PIndo(v_Strs.Objects[v_Count]));
Dispose(PIndo(v_Strs.Objects[v_Count]));
end;

v_Strs.Free;
end;

procedure TForm1.CreateTree(p_Ptr: PIndo);
var
v_Count: Integer;
begin
for v_Count := p_Ptr.Level to Length(Nodes) - 1 do
begin
if Nodes[v_Count]<> nil then
Nodes[v_Count] := nil
else
Break;
end;
if p_Ptr.Level = 0 then
begin
Nodes[p_Ptr.Level] := TreeView1.Items.Add(nil, p_Ptr.Text);
end else
begin
Nodes[p_Ptr.Level] := TreeView1.Items.AddChild(Nodes[p_Ptr.Level - 1], p_Ptr.Text);
Nodes[p_Ptr.Level - 1].Expanded := True;
end;
end;

end.
 
已经为Avalon加上100;
我怎么就想不起来呢:(
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部