我在树型控件中显示各种类别。如何设计类中有类的数据表,使得点击一个类,显示子类。

解决方案 »

  1.   

    http://community.csdn.net/Expert/topic/5423/5423637.xml?temp=.6480219
      

  2.   

    1.用FcTreeView生成,方便
    2.用TreeView生成,还要在前面生成结构体!
      

  3.   

    以下程序是当点击某一结点时,则调用该结点的DLL文件
    1.
    数据库结构
    NODE_ID    PARENT_ID  DllName  ChnNodeTitle
    2.程序
    因为FcTreeView中为每个结点集成了2个属性,StringData与StringData2,这样使得我们不再需要用声明结构体与结构体指针,从而挂到每个结点上。以下是一个事例!
    第一步,首先构造一棵树干
    var
      sNode:TfcTreeNode;  //声明临时树结点,用于临时存放结点信息
    begin
    with qrySlct do
     begin
       close;
       CommandText:='Select * From ADMINIXTREE where parent_id is null';  //扫描数据库中的根结点
       open;
       while not eof do
       begin
         sNode:=fcTreeView1.Items.Add(nil,qrySlct.FieldByName('ChnNodeTitle').AsString);//将中文名称生成结点
         sNode.StringData := qrySlct.FieldByName('NODE_ID').AsString;//将其结点号存入Node中,以备以后使用
         sNode.StringData2 := qrySlct.FieldByName('DllName').AsString;//将其结点的Dll文件存入,以备以后使用
         Next;
       end;
     end;
    ////////////////////////////
    就这样一个树干就做完了
    第二步 动态生成树枝
    动态生成树枝放在FcTreeview的Click事件中,当然也可以放入Onchange中,个人建议放在Click
    这里有个问题,在生成树干后,怎样在点击树时返回我点的结点名称呢?
    有两种方法
    1.在MouseDown中获得
    procedure TForm1.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var
      pNode:TTreeNode;
    begin
      pNode:=TreeView1.GetNodeAt(x,y);
    end;
    2.在单元中声明一个全局FctreeView结点,在Fctreeview的Onchange中将Node赋值于该全局变量
    而后在Click中写生成树枝的程序
    procedure TForm1.fcTreeView1Click(Sender: TObject);
    var
    sNode:TfcTreeNode;
    begin
     if ddNode.Count=0 then //如果该结点已生成,而放弃再次生成!
     begin
     with qrySlct do
     begin
       close;
       CommandText:='Select * From ADMINIXTREE where parent_id ='+ddNode.StringData;//注意,这是根据当前某点,生成其分枝的语句
       open;
       while not eof do
       begin
         sNode:=fcTreeView1.Items.AddChild(ddNode,qrySlct.FieldByName('ChnNodeTitle').AsString);
         sNode.StringData := qrySlct.FieldByName('NODE_ID').AsString;
         Next;
       end;
     end;
    end;
    end;
      

  4.   

    如果用Treeview
    1.先建造结构体,并用结构体指针指向该结构体
    2.建树干
    3.动态生成结点下的Child
          TNodeInfoEx = Packed Record
          NodeID    : Integer;
          ParentID  : Integer;
          NodeType  : SmallInt;
          NodeLevel : SmallInt;
          ChnNodeTitle : String;
          EngNodeTitle : String;
          dllFileName : String;
         ImageIndex: SmallInt;
          SelectedIndex: SmallInt;
        end;
        PNodeInfoEx = ^TNodeInfoEx;
    procedure TForm1.BuildTree(Treeview:Ttreeview);
    var
    AddNodeInfo : TNodeInfoEx;
    begin
     with qrySlct do
     begin
       close;
       CommandText:='Select * From ADMINIXTREE where parent_id is null';
       open;
       while not eof do
       begin
         AddNodeInfo.NodeID := qrySlct.FieldByName('NODE_ID').AsInteger;
         AddNodeInfo.ParentID := qrySlct.FieldByName('PARENT_ID').AsInteger;
         AddNodeInfo.NodeType := qrySlct.FieldByName('NodeType').AsInteger;
         AddNodeInfo.ChnNodeTitle := qrySlct.FieldByName('ChnNodeTitle').AsString;
         AddTreeItem(Treeview1,AddNodeInfo);
         Next;
       end;
     end;
    end;procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
    begin
    tmpNode:=Node;
    end;procedure TForm1.TreeView1Click(Sender: TObject);
    var
    AddNodeInfo : TNodeInfoEx;
    ParentNode: TTreeNode;
    FuncNodeInfo: PNodeInfoEx;
    begin
     if tmpNode.Count=0 then
     begin
     with qrySlct do
     begin
       close;
       CommandText:='Select * From ADMINIXTREE where parent_id ='+Inttostr(PNodeInfoEx(tmpNode.Data).NodeID);
       open;
       while not eof do
       begin
         AddNodeInfo.NodeID := qrySlct.FieldByName('NODE_ID').AsInteger;
         AddNodeInfo.ParentID := qrySlct.FieldByName('PARENT_ID').AsInteger;
         AddNodeInfo.NodeType := qrySlct.FieldByName('NodeType').AsInteger;
         AddNodeInfo.ChnNodeTitle := qrySlct.FieldByName('ChnNodeTitle').AsString;
         New(FuncNodeInfo);
         FuncNodeInfo^.NodeID   := AddNodeInfo.NodeID;
         FuncNodeInfo^.ParentID := AddNodeInfo.ParentID;
         FuncNodeInfo^.NodeType := AddNodeInfo.NodeType;
         FuncNodeInfo^.ChnNodeTitle:= AddNodeInfo.ChnNodeTitle;
         Treeview1.Items.AddChildObject(Tmpnode, Trim(AddNodeInfo.ChnNodeTitle), Pointer(FuncNodeInfo));
         Next;
       end;
     end;
    end;
      

  5.   

    要是不用连接数据库话,如何实现如我的帖子的结构呀
    http://topic.csdn.net/u/20120425/10/504676a0-ef94-4fea-8c6f-810cf72eaae9.html
    http://topic.csdn.net/u/20120425/10/87c929d4-cbfd-426c-a2bf-386e4f528a67.html