看下面这个程序,
procedure TF7_proverb.FormCreate(Sender: TObject);
var sss:Tstringlist;iii:integer;
begin
sss:=Tstringlist.Create;
try
sss.Assign(SplitString (AdoqueryA['widths'],','));
for iii:=0 to sss.Count-1 do
begin
dbgrid1.columns[iii].Width:=strtoint(sss.Strings[iii]);
end; { }
finally
sss.Free;
end;
end;
function TF7_proverb.SplitString(Source,Deli:string):TStringList;//²ð·Ö×Ö·û´®º¯Êý
var
EndOfCurrentString:byte;
StringList:TStringList;
begin
StringList:=TStringList.Create;
try
while Pos(Deli,Source)>0 do
begin
EndOfCurrentString:=Pos(Deli,Source);
StringList.add(Copy(Source,1,EndOfCurrentString-1)); //Ìí¼ÓÏîÄ¿
Source:=Copy(Source,EndOfCurrentString+length(Deli),length(Source)-EndOfCurrentString); //¼õÈ¥ÒÑÌí¼ÓÏîºÍ·Ö¸ô·û
end;
StringList.Add(source); //Èç¹û²»´æÔÚ·Ö¸ô·ûʱ£¬Ö±½Ó×÷ΪÏîÄ¿Ìí¼Ó
Result:=StringList; //ÉèÖ÷µ»ØÀàÐÍ
finally
// StringList.Free;
end;
end; 运行后提示This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer): 5 - 12 bytes: String x 4, Unknown x 1
45 - 52 bytes: TStringList x 1
53 - 68 bytes: Unknown x 1
procedure TF7_proverb.FormCreate(Sender: TObject);
var sss:Tstringlist;iii:integer;
begin
sss:=Tstringlist.Create;
try
sss.Assign(SplitString (AdoqueryA['widths'],','));
for iii:=0 to sss.Count-1 do
begin
dbgrid1.columns[iii].Width:=strtoint(sss.Strings[iii]);
end; { }
finally
sss.Free;
end;
end;
function TF7_proverb.SplitString(Source,Deli:string):TStringList;//²ð·Ö×Ö·û´®º¯Êý
var
EndOfCurrentString:byte;
StringList:TStringList;
begin
StringList:=TStringList.Create;
try
while Pos(Deli,Source)>0 do
begin
EndOfCurrentString:=Pos(Deli,Source);
StringList.add(Copy(Source,1,EndOfCurrentString-1)); //Ìí¼ÓÏîÄ¿
Source:=Copy(Source,EndOfCurrentString+length(Deli),length(Source)-EndOfCurrentString); //¼õÈ¥ÒÑÌí¼ÓÏîºÍ·Ö¸ô·û
end;
StringList.Add(source); //Èç¹û²»´æÔÚ·Ö¸ô·ûʱ£¬Ö±½Ó×÷ΪÏîÄ¿Ìí¼Ó
Result:=StringList; //ÉèÖ÷µ»ØÀàÐÍ
finally
// StringList.Free;
end;
end; 运行后提示This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer): 5 - 12 bytes: String x 4, Unknown x 1
45 - 52 bytes: TStringList x 1
53 - 68 bytes: Unknown x 1
最后所有对象要
xxx.free;
xxx:=nil;
字符串string要
xxx:='';可能这样更加干净吧。
建议TStringList变量的创建和释放放在SplitString函数外面做。
procedure TF7_proverb.SplitString(Source,Deli:string; var AList:TStringList);
var
EndOfCurrentString:byte;
begin
try
while Pos(Deli, Source)>0 do
begin
EndOfCurrentString := Pos(Deli, Source);
AList.add(Copy(Source, 1, EndOfCurrentString - 1));
Source:=Copy(Source, EndOfCurrentString + length(Deli), length(Source) - EndOfCurrentString);
end;
AList.Add(source);
except
end;
end;
调用:var
AList: TStringList;
begin
AList := TStringList.Create;
try
SplitString('......', '..', AList);
......
finally
AList.Free;
end;
end;
一般采用这种形式
var
ListName : TStringList;
begin
ListName := TStringList.Create;
try
//代码
Finally
ListName.Free; //释放ListName
ListName := nil ;
End;
end;