主要的问题是vt树在onGetText时遇到了问题我的主要的数据结构如下
a=record
b:integer;
caption:shortstring;
end
pa=^a;mynode=record
nodetype:integer;
pdata:pa;
end;
pmynode=^mynode;
在使用时,我先用addchild获得一个指针,然后根据这个指针对数据进行初始化
例如
node1.nodetype:=1;
node1.pdata.a:=1;
node1.pata.caption:='adfasdfaf';在onGetText事件中
我是这么写的
celltext:=pmynode(sender.GetNodeData(node)).pdata.caption;但是程序在实际运行中一直提示内存访问出错。
请问熟悉vt树的,这是怎么回事?主要问题出在哪??还是说ongettext在addchild后马上就调用了,而此时我还没有初始化pdata数据?

解决方案 »

  1.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, VirtualTrees, StdCtrls;type
      MyRec=record
      b:integer;
      caption:shortstring;
      end;
      pa=^MyRec;
      TForm1 = class(TForm)
        VirtualStringTree1: TVirtualStringTree;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure VirtualStringTree1FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
        procedure Button1Click(Sender: TObject);
        procedure VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      VirtualStringTree1.NodeDataSize := SizeOf(MyRec);
    end;procedure TForm1.VirtualStringTree1FreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
    begin
      Finalize(pa(Sender.GetNodeData(Node))^);
    end;procedure TForm1.VirtualStringTree1GetText(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType; var CellText: WideString);
    var
      pData:pa;
    begin
      pData:= Sender.GetNodeData(Node);
      Case Column of
        0: CellText := Inttostr(pData^.b);
        1: CellText := pData^.caption;
      end;end;procedure TForm1.Button1Click(Sender: TObject);
    var
      pNode:PVirtualNode;
      pData:pa;
    begin
      pNode:=VirtualStringTree1.AddChild(nil,nil);
      pData:=VirtualStringTree1.GetNodeData(pNode);
      pData^.b:=123;
      pData^.caption:='Test';
    end;
    end.
      

  2.   

    要先初始化节点数据,如下:
    procedure Tfrm_main.vstInitNode(Sender: TBaseVirtualTree; ParentNode,
      Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
    var
      Data: ^Pa;
    begin
      try
        inherited;
        if ParentNode = nil then
        begin
          try
            Data := Sender.GetNodeData(Node);
            Data^ := Pa(InforList.Items[node.Index]);  //inforlist:存储树中各节点数据
          except
          end;
        end
      except
      end;
    end;
      

  3.   

    照你以上的代码,是没有内存报错的,因为没有初始化列,以及节点,所以导致,button1后,树中,只有添加了node,没有其他的了!加上列就可以正常显示了!
      

  4.   

    解决了,我先判断了下指针是否等于nil然后进行下一步
    结贴