我现在想把数据库中某个表的数据按不同层次在tree中显示出来,
并且点击其中的某条数据显示其详细信息。

解决方案 »

  1.   

    what do you want to do?your data structure?
      

  2.   

    //相应的指针定义
    type
        PNodeData = ^TNodeData;
        TNodeData= record
        Code: String;
        Dese: String;
    end;//TempBit:String='0102030405060708',表的第一个字缎的编码规则为'00010203045...',你可以根据具体情况适当改变本程序以适应新的编码规则
    procedure ConStructTreeFromProg(Tree:Ttreeview;DataSet:TDataSet;TempBit:String);
    Var
    OldState:Boolean;
    Code,Desc:String;
    Begin
       OldState:=DataSet.Active;
       IF DataSet.Active=False THEN  DataSet.Active:=True;
       IF Tree.Items.Count=0 Then Tree.Items.Add(nil,'信息管理系统主菜单');
       DataSet.First;
       Tree.Items.BeginUpdate;
       While not DataSet.EOF  do
          Begin
          Code:=DataSet.Fields[0].AsString;
          Desc:=DataSet.Fields[1].AsString;
          ConStructTreeFromCode(Tree,code,desc,TempBit);
          DataSet.Next;
          End;
       Tree.Items.EndUpdate;
       DataSet.Active:=OldState;
    End;//根据纪录应该放在那一层而生成相应的树节点,第一层直接添加,如果不是,则需找该纪录的父结点
    Procedure ConStructTreeFromCode(Tree:TtreeView;code,desc,TempBit:String);
    Var
    Level:integer;
    Nd:TTreeNode;
    Ptr:PNodeData;
    Begin
        New(Ptr);
        Ptr^.Code:=Code;
        Ptr^.Dese:=Desc;
        Level:=GetNodeLevel(Code,Desc,TempBit);
        IF Level=1 Then
        Begin
        Nd:=Tree.Items.GetFirstNode;
        Tree.Items.AddChildObject(Nd,desc+'('+Code+')',Ptr);
        End
        Else IF FindParentNode(Tree,Level,Code,TempBit)<>nil Then
        Begin
        Nd:=FindParentNode(Tree,Level,Code,TempBit);
        Tree.Items.AddChildObject(Nd,desc+'('+Code+')',Ptr);
        End
        Else
        Exit;
    end;//判断是纪录应该生成在那一层
    Function  GetNodeLevel(Code,Desc,TempBit:String):Integer;
    Begin
        Result:=StrtoInt(copy(TempBit,Length(Code),1));
    end;//寻找那个是相应的父结点
    Function  FindParentNode(Tree:TtreeView;Level:Integer;Code,TempBit:String):TtreeNode;
    var
    ParentCode:String;
    i:Integer;
    NodeInfo:PNodeData;
    Begin
        ParentCode:=Copy(code,1,Pos(inttostr(Level-1),TempBit));
        for  i:=1  to  Tree.Items.Count-1  do
        begin
           NodeInfo:=Tree.Items[i].Data;
           IF NodeInfo^.Code=ParentCode Then
           Begin
           Result:=Tree.items[i];
           Exit;
           End
           Else
           Continue;
        end;
        Result:=nil;
    end;//如果你要点击其中的某条数据显示其详细信息。
    procedure Tform1.Treeview1Change(Sender: TObject; Node: TTreeNode);
    var
    nodeInfo:PNodeData;
    begin
        IF  Treeview1.Selected<>nil Then
        Begin
            If Treeview1.Selected.Data<>nil then
            Begin
               with TQuery.Create(nil) do
               Begin
                 DataBaseName:='你的数据库别名';
                 Sql.Clear;
                 Sql.Add('Select 列名1,列名2 from 表名  Where  编码的列=:code);
                 Params[0].Value:=PNodeData(Data)^.Code;
                 Open;
                 Edit1.Text:=Trim(Fields[0].AsString);
                 Edit2.Text:=Trim(Fields[1].AsString);
                 .... 
                 Free;
               End;
           End;
       end;
    end;该程序并不是一成不变的,关键要注意你的数据表的负责编码的字段和TempBit变量的运用