当然,所谓的难,是相对我考虑很长时间没有解决来说的,是这样的:
要做一个权限树,动态生成,从数据库读权限id和权限名称,把权限名称给treenode的text,但是
不知把权限id赋值给treenode的什么属性,尝试了stateindex ,selectedindex都不行,而我必须
要把权限id赋值过去,因为后面要根据动态生成mainmenu的menuitem的tag和权限id去判断调用具体的
功能,不知大家能理解我的意思吗?

解决方案 »

  1.   

    使用TTreeNode的Data属性,把对象绑定到节点
      

  2.   

    同意楼上 fjx99(fjx99) 兄弟的。
      

  3.   

    偷懒的做法://Right_ID 必须是 >= 0 才能这样做
    //否则,你就需要生成一个 Record or class 挂到treeNode.Data上
    treeNode.Data := Pointer(Right_ID);
      

  4.   

    试了一下
    发现访问权限id:right_id:=treenode.data^出错[Error] shareunit.pas(330): Incompatible types: 'String' and 'procedure, untyped pointer or untyped parameter'
    大家帮忙吧
      

  5.   

    说明一下
    treenode.data是string型指针 上面的right_id也是string
      

  6.   

    right_id := string(treenode.data^);
      

  7.   

    用了楼上的,compile没有问题
    可是run到上句是出现读地址错误,读了00000000地址,
    说明一下,treenode.data我是赋了一个初始化的指针的,没有悬空
      

  8.   

    我刚解决:type
      P = ^R;
      R = record
       i:integer; 
    .... var rs:tadoquery;
     i:integer;
     Nodx,FirstNode:TTreeNode ;
      pt:P;
      lt:TList;
    begin
              lt := TList.Create;
               new(pt);
               pt.i:=100;
               lt.Clear;
               lt.Add(pt);
              nodx:=treeview1.Items.AddChild(ParentNode,'目录1']);
              nodx.Data:=lt.Items[0];
             
     end;showmessage(inttostr(P(TreeView1.Selected.Data)^.i));//这里就取到100了
      

  9.   

    type
      P = ^R;
      R = record
       i:integer; 
    .... var rs:tadoquery;
     i:integer;
     Nodx,FirstNode:TTreeNode ;
      pt:P;
      lt:TList;  //@@为什么要通TList去赋值呢?
    begin
              lt := TList.Create;
               new(pt);
               pt.i:=100;
               lt.Clear;
               lt.Add(pt);
              nodx:=treeview1.Items.AddChild(ParentNode,'目录1']);
          nodx.Data:=lt.Items[0];//@@直接赋一个指针型的变量为什么不可以呢?nodx.data不是pointer?
        end;有谁能回复//@@后面我的迷茫吗?
      

  10.   

    顺便说一点,在COMBOBOX中也是如此:
    type
      pFields=^TFields;//定义一个记录集
      TFields=Record
        ID,Name:String;
       
      end;while not rs.eof do
    begin
      New(pF);
      pF.ID:=rs.FieldByName('ID').AsString;
      pF.Name:=rs.FieldByName('Name').AsString;  ComboBox1.Items.AddObject(pF.Name,TObject(pF));//
      rs.next;
    end;
    showmessage(pFields(ComboBox1.Items.Objects[ComboBox1.ItemIndex]).id);
      

  11.   

    這樣也可以,我一直用的.
    var
      FNodes : TTreeNode;
      MyLabel : TLabel;
    Begin
      //取得數據源內容
      while not query1.eof do Begin
        FNodes := TreeView1.Items.add(nil,query1.FieldByName('Text').asString);
        MyLabel := TLabel.Create(Self);
        MyLabel.caption := query1.FieldByName('Id').asString;
        FNodes.data := MyLabel;
        Query1.Next;
      end;
    end;