请问怎么确定树中某一个结点,就象数据库中的主键一样标志树中唯一的一个结点!

解决方案 »

  1.   

    PATH啦 这个还不简单 hehe^^
      

  2.   

    楼上的对错我就先不说了,X和Y是会变的...
    PATH的方法对同结点下不同名的情况可以用
      

  3.   

    implementation{$R *.DFM}var
      tempStr: String;function TForm1.GetTreeNodePath(tempNode: TTreeNode): String;
    begin
      if tempNode.Parent <> nil then
      begin
        tempStr := tempStr + '/' + tempNode.Text;
        tempStr := GetTreeNodePath(tempNode.Parent);
        Result := tempStr;
      end
      else
        Result := tempStr + '/' + tempNode.Text;
    end;procedure TForm1.ShowPathButClick(Sender: TObject);
    var
      tempNode: TTreeNode;
      tStr: String;
    begin
      if TreeView1.Selected <> nil then
      begin
        tempStr := '';
        tStr := GetTreeNodePath(TreeView1.Selected);
        ShowMessage(tStr);
      end;
    end;这是取PATH的一段例程,最后一个是根节点 ^^! 有时间我再改改
      

  4.   

    用PATH的方法只能用在,同一节点下的子节点不能重名的情况下如果有重名的情况,你可以用Node的Data保存一个Record的方法来做
      

  5.   

    我觉得办法应该很多,可以根据节点的显示值,比如你在向树种插入一个新值时,你可以自己写程序来判断树种是否有节点已经占用了相同的值,你也可以在节点的Data属性中使用类似的方法来限制某个值(某个值相当于数据库的某一个字段)只能是唯一的。
      

  6.   

    这种方法实现我的程序要求很难,我的要求是如果我输入一个整数当然是在规定的范围内,那么我旧可以得到该整数对应的结点的text
      

  7.   

    对于树的节点来说,TreeNode的AbsoluteIndex值是唯一的。
      

  8.   

    procedure TForm1.ShowPathButClick(Sender: TObject);
    var
      i: Integer;
    begin
      for i := 0 to TreeView1.Items.Count -1 do
      begin
        ShowMessage(TreeView1.Items.Item[i].Text);
      end;
    end;这个里头的i不是你想要的吗???
      

  9.   

    那不是很容易吗,你可以使用下面类似的方法来得到结点的text:
    {***************************************************************
     * 方 法 名  : TfrmMap.FindTreeNodeOnIndex
     * 编写目的   : 根据图片编号查找节点
     * 作    者  : 黄仁光
     * 参    数  : Tree:TTreeNodes;MapIndex:Integer
     * 结    果  : Integer
     * 编写日期   :2003年01月13日
     ****************************************************************}
    function TfrmMap.FindTreeNodeOnIndex(Tree:TTreeNodes;MapIndex:Integer):Integer;
    var
      CurItem:TTreeNode;
      Index:Integer;
      pSelect:PMapNode;
    begin
      Result := -1;
      new(pSelect);
      CurItem := Tree.GetFirstNode;
      CurItem := CurItem.GetNext;
      while CurItem <> nil do
      begin
        pSelect := PMapNode(CurItem.Data);
        Index := pSelect.fIndex;
        if Index = MapIndex then
        begin
          Result := CurItem.AbsoluteIndex;
          break;
        end;
        CurItem := CurItem.GetNext;
      end;
    end;
    function TfrmMap.FindTreeNodeOnIndex(Tree:TTreeNodes;MapIndex:Integer):Integer;
    var
      CurItem:TTreeNode;
      Index:Integer;
      pSelect:PMapNode;
    begin
      Result := -1;
      new(pSelect);
      CurItem := Tree.GetFirstNode;
      CurItem := CurItem.GetNext;
      while CurItem <> nil do
      begin
        pSelect := PMapNode(CurItem.Data);
        Index := pSelect.fIndex;
        if Index = MapIndex then
        begin
          Result := CurItem.AbsoluteIndex;
          break;
        end;
        CurItem := CurItem.GetNext;
      end;
    end;
      

  10.   

    可是TreeView1.Items.Item[i].Text
    中的i怎么确定,我是说他代表的是什么呢?不是index吧
      

  11.   

    我上面那个方法中的fIndex是我数据库中的东西,我限制了它为唯一的值,保存在节点的Data属性当中。
      

  12.   

    那么i的函数名是什么?
    我怎么能通过ShowMessage()来看到啊,
      

  13.   

    我想实现的功能是这样的,我用了一个带有checkbox的Treeview控件来实现动态权限树的生成,既,我要根据树中的结点的checked真假的判断来修改一个权限字符数组 char right[20]将其相应的位置为0或1,怎么实现?
      

  14.   

    干脆点:
    type
      TMap = Record
        fIndex: Integer;
        fName: String;
        fCode: string;
        fType: Integer;
        fDate: TDate;
        fFileType:String;
        FileName: string;
        fRe: string;
      end;type
      PMapNode = ^TMapNode;
      TMapNode = record
        fIndex:Integer;//图片编号
        fCode:String;//图片编码
        fName:String;//图片名称
        fType:Integer;
        FileName:String;//文件名
      end;
    {***************************************************************
     * 方 法 名  : TfrmMap.AddRootNode
     * 编写目的   :
     * 作    者  : 黄仁光
     * 参    数  : MapType:Integer
     * 结    果  : TTreeNode
     * 编写日期   :2002年12月18日
     ****************************************************************}
    function TfrmMap.AddRootNode(MapType:Integer):TTreeNode;
    var
      RootNode:TTreeNode;
    begin
      treImage.Items.Clear;
      case MapType of
        0://单位方位图
          begin
            RootNode := treImage.Items.Add(nil,'单位方位图');
          end;
        1://建筑平面图
          begin
            RootNode := treImage.Items.Add(nil,'建筑平面图');
          end;
        2://建筑立面图
          begin
            RootNode := treImage.Items.Add(nil,'建筑立面图');
          end;
        3://楼层平面图
          begin
            RootNode := treImage.Items.Add(nil,'楼层平面图');
          end;
        4://消防部署图
          begin
            RootNode := treImage.Items.Add(nil,'消防部署图');
          end;
        5://最佳路径图
          begin
            RootNode := treImage.Items.Add(nil,'最佳路径图');
          end;
      end;
      Result := RootNode;
    end;{***************************************************************
     * 方 法 名  : TfrmMap.AddChildNode
     * 编写目的   :
     * 作    者  : 黄仁光
     * 参    数  : RootNode:TTreeNode;fIndex:Integer;fCode,fName:String;FileName:String
     * 结    果  : None
     * 编写日期   :2002年12月18日
     ****************************************************************}
    procedure TfrmMap.AddChildNode(RootNode:TTreeNode;fIndex:Integer;fCode,fName:String;fType:Integer;FileName:String);
    var
      ChildNode:TTreeNode;
      pMapChild:PMapNode;
    begin
      new(pMapChild);
      pMapChild^.fIndex := fIndex;
      pMapChild^.fCode := fCode;
      pMapChild^.fName := fName;
      pMapChild^.fType := fType;
      pMapChild^.FileName := FileName;
      ChildNode := treImage.Items.AddChildObject(RootNode,fCode,pMapChild);
    end;function TfrmMap.FindTreeNodeOnCode(Tree:TTreeNodes;SearchString:String):Integer;
    var
      CurItem:TTreeNode;
      Title:String;
    begin
      Result := -1;
      CurItem := Tree.GetFirstNode;
      while CurItem <> nil do
      begin
        Title := CurItem.Text;
        if AnsiCompareStr(Title,SearchString) = 0 then
        begin
          Result := CurItem.AbsoluteIndex;
          break;
        end;
        CurItem := CurItem.GetNext;
      end;
    end;{***************************************************************
     * 方 法 名  : FindTreeNodeOnName
     * 编写目的   :
     * 作    者  : 黄仁光
     * 参    数  : Tree:TTreeNodes;SearchString:String
     * 结    果  : Integer
     * 编写日期   :2002年12月28日
     ****************************************************************}
    function TfrmMap.FindTreeNodeOnName(Tree:TTreeNodes;SearchString:String):Integer;
    var
      CurItem:TTreeNode;
      Name:String;
      pSelect:PMapNode;
    begin
      Result := -1;
      new(pSelect);
      CurItem := Tree.GetFirstNode;
      CurItem := CurItem.GetNext;
      while CurItem <> nil do
      begin
        pSelect := PMapNode(CurItem.Data);
        Name := pSelect.fName;
        if Name = SearchString then
        begin
          Result := CurItem.AbsoluteIndex;
          break;
        end;
        CurItem := CurItem.GetNext;
      end;
    end;{***************************************************************
     * 方 法 名  : TfrmMap.FindTreeNodeOnIndex
     * 编写目的   : 根据图片编号查找节点
     * 作    者  : 黄仁光
     * 参    数  : Tree:TTreeNodes;MapIndex:Integer
     * 结    果  : Integer
     * 编写日期   :2003年01月13日
     ****************************************************************}
    function TfrmMap.FindTreeNodeOnIndex(Tree:TTreeNodes;MapIndex:Integer):Integer;
    var
      CurItem:TTreeNode;
      Index:Integer;
      pSelect:PMapNode;
    begin
      Result := -1;
      new(pSelect);
      CurItem := Tree.GetFirstNode;
      CurItem := CurItem.GetNext;
      while CurItem <> nil do
      begin
        pSelect := PMapNode(CurItem.Data);
        Index := pSelect.fIndex;
        if Index = MapIndex then
        begin
          Result := CurItem.AbsoluteIndex;
          break;
        end;
        CurItem := CurItem.GetNext;
      end;
    end;{***************************************************************
     * 方 法 名  : GetMapRS
     * 编写目的   :
     * 作    者  : 黄仁光
     * 参    数  : MapType:Integer
     * 结    果  : None
     * 编写日期   :2002年12月18日
     ****************************************************************}
    procedure TfrmMap.GetMapRS(MapType:Integer);
    var
      qry:TADOQuery;
      mySql:String;
      fIndex:Integer;
      fCode:String;
      fName:String;
      fFileType:String;
      SubFileName:String;
      FileName:String;
      RootNode:TTreeNode;
      iLoop:Integer;
    begin
      try
        qry := TADOQuery.Create(nil);
        qry.Connection := g_sysconnect;
        mySql := 'select fIndex,fCode,fName,fFileType from Map where fType='+IntToStr(MapType);
        if g_fun_ExecuteSQL(qry,mySql,2) then
        begin
          case MapType of
            0://单位方位图
              begin
                SubFileName := TempMapDir+'\UnitDirMap';
              end;
            1://建筑平面图
              begin
                SubFileName := TempMapDir+'\BuiPlaneMap';
              end;
            2://建筑立面图
              begin
                SubFileName := TempMapDir+'\BuildEnvMap';
              end;
            3://楼层平面图
              begin
                SubFileName := TempMapDir+'\StaPlaneMap';
              end;
            4://消防部署图
              begin
                SubFileName := TempMapDir+'\DeployMap';
              end;
            5://最佳路径图
              begin
                SubFileName := TempMapDir+'\BestMap';
              end;
          end;
          RootNode := AddRootNode(MapType);
          qry.First;
          while not qry.Eof do
          begin
            fIndex := qry.FieldByName('fIndex').AsInteger;
            fCode := qry.FieldByName('fCode').AsString;
            fName := qry.FieldByName('fName').AsString;
            fFileType := qry.FieldByName('fFileType').AsString;
            FileName := SubFileName+IntToStr(fIndex)+fFileType;
            AddChildNode(RootNode,fIndex,fCode,fName,MapType,FileName);
            qry.Next;
          end;
        end;
      finally
        FreeAndNil(qry);
      end;
    end;
      

  15.   

    procedure TfrmMap.edtFindNameKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    var
      NodeIndex:Integer;
      TargetNode:TTreeNode;
      pMapChild:PMapNode;
      fIndex:Integer;//图片编号
      FileName:String;//文件名
    begin
      if Key = 13 then
      begin
        try
          NodeIndex := FindTreeNodeOnName(treImage.Items,edtFindName.Text);
          if NodeIndex <> -1 then
          begin
            try
              TargetNode := treImage.Items[NodeIndex];
              TargetNode.Selected := true;
              TargetNode.Focused := true;
              new(pMapChild);
              Screen.Cursor := crHourGlass;
              MapEntryMode := 1;//如果选择树里面的图片,说明图片表是编辑
              pMapChild := PMapNode(TargetNode.Data);
              FileName := pMapChild^.FileName;
              MapIndex := pMapChild^.fIndex;
              p_PicType := pMapChild.fType;//取得图片的类型
              if FileName <> MapFileName then
              begin
                MapFileName := FileName;
                fIndex := pMapChild^.fIndex;
                ShowMapRS(fIndex);
              end;
            except
              Screen.Cursor := crDefault;
              Exit;
            end;
          end;  
        finally
          Screen.Cursor := crDefault;
        end;
      end;
    end;procedure TfrmMap.edtFindCodeKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    var
      NodeIndex:Integer;
      TargetNode:TTreeNode;
      pMapChild:PMapNode;
      fIndex:Integer;//图片编号
      FileName:String;//文件名
    begin
      try
        NodeIndex := FindTreeNodeOnCode(treImage.Items,edtFindCode.Text);
        if NodeIndex <> -1 then
        begin
          try
            TargetNode := treImage.Items[NodeIndex];
            TargetNode.Selected := true;
            TargetNode.Focused := true;
            new(pMapChild);
            Screen.Cursor := crHourGlass;
            MapEntryMode := 1;//如果选择树里面的图片,说明图片表是编辑
            pMapChild := PMapNode(TargetNode.Data);
            FileName := pMapChild^.FileName;
            MapIndex := pMapChild^.fIndex;
            p_PicType := pMapChild.fType;//取得图片的类型
            if FileName <> MapFileName then
            begin
              MapFileName := FileName;
              fIndex := pMapChild^.fIndex;
              ShowMapRS(fIndex);
            end;
          except
            Screen.Cursor := crDefault;
            Exit;
          end;
        end;  
      finally
        Screen.Cursor := crDefault;
      end;
    end;
      

  16.   

    使用结点对象的方法
    tree->items->addobject(pnode,"",node);
    node中保存给结点的唯一标志