请问用代码如何实现TreeView和cxDBGrid的几个功能?100分奉上,谢谢!
用TreeView实现了下面的一个树
|+-公司XP
|   +--行政部
|      +--人员XYZ
|      +--人员XPX
|   +--技术部
|      +--人员X342
|      +--人员DOUP
|      +--人员FDFS
|+-公司VV
|   +--行政部
|      +--人员AYZ
|      +--人员CPX
|   +--技术部
|      +--人员X342
|      +--人员DOUP
|      +--人员FDFS
|   +--财务部
|      +--人员X32
|      +--人员D23P
|      +--人员F23S表结构
{
    公司名 VARCHAR(100),
    部门名 VARCHAR(100),
    员工名 VARCHAR(100)
}我把这个表用cxDBGrid显示内容:公司名   部门名   员工名
------------------------------
公司XP   行政部   人员XYZ
公司XP   行政部   人员XPX
......
公司VV   行政部   人员AYZ
......
现在我想
1. 如何用TreeView实现了上面的树;
2. 如何点击TreeView和各级节点时,实现在cxDBGrid中对应公司名、部门名的过虑;
2. 在选中cxDBGrid的一条记录时,树中对应的公司名、部门名、员工名也处于选中状态。请问用代码如何实现?100分奉上,谢谢!

解决方案 »

  1.   

    procedure TLoadTree.Execute;
    var
      ANode:TTreeNode;
      PData:PRec;//数据指针
      I:Integer;
      TempFun:Integer;
      P:^string;
    begin
      { Place thread code here }
      FTree.Items.Clear;
      try
        Qry_Data.Close;
        Qry_Data.SQL.Clear;
        Qry_Data.SQL.Text:='SELECT * from T_model order by functionid';
        Qry_Data.Open;
        //*************添加节点****************//
        while not Qry_Data.Eof do
          begin
            New(PData);//分配指针内存
            PData^.FunctionID :=Qry_Data.FieldByName('FunctionID').AsInteger;
            PData^.ModelName  :=Qry_Data.FieldByName('ModelName').AsString;
            PData^.ModelType  :=Qry_Data.FieldByName('ModelType').AsInteger;
            PData^.ParentID   :=Qry_Data.FieldByName('ParentID').AsInteger;
            PData^.ImageIndex :=Qry_Data.FieldByName('ImageIndex').AsInteger;
            if Qry_Data.FieldByName('ParentID').AsInteger=0 then //创建根节点
               begin
                 ANode:=FTree.Items.AddObject(nil,Qry_Data.FieldByName('ModelName').AsString,PData);
                 ANode.ImageIndex:=PData^.ImageIndex;
                 ANode.SelectedIndex:=PData^.ImageIndex+1;
                 Qry_Data.Next;
               end else
               begin
                 ANode:=FindParent(PData^.ParentID,FTree);
                 if ANode<>nil then
                   begin
                     ANode:=FTree.Items.AddChildObject(ANode,Qry_Data.FieldByName('ModelName').AsString,PData);
                     ANode.ImageIndex:=PData^.ImageIndex;
                     ANode.SelectedIndex:=PData^.ImageIndex+1;
                   end;
                 Qry_Data.Next;
               end;
          end;
        //以上代码加载所有菜单项
        if G_UserType=0 then //管理员
          begin
            FTree.ReFresh;
            Exit;
          end;
        Qry_Data.Close;
        Qry_Data.SQL.Clear;
        Qry_Data.SQL.Text:='select a.* from T_Model a,T_UserRight b where a.functionid=b.functionid and b.UserType='''+InttoStr(G_UserType)+''' and a.Modeltype=1 union all select * from T_Model where Modeltype=0';
        Qry_Data.Open;
        Qry_Data.First;
        while not Qry_Data.Eof do
          begin
            New(P);
            P^:= Qry_Data.FieldByName('FunctionID').AsString;
            G_FunctionIDList.Add(P);
            Qry_Data.Next;
          end;    I:=FTree.Items.Count-1;
        while(I>=0) do
          begin
            TempFun:=PRec(FTree.Items.Item[I].Data)^.FunctionID;
            if (not Qry_Data.Locate('FunctionID',TempFun,[loCaseInsensitive])) and (not FTree.Items.Item[I].HasChildren) then
              begin
                FTree.Items.Item[I].Delete;
              end;
            Dec(I);
          end;
      except
        ShowMessage('加载树出错!');
      end;
      FTree.ReFresh;
    end;
      

  2.   

    new(item);
      item^.ClassId := q.fieldbyname('class_id').asinteger;
      item^.ClassName := ClassName;
      item^.ClassLevel := ClassLevel;
      item^.PClassId := PClassId;
      node := tvClass.Items.AddChild(pNode, ClassName);
      node.Data := item;
      tvClass.Selected := node;上面比较详细了