请高手帮我看看,我这段程序运行一次后,再次运行时就显示‘out of memory’
,请问该如何释放内存?
procedure TFormGprs.GetDbMeterCopyInfo(s:string);
var
i : integer;
gprsnotemp :string;
mq:string;
begin
//s:='';
with DM_Info.SQLQueryPrjCopy do begin
Close;
Sql.clear;
sql.Add('SELECT METER_NO,GPRS_NO,COPYPRJNAME,SPOT_NO,GprsModemFlag,MoneyType,Cos,type,ver,ReadStep,SetFlag FROM T_METER_INFO '+ s +' order by GPRS_NO, Line_No,area_no');
try
Open;
First;
except
end;
nMeterNum := 0; i := 0; nCceNum := 0;
if s='' then s:=' where ' else s:=s+' and ';
while not Eof do begin
application.ProcessMessages ;
Inc(nMeterNum);
Inc(nCceNum);
SetLength(sGprsNo, nMeterNum);
SetLength(sMeterNo, nMeterNum);
SetLength(sGprsModem,nMeterNum);
SetLength(sDCUVER, nMeterNum);
SetLength(sSpotName, nMeterNum);
SetLength(sLst645CmdArray, nMeterNum);
SetLength(sLstGprsCmdArray, nMeterNum);
setlength(sDcuMeterNum,nMeterNum);
Setlength(sLstModemCmdArray,nMeterNum);
Setlength(nNoCopyPoint,nMeterNum);
Setlength(sReadStep,nMeterNum);
Setlength(sSetFlag,nMeterNum);
SetLength(kOrder,nMeterNum);
SetGridSize(StringGridCopyInfo, nMeterNum + 1, 7); //行数,列数 sGprsNo[i] := FieldByName('Gprs_No').AsString;
sGprsModem[i] := FieldByName('GprsModemFlag').AsString;
sDCUVER[i]:=FieldByName('Ver').AsString;
sMeterNo[i] := FieldByName('Meter_No').AsString;
sSpotName[i] := FieldByName('Spot_No').AsString;
sReadStep[i]:= FieldByName('ReadStep').AsString;
sSetFlag[i]:= FieldByName('SetFlag').AsString; SetGridCopyInfoData(StringGridCopyInfo, sSpotName[i], sGprsNo[i], sMeterNo[i], sGprsModem[i], i); with DM_Info.SQLQuery1 do begin
Close;
Sql.clear;
//mq:= 'SELECT meter_no FROM T_METER_INFO '+ s +' GPRS_NO='''+ sGprsNo[i]+''' order by GPRS_NO, Line_No,area_no';
sql.Add('SELECT meter_no FROM T_METER_INFO '+ s +' GPRS_NO='''+ sGprsNo[i]+''' order by GPRS_NO, Line_No,area_no');
try
Open;
First;
except
end;
sDcuMeterNum[i]:=DM_Info.SQLQuery1.RecordCount;
close;
end; sLst645CmdArray[i] := TStringList.Create;
sLst645CmdArray[i].Add('Link-DCU');
sLstGprsCmdArray[i] := TStringList.Create;
nNoCopyPoint[i]:= TStringList.Create;
if sGprsModem[i]='GPRS' then begin
sLstGprsCmdArray[i].Add(Generic645Bauds1200(sGprsNo[i])); //S485-00
sLstGprsCmdArray[i].Add(GenericVer(sGprsNo[i])); //Ver
end
else begin
sLstGprsCmdArray[i].Add('');
sLstGprsCmdArray[i].Add('');
end; nNoCopyPoint[i].Add ('0');
nNoCopyPoint[i].Add ('0'); //根据抄表方案取得抄表命令列表
DM_Info.SQLQueryPrj.Close;
DM_Info.SQLQueryPrj.Prepared := True;
DM_Info.SQLQueryPrj.Params[0].Value := FieldByName('CopyPrjName').AsString;
try
DM_Info.SQLQueryPrj.Open;
except
end;
kOrder[i]:=2;
DM_Info.SQLQueryPrj.First;
while not DM_Info.SQLQueryPrj.Eof do begin
sLst645CmdArray[i].Add(DM_Info.SQLQueryPrj.FieldByName('DI').AsString);
if sGprsModem[i]='GPRS' then
sLstGprsCmdArray[i].Add(Generic645RdCmd(sGprsNo[i], sMeterNo[i], DM_Info.SQLQueryPrj.FieldByName('DI').AsString));
if sGprsModem[i]='以太网' then
sLstGprsCmdArray[i].Add(Generic645RdCmd('', sMeterNo[i], DM_Info.SQLQueryPrj.FieldByName('DI').AsString));
if sGprsModem[i]='串口' then begin
sLstGprsCmdArray[i].Add(Generic645RdCmd('', sMeterNo[i], DM_Info.SQLQueryPrj.FieldByName('DI').AsString));
sLstModemCmdArray[i,kOrder[i]]:= OnsendCmd;
end;
nNoCopyPoint[i].Add ('0'); inc(kOrder[i]);
DM_Info.SQLQueryPrj.Next;
end;
DM_Info.SQLQueryPrj.Close;
Inc(i);
Next;
StatusBarGprs.Panels[0].Text :=inttostr(i);
end; end;
DM_Info.SQLQueryPrjCopy.Close;
end;
,请问该如何释放内存?
procedure TFormGprs.GetDbMeterCopyInfo(s:string);
var
i : integer;
gprsnotemp :string;
mq:string;
begin
//s:='';
with DM_Info.SQLQueryPrjCopy do begin
Close;
Sql.clear;
sql.Add('SELECT METER_NO,GPRS_NO,COPYPRJNAME,SPOT_NO,GprsModemFlag,MoneyType,Cos,type,ver,ReadStep,SetFlag FROM T_METER_INFO '+ s +' order by GPRS_NO, Line_No,area_no');
try
Open;
First;
except
end;
nMeterNum := 0; i := 0; nCceNum := 0;
if s='' then s:=' where ' else s:=s+' and ';
while not Eof do begin
application.ProcessMessages ;
Inc(nMeterNum);
Inc(nCceNum);
SetLength(sGprsNo, nMeterNum);
SetLength(sMeterNo, nMeterNum);
SetLength(sGprsModem,nMeterNum);
SetLength(sDCUVER, nMeterNum);
SetLength(sSpotName, nMeterNum);
SetLength(sLst645CmdArray, nMeterNum);
SetLength(sLstGprsCmdArray, nMeterNum);
setlength(sDcuMeterNum,nMeterNum);
Setlength(sLstModemCmdArray,nMeterNum);
Setlength(nNoCopyPoint,nMeterNum);
Setlength(sReadStep,nMeterNum);
Setlength(sSetFlag,nMeterNum);
SetLength(kOrder,nMeterNum);
SetGridSize(StringGridCopyInfo, nMeterNum + 1, 7); //行数,列数 sGprsNo[i] := FieldByName('Gprs_No').AsString;
sGprsModem[i] := FieldByName('GprsModemFlag').AsString;
sDCUVER[i]:=FieldByName('Ver').AsString;
sMeterNo[i] := FieldByName('Meter_No').AsString;
sSpotName[i] := FieldByName('Spot_No').AsString;
sReadStep[i]:= FieldByName('ReadStep').AsString;
sSetFlag[i]:= FieldByName('SetFlag').AsString; SetGridCopyInfoData(StringGridCopyInfo, sSpotName[i], sGprsNo[i], sMeterNo[i], sGprsModem[i], i); with DM_Info.SQLQuery1 do begin
Close;
Sql.clear;
//mq:= 'SELECT meter_no FROM T_METER_INFO '+ s +' GPRS_NO='''+ sGprsNo[i]+''' order by GPRS_NO, Line_No,area_no';
sql.Add('SELECT meter_no FROM T_METER_INFO '+ s +' GPRS_NO='''+ sGprsNo[i]+''' order by GPRS_NO, Line_No,area_no');
try
Open;
First;
except
end;
sDcuMeterNum[i]:=DM_Info.SQLQuery1.RecordCount;
close;
end; sLst645CmdArray[i] := TStringList.Create;
sLst645CmdArray[i].Add('Link-DCU');
sLstGprsCmdArray[i] := TStringList.Create;
nNoCopyPoint[i]:= TStringList.Create;
if sGprsModem[i]='GPRS' then begin
sLstGprsCmdArray[i].Add(Generic645Bauds1200(sGprsNo[i])); //S485-00
sLstGprsCmdArray[i].Add(GenericVer(sGprsNo[i])); //Ver
end
else begin
sLstGprsCmdArray[i].Add('');
sLstGprsCmdArray[i].Add('');
end; nNoCopyPoint[i].Add ('0');
nNoCopyPoint[i].Add ('0'); //根据抄表方案取得抄表命令列表
DM_Info.SQLQueryPrj.Close;
DM_Info.SQLQueryPrj.Prepared := True;
DM_Info.SQLQueryPrj.Params[0].Value := FieldByName('CopyPrjName').AsString;
try
DM_Info.SQLQueryPrj.Open;
except
end;
kOrder[i]:=2;
DM_Info.SQLQueryPrj.First;
while not DM_Info.SQLQueryPrj.Eof do begin
sLst645CmdArray[i].Add(DM_Info.SQLQueryPrj.FieldByName('DI').AsString);
if sGprsModem[i]='GPRS' then
sLstGprsCmdArray[i].Add(Generic645RdCmd(sGprsNo[i], sMeterNo[i], DM_Info.SQLQueryPrj.FieldByName('DI').AsString));
if sGprsModem[i]='以太网' then
sLstGprsCmdArray[i].Add(Generic645RdCmd('', sMeterNo[i], DM_Info.SQLQueryPrj.FieldByName('DI').AsString));
if sGprsModem[i]='串口' then begin
sLstGprsCmdArray[i].Add(Generic645RdCmd('', sMeterNo[i], DM_Info.SQLQueryPrj.FieldByName('DI').AsString));
sLstModemCmdArray[i,kOrder[i]]:= OnsendCmd;
end;
nNoCopyPoint[i].Add ('0'); inc(kOrder[i]);
DM_Info.SQLQueryPrj.Next;
end;
DM_Info.SQLQueryPrj.Close;
Inc(i);
Next;
StatusBarGprs.Panels[0].Text :=inttostr(i);
end; end;
DM_Info.SQLQueryPrjCopy.Close;
end;
Create <=> Free
New(P) <=> Despose(P)
GetMem(P, 256) <=> FreeMem(P, 256)
P := GetMemory(256) <=> FreeMemory(P)
SetLength(s, 256) <=> SetLength(s, 0)
它们的实际分配长度总共是多少?