数据表设计如下:code, parent_code, name
请问用delphi如何编写出一个产品的结构树,比如
      电脑
         |主机
         |   CPU
            显卡
              内存
        |显示器
              外壳
              阴极射线管
请高手帮忙,给出一段程序,不胜感激     

解决方案 »

  1.   

    treeview
    第一遍先都添加作为根节点,第二遍按照parent_code找到父节点。
    有人给出过具体代码,可我找不到了,不然可以给你链接。
      

  2.   

    給你研究研究別人寫的Code吧~~
    因為我也正在研究
    有問題我可能幫不了你..因為我也不懂
    只能給你參考的範例
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, ADODB, ComCtrls, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        TreeView1: TTreeView;
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        function ConnectIonDataBase:Boolean;
        function GetAdoQuery(sSql:String):TADOQuery;    Procedure FindLeechDom(Leechdomname: String;node: TTreeNode);
      end;var
      Form1: TForm1;implementation{$R *.dfm}function TForm1.ConnectIonDataBase: Boolean;
    begin
      //  try  connect adoConn to database
      Result := false;
      ADOConnection1.Close;
      ADOConnection1.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source='
          +ExtractFilePath( Application.ExeName) + '\test1.mdb;Persist Security Info=False';
      try
        ADOConnection1.Open;
        Result := true;
      except
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var q:TADOQuery;
      o,temp: TTreeNode;
    begin
      if ConnectIonDataBase then
      begin
        TreeView1.Items.Add(nil,'MTYPE');    q := GetAdoQuery('SELECT * FROM LEECHDOM WHERE MCODE IS NULL ');    while not q.Eof do
        begin
          temp := TreeView1.Items.AddChild( TreeView1.Items[0],q.FieldByName('MTYPE').AsString);
          FindLeechDom(q.FieldByName('MTYPE').AsString ,temp);
          q.Next;
        end;
        q.Close;
        q.Free;
      end;
    end;function TForm1.GetAdoQuery(sSql: String): TADOQuery;
    var q:TADOQuery;
    begin
      try
        q := TADOQuery.Create(nil);
        q.Connection := ADOConnection1;
        q.Close;
        q.SQL.Text := sSql;
        q.Open;
        Result := q;
      except
        on E:Exception do
          Raise e;
      end;
    end;procedure TForm1.FindLeechDom(Leechdomname: String; node: TTreeNode);
    var
      temp: TADOQuery;
      node1: TTreeNode;
    begin
      Try
        temp :=GetAdoQuery('SELECT * FROM LEECHDOM WHERE MCODE='+QuotedStr(Leechdomname));    while Not Temp.Eof do
        begin
          node1 := TreeView1.Items.AddChild(node,temp.FieldByName('MTYPE').AsString);
          FindLeechDom(temp.FieldByName('MTYPE').AsString,node1);
          temp.Next;
        end;
      Finally
        temp.Close;
        temp.Free;
      end;
    end;end.
      

  3.   

    再給你一個...
    如果你研究出來...也希望能指教我一下啊~catnode:=treeview1.items.add(nil,'所有商品');   
    with   adoquery1   do   begin   
    close;   
     sql.clear;   
     sql.add('select   longid,text   from   tree..testtree   order   by   longid');   
     open; 
     first;   
       while   not   adoquery1.eof   do   begin   
         cat1node:=treeview1.Items.AddChild(catnode,adoquery1.fieldbyname('text').value+'('+adoquery1.fieldbyname('longid').value+')');   
         //treeview1.Items.Item[0].Expanded:=true;   
         with   adoquery3   do   begin   
         close;   
         sql.Clear;   
         sql.Add('select   distinct   *   from   node   where   left(node.names,2)=:aa   order   by   names');   
         adoquery3.Parameters.ParamByName('aa').value:=copy(adoquery1.fieldbyname('longid').value,1,2);   
         open;   
         first;   
         while   not   adoquery3.Eof   do   begin   
         treeview1.Items.AddChild(cat1node,'('+adoquery3.fieldbyname('names').value+')'+adoquery3.fieldbyname('ide').value);   
         next;   
         //treeview1.Items.Item[1].Expanded:=true;   
         end;   
       end;   
     next;   
     end;   
    end;procedure   TForm1.TreeView1Click(Sender:   TObject);   
    begin   
    if   treeview1.Selected.Level=1   then   
    begin   
    adoquery1.Close;   
    adoquery1.SQL.Clear;   
    adoquery1.sql.add('select   *   from   tree..testtree   where   longid=:aa');   
    adoquery1.Parameters.ParamByName('aa').Value:=copy(treeview1.Selected.Text,4,2);   
    showmessage(copy(treeview1.Selected.Text,4,2));   
    adoquery1.open;   
    edit1.text:=adoquery1.fieldbyname('longid').value;   
    edit2.text:=adoquery1.fieldbyname('text').value;   
    //treeview1.Selected:=nil;   
    //edit1.text:=treeview1.Selected.Text;   
    end;   
      if   treeview1.Selected.Level=2   then   
      begin   
       adoquery1.Close;   
       adoquery1.SQL.Clear;   
       adoquery1.SQL.Add('select*   from   tree..node   where   names=:aa');   
       adoquery1.Parameters.ParamByName('aa').Value:=copy(treeview1.Selected.Text,2,4);   
       showmessage(copy(treeview1.Selected.Text,2,4));   
      adoquery1.Open;   
       edit1.Text:=treeview1.Selected.Parent.Text;   
       edit2.Text:='';   
       edit3.Text:=adoquery1.FieldValues['names'];   
       edit4.Text:=adoquery1.FieldValues['ide'];   
     end;   
    end;
      

  4.   

    再找一個給你http://topic.csdn.net/u/20090311/11/5b284b86-7434-412e-8c66-67f06a432d97.html