在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,就不会出现错误
但是会占用大量的内存,我如何释放掉,请指教
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,就不会出现错误
但是会占用大量的内存,我如何释放掉,请指教
//new(myPro); //这行也不用
myPro:=PTreeNodePro(Treeview1.Selected.Data) ;
mycode:=myPro.code;
procedure TForm1.TreeView1Deletion(Sender: TObject; Node: TTreeNode);
begin
if TmyPro(node.data)<>nil then dispose(TmyPro(node.data))
end;
霜……
言有尽而意无穷,余意尽在不意中
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的时候,内存立即释放,可是,只有当整个程序关闭的时候才能释放
freemem()
这两个函数就非常有效,马上就能释放掉内存,
为什么new/dispose就不能呢,
请大家继续关注,treeview的data属性是不是只能使用new/dispose来实现。
是不是存在一个函数,能够释放掉windows现在不用的内存???
大家是不是有这样的例子,能否贴出来给看看,在下感激不禁谢谢