有点麻烦,给我写 Email 吧
[email protected]

解决方案 »

  1.   

    1 编程分离出数据
      使用动态数组,首先分离出每行\(如果没有\ 就 取全部) 前的数据,然后下面的层次依次类推
      其实这个问题,就是个动态多纬数组的建立问题,不过每新建一个,都要到前面判断,以便决 定是否合并或者填充新的纬数值  如果像你的例子,层次最多为 4,可 这样定义
        ab:array of array of array of array of string;
        ab[0,0,0,0]:='媒体';  //层次一
        ab[1,0,0,0]:='电子游戏'; //层次一
        ab[1,1,0,0]:='制作公司'; //层次二
        ab[1,1,1,0]:='Internet Explorer '; //层次三
        ab[1,1,1,1]:='媒体'; //层次四
        ab[1,2,0,0]:='帝国时代'
      
    2 将数据填充到 treeview
      

  2.   

    你可以这样建库:Id   Name  Parent_Id
                   1     XXX     (NULL)
                   2     YYY     (NULL)
                   3     WWW      2
                   4     UUU      3
                    …………  ………
    然后以下的程序我已经在"?关于动态生成TREEVIEW的问题!"给出了.
      

  3.   

    这个问题可以使用递归解决,当然分离是必要的。
    前提是数据是规则排列的——一个分枝结束了才是另一个分枝!
    递归函数传递两个参数,父节点 Handle,和子节点数据。
    暂时先说这些,等有空了我再慢慢编程序。
      

  4.   

    很简单:
    源数据:
    媒体
    电子游戏
    电子游戏\制作公司
    电子游戏\制作公司\Internet Explorer 
    电子游戏\制作公司\Internet Explorer\媒体
    电子游戏\帝国时代将上面的数据改成:
    媒体
    电子游戏
    ^t制作公司
    ^t^tInternet Explorer 
    ^t^t^t媒体
    ^t帝国时代就是说,每个"\"变成一个^t (^t就是制表符,ASCII:09H),并只保留最后一个"\"分隔开的项(看上面的示意应会明白吧).,然后存入一个Steam或文件中,并用TTreeview的Loadfromstrea或loadfromfile即可搞定。
      

  5.   

    楼上的:不能够使用该方法,因为我不想将资料存入一个Text文件,而是想通过程序直接生成treeView树,(不能够使用TTreeview的Loadfromstrea或loadfromfile)。 你还有好的方法吗?
      

  6.   

    同意Muf(沐枫)。你可以用TStringStream来解决,不需要写入文件呀。另将 ^t 换为空格,效果一样。
      

  7.   

    具体问题具体分析,这样的问题不用递归。
    to lbsoft
    不知下面的例子合不合你意。unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls;type
      TForm1 = class(TForm)
        TreeView1: TTreeView;
        Memo1: TMemo;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure DelimiterStrs(const Delimiters, S: string;RetS:TStrings);
    var
      dess:string;
      po:integer;
      dellen,nowlen:integer;
    begin
      RetS.Clear;  dess := s;  po := pos(Delimiters,dess);
      dellen := length(Delimiters);
      nowlen := length(dess);  while (po > 0) do
      begin
        RetS.Add(trim(copy(dess,1,po-1)));
        nowlen := nowlen - (po + dellen - 1);
        dess := copy(dess,po+dellen,nowlen);
        po := pos(Delimiters,dess);
      end;  if dess <> '' then RetS.Add(dess);
      
    end;procedure StringsToTreeView(ts:TStrings;TV:TTreeView);
    var
      i:integer;
      PaNode, Node:TTreeNode;
      HasIns:Boolean;
      txt:string;
    begin
      PaNode := nil;
      Node := TV.Items.GetFirstNode;  for i := 0 to ts.Count - 1 do
      begin
        txt := ts[i];
        HasIns := false;    while assigned(Node) do
        begin
          if (CompareText(Node.Text,txt) = 0) then
          begin
            HasIns := true;
            PaNode := Node;
            Node := Node.getFirstChild;
            break;
          end;
          
          Node := Node.GetNextSibling;
        end;    if not HasIns then
        begin
          PaNode := TV.Items.AddChild(PaNode,Txt);
          Node := nil;
        end;
        
      end;
      
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      i:integer;
      ls:string;
      ts:TStrings;
    begin
      ts := TStringList.Create;
      TreeView1.Items.BeginUpdate;
      try
        TreeView1.Items.Clear;
        for i := 0 to Memo1.Lines.Count - 1 do
        begin
          ls := trim(Memo1.Lines[i]);
          if ls <> '' then
          begin
            DelimiterStrs('\',ls,ts);
            StringsToTreeView(ts,TreeView1);
          end;
        end;  finally
        TreeView1.Items.EndUpdate;
        ts.Free;
      end;
    end;end.
      

  8.   

    guig(胖胖):  谢谢你,正是我想要的,给你加分了!
      

  9.   

    是啊,我同意楼上的
    用TStringStream很简单就解决了