解决方案 »
- interbase不能用
- 咦~~~~~~~~~这是啥原因呢?
- 各位帮忙看看,解决一下我的问题
- delphi5.0 安装中的问题!在线等待...
- 请问:如何实现类似Delphi的代码编辑器界面
- application类的bringtofront方法
- 100分求intraweb5.1.22!!!!
- delphi 6 Ado 访问SQL数据库的一段程序原码,请高手指点一下其中的不足。
- quickreport多次预览和关闭,在关闭预览时会随机发生访问无效地址的异常。以后再预览,就报组件已注册的异常。
- installshield问题???
- if Assigned(FonMouseLeave) then FonMouseLeave(self)大家帮我理解这句代码
- 如何更换数据源(Access)
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;type
TMyData = Record
Child : string[20];
Parent : string[20];
Item : string[40];
BoAdd : Boolean;
end;
PMyData = ^TMyData;
TForm1 = class(TForm)
TreeView1: TTreeView;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
SourceList : TStringList;
TargetList : TList;
{ Public declarations }
end;
TDataThread = class(TTHread)
private
FStrList : TStringList; protected
procedure Execute();override; public
constructor Create(boSuspend : Boolean; DateList : TstringList);
Destructor Destroy();override;
end;
var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
SourceList := TStringList.Create;
TargetList := TList.Create;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
I : Integer;
begin
SourceList.Free;
for I := 0 to self.TargetList.Count -1 do
dispose(PMyData(self.TargetList.Items[I]));
TargetList.Free;
TargetList := nil;
end;constructor TDataThread.Create(boSuspend : Boolean; DateList : TstringList);
begin
Inherited Create(boSuspend);
FreeOnTerminate := True;
self.FStrList := DateList;
end;
Destructor TDATAThread.Destroy;
begin
Inherited;
end;procedure TDataThread.Execute;
var
I : integer;
str,Temp ,Descrip,StrId: string;
Data : PMyData;
begin
while not Terminated do
begin
for I := 0 to FStrList.Count -1 do
begin
//str := '';
str := trim(FStrList.Strings[I]);
Temp := trim(copy(str,1,pos(',',str)-1));
str := copy(str,pos(',',str)+1,Length(str)-pos(',',str));
StrId := copy(str,1,pos(',',str)-1);
str := copy(str,pos(',',str)+1,Length(str)-pos(',',str));
Descrip := trim(str);
new(Data);
Data.Child := Temp;
Data.Parent := StrId;
Data.Item := Descrip;
Data.BoAdd := False;
Form1.TargetList.Add(Data);
end;
Terminate;
FORM1.Edit1.Text := 'OK';
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
DataThread: TDataThread;
begin
SourceList.LoadFromFile('.\Test.txt');
DataThread := TDataThread.Create(False,SourceList);end;procedure TForm1.Button2Click(Sender: TObject);
var
I,II : Integer;
Data,Data1 : PMyData;
TempId : string;
Node : TTreeNode;
begin
TreeView1.Items.Clear;
TreeView1.Items.BeginUpdate ;
for I := 0 to TargetList.Count -1 do
begin
Data := PMyData(TargetList.Items[I]);
if not Data.BoAdd then
begin
Data.BoAdd := True;
TempId := Data.Parent;
Node := TreeView1.Items.AddChild(nil,'父类ID--'+TempId);
TreeView1.Items.AddChild(Node,Data.Child);
for II := 0 to TargetList.Count -1 do
begin
Data1 := PMyData(TargetList.Items[II]);
if (not Data1.BoAdd) and (Data1.Parent = TempId) then
begin
TreeView1.Items.AddChild(Node,Data1.Child);
Data1.BoAdd := True;
end;
end;
Application.ProcessMessages;
end;
end;
TreeView1.Items.EndUpdate;
end;
测试下了下,可以生成lz想要的了,只要修改下即可。
不过有点问题,这样好像item标题不是分类名称吧,都是ID了。
还有,顶级应该是只有9个,有二级和三级
截了个结构图:http://bbs.evolife.cn/download/demo/src.jpg
1.对应我定义的结构体,你想显示item标题只要在那替换下。
2.顶级只有9个,你开始并未说明。你仅仅说明了分类id,父级id,分类名称 。然后我刚才看了下,分为9类的话,他们之间的联系是什么?对应规则总的有个吧。
TreeView1.LoadFromFile('c:\1.txt');
2x,0,手机/数码/办公/家电
3x,0,家居/母婴/食品
4x,0,美容护肤/个人护理
5x,0,文体/汽车
6x,0,珠宝/首饰
7x,0,收藏/爱好
8x,0,游戏/话费
9x,0,生活服务/其它上面这9项就是顶级的item,其他所有的都会作为这9项的二级或三级,规则就是看数据第二项的父级id,如:16,1x,女装/女士精品
30,1x,男装
50006843,1x,女鞋
50011740,1x,流行男鞋
50010388,1x,运动鞋
1625,1x,女士内衣/男士内衣/家居服
50006842,1x,箱包皮具/热销女包/男包
50011699,1x,运动服/运动包/颈环配件
50010404,1x,服饰配件/皮带/帽子/围巾上面这些的父级id是1x,所以这几项就是顶级树“1x,0,服饰/鞋/包”的二级树。第三级的如:50013196,16,马夹
50013194,16,呢大衣
50011404,16,婚纱/旗袍/礼服
50011277,16,短外套
50010850,16,连衣裙
50008906,16,唐装/民族服装/舞台服装
50008905,16,皮草
50008904,16,皮衣
50008901,16,风衣
50008900,16,棉衣/棉服
50008899,16,羽绒服
50008898,16,卫衣/绒衫
50008897,16,西装
50000852,16,中老年服装
50000697,16,针织衫
50000671,16,T恤
162205,16,牛仔裤
162116,16,蕾丝衫/雪纺衫
162105,16,小背心/小吊带
162104,16,衬衫
162103,16,毛衣
1629,16,特大特小服装
1624,16,职业套装/学生校服/工作制服
1623,16,半身裙
1622,16,裤子上面这些的父级id是16,所以他们就是二级树“16,1x,女装/女士精品”的三级树。不知道我这样说你明白没有。
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;type
TMyData = Record
Child : string[20];
Parent : string[20];
Item : string[40];
BoAdd : Boolean;
end;
PMyData = ^TMyData;
TForm1 = class(TForm)
TreeView1: TTreeView;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
SourceList : TStringList;
TargetList : TList;
{ Public declarations }
end;
TDataThread = class(TTHread)
private
FStrList : TStringList; protected
procedure Execute();override; public
constructor Create(boSuspend : Boolean; DateList : TstringList);
Destructor Destroy();override;
end;
var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
SourceList := TStringList.Create;
TargetList := TList.Create;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
I : Integer;
begin
SourceList.Free;
for I := 0 to self.TargetList.Count -1 do
dispose(PMyData(self.TargetList.Items[I]));
TargetList.Free;
TargetList := nil;
end;constructor TDataThread.Create(boSuspend : Boolean; DateList : TstringList);
begin
Inherited Create(boSuspend);
FreeOnTerminate := True;
self.FStrList := DateList;
end;
Destructor TDATAThread.Destroy;
begin
Inherited;
end;procedure TDataThread.Execute;
var
I : integer;
str,Temp ,Descrip,StrId: string;
Data : PMyData;
begin
while not Terminated do
begin
for I := 0 to FStrList.Count -1 do
begin
//str := '';
str := trim(FStrList.Strings[I]);
Temp := trim(copy(str,1,pos(',',str)-1));
str := copy(str,pos(',',str)+1,Length(str)-pos(',',str));
StrId := copy(str,1,pos(',',str)-1);
str := copy(str,pos(',',str)+1,Length(str)-pos(',',str));
Descrip := trim(str);
new(Data);
Data.Child := Temp;
Data.Parent := StrId;
Data.Item := Descrip;
Data.BoAdd := False;
Form1.TargetList.Add(Data);
end;
Terminate;
FORM1.Edit1.Text := 'OK';
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
DataThread: TDataThread;
begin
SourceList.LoadFromFile('.\Test.txt');
DataThread := TDataThread.Create(False,SourceList);end;procedure TForm1.Button2Click(Sender: TObject);
var
I,II,III : Integer;
Data,Data1,Data2 : PMyData;
TempId ,TempId1: string;
Node,Node1 : TTreeNode;
begin
TreeView1.Items.Clear;
TreeView1.Items.BeginUpdate ;
for I := 0 to TargetList.Count -1 do
begin
// if I > 8 then Exit;
Data := PMyData(TargetList.Items[I]);
if (not Data.BoAdd) and (pos('x',data.Child)> 0) then
begin
Data.BoAdd := True;
TempId := Data.Child;
Node := TreeView1.Items.AddChild(nil,Data.Item);
TreeView1.Items.AddChild(Node,Data.Child);
for II := 9 to TargetList.Count -1 do
begin
Data1 := PMyData(TargetList.Items[II]);
if (not Data1.BoAdd) and (Data1.Parent = TempId) then
begin
Node1 := TreeView1.Items.AddChild(Node,Data1.Item);
Data1.BoAdd := True;
TempId1 := Data1.Child;
for III := 9 to TargetList.Count -1 do
begin
Data2 := PMyData(TargetList.Items[III]);
if (not Data2.BoAdd) and (TempId1 = Data2.Parent) then
begin
TreeView1.Items.AddChild(Node1,Data2.Item);
Data2.BoAdd := True;
end;
end;
end;
end;
Application.ProcessMessages;
end;
end;
TreeView1.Items.EndUpdate;
end;end.
直接用吧。可以了
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;type
TMyData = Record
Child : string[20];
Parent : string[20];
Item : string[40];
BoAdd : Boolean;
end;
PMyData = ^TMyData;
TForm1 = class(TForm)
TreeView1: TTreeView;
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
SourceList : TStringList;
TargetList : TList;
{ Public declarations }
end;
TDataThread = class(TTHread)
private
FStrList : TStringList; protected
procedure Execute();override; public
constructor Create(boSuspend : Boolean; DateList : TstringList);
Destructor Destroy();override;
end;
var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
SourceList := TStringList.Create;
TargetList := TList.Create;
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
I : Integer;
begin
SourceList.Free;
for I := 0 to self.TargetList.Count -1 do
dispose(PMyData(self.TargetList.Items[I]));
TargetList.Free;
TargetList := nil;
end;constructor TDataThread.Create(boSuspend : Boolean; DateList : TstringList);
begin
Inherited Create(boSuspend);
FreeOnTerminate := True;
self.FStrList := DateList;
end;
Destructor TDATAThread.Destroy;
begin
Inherited;
end;procedure TDataThread.Execute;
var
I : integer;
str,Temp ,Descrip,StrId: string;
Data : PMyData;
begin
while not Terminated do
begin
for I := 0 to FStrList.Count -1 do
begin
//str := '';
str := trim(FStrList.Strings[I]);
Temp := trim(copy(str,1,pos(',',str)-1));
str := copy(str,pos(',',str)+1,Length(str)-pos(',',str));
StrId := copy(str,1,pos(',',str)-1);
str := copy(str,pos(',',str)+1,Length(str)-pos(',',str));
Descrip := trim(str);
new(Data);
Data.Child := Temp;
Data.Parent := StrId;
Data.Item := Descrip;
Data.BoAdd := False;
Form1.TargetList.Add(Data);
end;
Terminate;
FORM1.Edit1.Text := 'OK';
end;
end;procedure TForm1.Button1Click(Sender: TObject);
var
DataThread: TDataThread;
begin
SourceList.LoadFromFile('.\Test.txt');
DataThread := TDataThread.Create(False,SourceList);end;procedure TForm1.Button2Click(Sender: TObject);
var
I,II,III : Integer;
Data,Data1,Data2 : PMyData;
TempId ,TempId1: string;
Node,Node1 : TTreeNode;
begin
TreeView1.Items.Clear;
TreeView1.Items.BeginUpdate ;
for I := 0 to TargetList.Count -1 do
begin
// if I > 8 then Exit;
Data := PMyData(TargetList.Items[I]);
if (not Data.BoAdd) and (pos('x',data.Child)> 0) then
begin
Data.BoAdd := True;
TempId := Data.Child;
Node := TreeView1.Items.AddChild(nil,Data.Item);
//TreeView1.Items.AddChild(Node,Data.Child); 去掉这行
for II := 9 to TargetList.Count -1 do
begin
Data1 := PMyData(TargetList.Items[II]);
if (not Data1.BoAdd) and (Data1.Parent = TempId) then
begin
Node1 := TreeView1.Items.AddChild(Node,Data1.Item);
Data1.BoAdd := True;
TempId1 := Data1.Child;
for III := 9 to TargetList.Count -1 do
begin
Data2 := PMyData(TargetList.Items[III]);
if (not Data2.BoAdd) and (TempId1 = Data2.Parent) then
begin
TreeView1.Items.AddChild(Node1,Data2.Item);
Data2.BoAdd := True;
end;
end;
end;
end;
Application.ProcessMessages;
end;
end;
TreeView1.Items.EndUpdate;
end;end.
非常感谢kfcoffe的耐心回答