数据库的设计,
单位和人员之间是一对多的关系,并且不存在一个人同时存在于多个单位的可能(假定)。
这样,设计两个表,
单位表
  结构如下
ID:单位的唯一识别号
Name:单位名称。
其他的非关键的字段
人员表
  结构如下
ID:人员的唯一识别号
Name:姓名
Apartment:指向单位表中的单位ID,表明这个人员的单位归属。
其他的非关键字段遍历过程,
1、置人员表的游标到第一个记录
2、如果当前记录不是空则,进行3,否则7
3、取出人员表中的当前记录,找到Apartment,遍历TreeView,查找是否存在这样的ID,如果存在,则进行4,否则5
4、在找到的Treenode的子节点中插入一个新节点,Text为用户表当前记录的Name+ID的一个合成。(没有办法,TreeView中的节点除了Text没有其他的比如指针之类的可以描述节点的属性,只好这样处理)。转到6
5、根据找到的Apartmen指出的单位ID,在单位表中定位这个纪录,如果没有找到,则什么也不做,如果找到,插入这个节点到TreeView中,Text为Name和ID的合成。转到4
6、对人员表进行NextRecord,转到2
7、结束。

解决方案 »

  1.   

    //不是已经叫你参考,我的文档了吗?
    //请你测试测试看如下代码function TreeNodeString(mTreeNode: TTreeNode; mDelimiter: string = '\'): string;
    begin
      Result := '';
      while Assigned(mTreeNode) do begin
        Result := mTreeNode.Text + mDelimiter + Result;
        mTreeNode := mTreeNode.Parent;
      end;
      Delete(Result, Length(Result) - Length(mDelimiter) + 1, MaxInt);
    end; { TreeNodeString }function DataSetToTreeView(mDataSet: TDataSet; mTreeView: TTreeView): Boolean; overload;
    const
      cDelimiter = '\';
    var
      J, K: Integer;
      vStrPath: string;
      vStrText: string;
      vTreeNode: TTreeNode;
      vBoolFind: Boolean;
    begin
      Result := False;
      if not (Assigned(mDataSet) and Assigned(mTreeView)) then Exit;
      if not mDataSet.Active then Exit;
      mTreeView.Items.Clear;
      mDataSet.First;
      while not mDataSet.Eof do begin
        vStrPath := '';
        vTreeNode := nil;
        for J := 0 to mDataSet.FieldCount - 1 do begin
          vStrText := mDataSet.Fields[J].DisplayText;
          vStrPath := vStrPath + cDelimiter + vStrText;
          vBoolFind := False;
          for K := 0 to mTreeView.Items.Count - 1 do
            if cDelimiter + TreeNodeString(mTreeView.Items[K], cDelimiter) =
              vStrPath then begin
              vTreeNode := mTreeView.Items[K];
              vBoolFind := True;
              Break;
            end;
          if vBoolFind then Continue;
          vTreeNode := mTreeView.Items.AddChild(vTreeNode, vStrText);
        end;
        mDataSet.Next;
      end;
      Result := True;
    end; { DataSetToTreeView }procedure TForm1.Button1Click(Sender: TObject);
    begin
      DataSetToTreeView(Table1, TreeView1);
    end;
      

  2.   

    function DataSetToTreeView(mDataSet: TDataSet; mTreeView: TTreeView): Boolean; overload;
    const
      cDelimiter = '\';
    var
      J, K: Integer;
      vStrPath: string;
      vStrText: string;
      vTreeNode: TTreeNode;
      vBoolFind: Boolean;
    begin
      Result := False;
      if not (Assigned(mDataSet) and Assigned(mTreeView)) then Exit;
      if not mDataSet.Active then Exit;
      mTreeView.Items.Clear;
      mDataSet.First;
      while not mDataSet.Eof do begin
        vStrPath := '';
        vTreeNode := nil;
        for J := 0 to mDataSet.FieldCount - 1 do begin
          vStrText := mDataSet.Fields[J].DisplayText;
          vStrPath := vStrPath + cDelimiter + vStrText;
          vBoolFind := False;
          for K := 0 to mTreeView.Items.Count - 1 do
            if cDelimiter + TreeNodeString(mTreeView.Items[K], cDelimiter) =
              vStrPath then begin
              vTreeNode := mTreeView.Items[K];
              vBoolFind := True;
              Break;
            end;
          if vBoolFind then Continue;
          vTreeNode := mTreeView.Items.AddChild(vTreeNode, vStrText);
        end;
        mDataSet.Next;
      end;
      Result := True;
    end; { DataSetToTreeView }procedure TForm1.Button1Click(Sender: TObject);
    begin
      DataSetToTreeView(Table1, TreeView1);
    end;