在treeview当中我使用了指针
 while not eof do
       begin         new(myPro);
         myPro.Code :=fieldbyname('AccusalCode').Value;
         myPro.name:=fieldbyname('AccusalName').Value+' '+Fieldbyname  ('Content').Value ;
         myPro.level :=fieldbyname('AccusalLevel').Value ;
         myPro.Pcode  :=fieldbyname('SuperiorCode').Value ;
         myNode:=TreeView1.Items.AddChildObject(node,fieldbyname('AccusalName').Value+' '+Fieldbyname('Content').Value ,myPro );
         treeload(mynode,fieldbyname('AccusalCode').Value );
           dispose(PTreeNodePro(myPro));
        
         next;
end;然后我再点击树控件中 new(myPro);
    myPro:=PTreeNodePro(Treeview1.Selected.Data) ;
    mycode:=myPro.code;使用这个访问,报内存访问错误
如果在加载树时不释放mypro,就不会出现错误
但是会占用大量的内存,我如何释放掉,请指教

解决方案 »

  1.   

    //dispose(PTreeNodePro(myPro));  //这行不用
        //new(myPro);     //这行也不用
        myPro:=PTreeNodePro(Treeview1.Selected.Data) ;
        mycode:=myPro.code;
      

  2.   

    假设myPro:TmyPro
    procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
    begin
      if TmyPro(node.data)<>nil then dispose(TmyPro(node.data))
    end;
      

  3.   

    补充一句:以上代码在Treeview的Deletion事件中。
      

  4.   

    myPro := Nil_____________________________________________________________________暮春三月,羊欢草长,天寒地冻,问谁饲狼?人心怜羊,狼心独怆,天心难测,世情如
    霜……
    言有尽而意无穷,余意尽在不意中
      

  5.   

    procedure TfrmEntityLaw.treeload(node:TTreeNode;myCode:string;lawcode:string);
    var
     myNode:TTreeNode;
     MyQuery:TADOQuery;
     myPro:PTreeNodePro1;
     mystr:string;
    begin
      //
      mystr:=lawcode;
      myQuery:=TADOQuery.Create(nil);
      myQuery.Connection :=DM.ADOConnection1 ;
      with myQuery do
      begin
        close;
        with sql do
        begin
          clear;
          add('select * from EntityLaw where LawCode='+''''+mystr+''''+' and SuperiorItemCode='+''''+mycode+''''+' order by ItemCode');
        end;
        //parameters.ParamValues[:Scode] :=myCode;
        prepared;
        try
          open;
        except
          raise;
        end;    if recordcount=0 then
          exit;
        if recordcount>0 then
        begin
          first;
          while not eof do
          begin
            new(myPro);
            myPro.Code :=fieldbyname('ItemCode').Value;
            myPro.name:=fieldbyname('SectionName').Value ;
            myPro.Level:=fieldbyname('SectionLevel').Value ;
            myPro.Pcode  :=fieldbyname('SuperiorItemCode').Value ;
            myPro.lawcode :=mystr;
            myNode:=TreeView1.Items.AddChildObject(node,fieldbyname('SectionName').Value ,myPro );
            treeload(mynode,fieldbyname('ItemCode').Value,mystr );
            next;
          end;
        end;
      end;
    end;procedure TfrmEntityLaw.FormShow(Sender: TObject);
    begin
     sysInit;
     Treeview1.Items.Clear ;
     BitBtn3.Click ;
    end;
    procedure TfrmEntityLaw.BitBtn3Click(Sender: TObject);
    var
     myPro:PTreeNodePro1;
     myNode:TTreeNode;
    begin
      TreeView1.Items.Clear ;
      with DM.ADOQuery1 do
      begin
        close;
        with sql do
        begin
          clear;
          add('select * from LawList where Flag=1');
        end;
        prepared;
        try
          open;
        except
          raise;
        end;    first;
        while not eof do
        begin
            new(myPro);
            myPro.Code :=fieldbyname('LawCode').Value;
            myPro.name:=fieldbyname('LawName').Value;
            myPro.Pcode  :=fieldbyname('SuperiorLawCode').Value ;
            myPro.lawcode :='';
            myNode:=TreeView1.Items.AddChildObject(nil,fieldbyname('LawName').Value,myPro );
            treeLoad(myNode,fieldbyname('LawCode').Value ,myPro.code);
            next;
        end;
        close;
      end;
    end;
    procedure TfrmEntityLaw.Button1Click(Sender: TObject);
    var
    I:integer;
    myPro:PTreeNodePro1;
    begini:=TreeView1.Items.Count;
    while (i<>0) do
    begin
          myPro:=TreeView1.Items.Item[i-1].Data;
          if Assigned(myPro) then
          begin
           Dispose(myPro);
           TreeView1.Items.Item[i-1].Data:=nil;
           TreeView1.Items.Delete(TreeView1.Items.Item[i-1]);
         end;
           i:=TreeView1.Items.Count;
    end;
    end;我希望当点击button1的时候,内存立即释放,可是,只有当整个程序关闭的时候才能释放
      

  6.   

    getmem()
    freemem()
    这两个函数就非常有效,马上就能释放掉内存,
    为什么new/dispose就不能呢,
    请大家继续关注,treeview的data属性是不是只能使用new/dispose来实现。
    是不是存在一个函数,能够释放掉windows现在不用的内存???
    大家是不是有这样的例子,能否贴出来给看看,在下感激不禁谢谢