我用如下方式,但取出来的是乱码!var t:string;
t:=string(treeview1.selected.data);用t:=string(treeview1.selected.data)^;
则报错:pointer type required

解决方案 »

  1.   

    var t:string;
    t:=treeview1.selected.Text;用t:=treeview1.selected.Text;
      

  2.   

    procedure Trysele.TreeView1Changing(Sender: TObject; Node: TTreeNode;
      var AllowChange: Boolean);
    var
     str:string;
     i:integer;
     a:integer;
     j:integer;
     begin
     str:=node.text;
     for i:=1 to length(str) do
       begin
       a:=pos('-',str);
       if a>0 then
       begin
       rygh:=copy(str,1,a-1);
       dmd.cx4.Close;
       dmd.cx4.SQL.clear;
       dmd.cx4.SQL.add('select 工号,姓名,部门 from ry where 工号='''+rygh+'''');
       dmd.cx4.Open;
       if dmd.cx4.RecordCount>0 then
        begin
        rygh:=dmd.cx4.fieldbyname('工号').asstring;
        ryxm:=dmd.cx4.fieldbyname('姓名').asstring;
        rybm:=dmd.cx4.fieldbyname('部门').asstring;
        end;
       end;
       end;
    end;
    把dmd.cx4换成adoquery1
    一个例子
      

  3.   

    TTreeNode的Data属性是一个对象指针。你直接转化为String类型肯定要报错。
    方法很多,这里介绍一种(源代码取自Delphi Help),
    1、先定义一个记录类型及指针类型。
    type
    PMyRec = ^TMyRec;
    TMyRec = record
      FName: string;
      LName: string;
    end;2、给Data赋值时,这样写。注意MyRecPtr在未初始化以前是个空指针,必须先用New获得内存空间。procedure TForm1.Button1Click(Sender: TObject);
    var
      MyRecPtr: PMyRec;
      TreeViewIndex: LongInt;
    begin
      New(MyRecPtr);
      MyRecPtr^.FName := Edit1.Text;
      MyRecPtr^.LName := Edit2.Text;
      TreeViewIndex := StrToInt(Edit3.Text);
      with TreeView1 do
      begin
        if Items.Count = 0 then
          Items.AddObject(nil, 'Item' + IntToStr(TreeViewIndex), MyRecPtr)
        else if (TreeViewIndex < Items.Count) and (TreeViewIndex >= 0) then
          Items.AddObject(Items[TreeViewIndex], 'Item' + IntToStr(TreeViewIndex), MyRecPtr);
      end;
    end;3、取出Data的方法就很简单了,直接转化即可。需要注意的是指针类型成员的取值方法。
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      Label1.Caption := PMyRec(TreeView1.Selected.Data)^.FName + ' ' +
                      PMyRec(TreeView1.Selected.Data)^.LName;
    end;
      

  4.   

    请问Nirvanaxumm(狂背单词) 
    node.text 就是node.data 吗? 不会吧
      

  5.   

    用TreeView1.Selected.Text就可以,
    如果楼主非要用那种方式可以先建立一个记录类型
      

  6.   

    : yjs_lh(长风浪子   必须要定义成记录型吗? 我代码是这样的
     type 
     pestr=^string;申明一个指针类型
     .......
     ......  
     var
     p:pestr; 定义了一个指针变量
     t:string;
     让后将p赋给了结点的data,现在我想将这个data的值赋给t
     该怎么办?
      

  7.   

    不是text值,我有两个字段
    node.text的值是字段A,node.data我给的是字段b,
    我现在要取就是字段b
      

  8.   

    靠,速度太慢了,每次发出来都晚了
    呵呵
    pestr=^string
    你这个STRING关键是谁的参考一下长风浪子写的吧
      

  9.   

    pestr=^string;//申明一个指针类型
    p:pestr;//定义了一个指针变量
    p^:=FieldByName('p_id').AsString;//将p_id字段的值赋给p
      

  10.   

    送佛送到西,再给你写一遍
    Type inpter=recode
    b:string;
    end;
    var
    ptr:^Intptr;
    在FORM的SHOW事件里写上
    var
    newnode:TTreenode;
    begin
    newnode:=Ttreenode.create(Treelist.Items);
    table.first;
    while not table.eof do begin
    new(ptr);
    Treelist.addobject(newnode,table.FieldbyName('a').asstring,ptr);
    ptr.b:=table.fieldbyname('b').asstring;
    table.next;
    end; 
    end;
    取出的时候这么写就可以了
    t:=intptr(Treelist.selected.Data)^.b;
      

  11.   

    楼上放心,我会给你高分的,问题是我在前面已经说明了:是不是除了使用record型,就不能用别的办法吗?我的相关代码如下
    type
    .....
    pestr=^string;//申明一个指针类型
    ......
    var 
    t:String;
    tnode:TTreeNode
    p:pestr;//定义了一个指针变量
    p^:=FieldByName('p_id').AsString;//将p_id字段的值赋给p
    ........
    treeview1.Items.AddChildObject(ParentNode,FieldByName('p_name').AsString,p);
    tnode:=treeview1.selected;
    t:=pestr(tnode.data)^;以上代码编译通过,但执行出错
      

  12.   

    我把中间的代码详细的写出来,看看有没有问题?
    for i:=1 to reco do
    begin
    new(p);
    p^:=FieldByName('p_id').AsString;
    treeview1.Items.BeginUpdate;
    treeview1.Items.AddChildObject(ParentNode,FieldByName('p_name').AsString,p);
    Treeview1.items.EndUpdate;
    t1.MoveBy(1);
    dispose(p);
      

  13.   

    呵呵,同你开玩笑呢,必须有记录类型因为指针是必须从记录类型中取得。你声明记录类型的时候错了
    type
    .....
    pestr=^string;//申明一个指针类型 //就是这句。
    ......定义一个记录类型是这样写的
    Type inpter=recode
    b:string;
    end;//这是一个定义的记录类型。然后再
    ptr:^Intptr;
      

  14.   

    必须有记录类型因为指针是必须从记录类型中取得?在网上着到过没用record型的例子如下:
    创建一个数据库,为简化程序,我只创建两个数据库字段,定义如下:  字段名 类型 长度   Text C 10  LongID C 6  LongID字段实际上由两段组成,每一段3位,LongID只能表示1000条记录。将LongID定义为索引字段,存为c:\testtree\tree.dbf。编辑该DBF文件,新建一条记录,Text字段设为TOP,LongID字段设为“000”(3个“0”前为三个空格)。  3.创建演示程序  在Form1上放置TreeView1、Table1、PopupMenu1、Edit1、Edit2。TreeView1的PopupMenu属性设为PopupMenu1;Table1的DataBaseName属性设为c:\testtree,TableName属性设为tree.dbf,IndexFieldNames属性设为LongID;为PopupMenu1加选单项Add1和Del1,Caption分别为Add和Del;Edit1用来输入新节点的Text属性值,Edit2用来输入新节点的3位ID号。存为c:\testtree\treeunit.pas和c:\testtree\testtree.dpr。  在treeunit.pas的Type关键字后加入一行:Pstr:^string;{Pstr为字符串指针}  为Form1的OnCreate事件添加代码:
      procedure TForm1.FormCreate(Sender: TObject);
      var p:Pstr;Node:TTreeNode;
      begin
      with Table1,Treeview1 do
      begin
      open;
      first;
      new(p);{为指针p分配内存}
      p^:=FieldByName(′LongID′).AsString;
      Node:=Items.AddChildObject(nil,FieldByName(′Text′).AsString,p);
      if HasSubInDbf(Node) then Items.AddChildObject(Node,′ ′,nil);{有子节点则加一个空子节点}
      end;
      end;  HasSubInDbf为自定义函数,自变量为Node,检查节点Node有无子节点,有则返回True,反之返回False,并在TForm1的类定义里加入原型声明(其它自定义函数的原型也在TForm1的类定义里声明,不另作解释),函数代码如下:  function TForm1.HasSubInDbf(Node:TTreeNode):Boolean;
      begin
      with Table1 do
      begin
      Table1.FindNearest([copy(Pstr(Node.Data)^,4,3)+′000′]);
      result:=copy(FieldByName(′LongID′).AsString,1,3)=copy(Pstr(Node.Data)^,4,3);{如数据库里当前记录的LongID字段内容的前3位和节点Node的Data的后3位相同,则Node应该有子节点}
      end;
      end;
    ............................................