我在创建treeview的时候,节点的Data保存的是数据表中一字段值,但在读取的时候为什么不论选择的是哪个节点,其Data值都是一样???

解决方案 »

  1.   

    自己定义一个type,然后附值
    type
      PMyData = ^TMyData;
      TMyData = record
         Flag: Integer;
         ID: Integer;
    end;在程序中
    var
      P_Data:PMyData;
    begin
      P_Data.ID:=TempData.FieldByName('ID').Value;
    end以上方法就可以了,读取
    P_Data:=Node.Data
      

  2.   

    每个节点必须分配新的空间
    var
      i:integer;
      P_Data:PMyData;
    begin
      for i:=0 TreeView1.Items.Count-1 do
        begin
          new(P_Data);  //如果没有这一句,就全完了
          P_Data.ID:=TempData.FieldByName('ID').Value;
          TreeView1.Items[i].Data:=P_Data;
        end;
    end;
      

  3.   

    to allan2002(丸子),你哪种方式应该也不行吧,和我原来的方式的结果一样(即不论选择的是哪个节点,结点的Data值都不会变,都是在创建树的最后一个节点的data值)
      

  4.   

    我这是创建树的代码,有两个数组分别保存了Oracle中登录用户的对象及所有的ORacle用户,ORACLE_OBJECTS_FILE常量定义了一存放Oracle对象中英名(TABLE=表,,,),
    function TAppPublic.CreateTreeView(ADataSet, ADataSetUser : TADODataSet; ACreateUsers : Boolean; ATreeView : TTreeView) : Boolean;
    var
      P : PString;
      PChinesName : string;
      PList : TStringList;
      i, j : integer;
      PFieldName, PFieldChinese : string;
      RootNode, SubNode : TTreeNode;
    begin
      Result := False;
      if (ADataSet = nil) or (ADataSetUser = nil) or (ATreeView = nil) then exit;
      if FileExists(ExtractFilePath(Application.ExeName) + ORACLE_OBJECTS_FILE) then
       begin
         try
           PList := TStringList.Create;
           PList.LoadFromFile(ExtractFilePath(Application.ExeName) + ORACLE_OBJECTS_FILE);
           // 如果动态创建Oracel对象及用户数组成功,则构建对象树
           if CreateArrayObjects(ADataSet, ADataSetUser, ACreateUsers) then
             begin
               New(P);
               with ATreeView.Items do
               begin
                 Clear;
                 BeginUpdate;
                 // 创建用户对象节点
                 for i := Low(FArrayObjects) to High(FArrayObjects) - 1 do
                 begin
                   P^ := FArrayObjects[i];
                   // 取得Oracle对象对应中文名
                   PChinesName := PList.Values[FArrayObjects[i]];
                   RootNode := AddObject(nil, PChinesName + '(' + FArrayObjects[i] + ')', P);
                   RootNode.ImageIndex := 0;
                   RootNode.SelectedIndex := 1;
                   // 如果登录用户为系统用户,则构建Oracel所有用户子节点
                   if ACreateUsers then
                     begin
                       for j := Low(FArrayUsers) to High(FArrayUsers) - 1 do
                       begin
                         P^ := FArrayUsers[j];
                         SubNode := AddChildObject(RootNode, FArrayUsers[j], p);
                         SubNode.ImageIndex := 3;
                         SubNode.SelectedIndex := 7;
                       end;
                     end;
                 end;
                 EndUpdate;
               end;
             end;
         finally
           PList.Free;
         end;
       end
      else
       begin
         MessageBox(Application.Handle, PChar(ORACLE_OBJECTS_FILE + '文件丢失,请检查!!!'), '系统配置错误', MB_OK);
         Result := False;
         exit;
       end;
      ATreeView.Items[0].Selected := True;
      // 展开第一个结点
    //ATreeView.Items[0].Expand(False);
      Result := True;
    end;
      

  5.   

    var
      P_Data:PMyData;
    begin
      P_Data.ID:=listview1.selected.data;
      ......
    end
      

  6.   

    呵,谢谢大家的指导,其实我的TreeView每结点Data值都一样的原因是:
      

  7.   

    呵,谢谢大家的指导,其实我的TreeView每结点Data值都一样的原因是:我在XUN环外对指针分配地址这样就变成指向同一地址了,而值当然也就是最后一条记录的值了,我把New()放在环体内就一切OK了!
      

  8.   

    我也和你一样,碰到过类似的问题,把NEW 放到循环内就可以了,
    还是内存分配的问题啊