本帖最后由 macrolen 于 2010-01-19 21:57:01 编辑

解决方案 »

  1.   

    http://hi.baidu.com/xiaohui_82/blog/item/b360e1bf74498d0b18d81f65.html
      

  2.   


    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想要的了,只要修改下即可。
      

  3.   

    非常感谢楼上的朋友的耐心解答
    不过有点问题,这样好像item标题不是分类名称吧,都是ID了。
    还有,顶级应该是只有9个,有二级和三级
    截了个结构图:http://bbs.evolife.cn/download/demo/src.jpg
      

  4.   


    1.对应我定义的结构体,你想显示item标题只要在那替换下。
    2.顶级只有9个,你开始并未说明。你仅仅说明了分类id,父级id,分类名称 。然后我刚才看了下,分为9类的话,他们之间的联系是什么?对应规则总的有个吧。
      

  5.   

      TreeView1.SaveToFile('c:\1.txt');
      TreeView1.LoadFromFile('c:\1.txt');
      

  6.   

    kfcoffe你好是这样的,父级id决定所在的父级,父级id就是上一级的分类id,如:1x,0,服饰/鞋/包
    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,女装/女士精品”的三级树。不知道我这样说你明白没有。
      

  7.   

    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,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.
    直接用吧。可以了
      

  8.   

    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,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.
      

  9.   

    好厉害,终于可以了,崇拜中...
    非常感谢kfcoffe的耐心回答