L
LJ868LJ
Unregistered / Unconfirmed
GUEST, unregistred user!
我想用TIDFTP组件做一个FTP工具,发现这个组件的list方法在使用时有点奇怪,这个方法的定义如下:
procedure TIdFTP.List(ADest: TStrings
const ASpecifier: string = ''
const ADetails: boolean = true);
var
LDest: TStringStream;
begin
LDest := TStringStream.Create('');
try
if ADetails then begin
InternalGet(trim('LIST ' + ASpecifier), LDest)
end else begin
InternalGet(trim('NLST ' + ASpecifier), LDest)
end;
FreeAndNil(FDirectoryListing);
if Assigned(ADest) then begin //APR: User can use ListResult and DirectoryListing
ADest.Text := LDest.DataString;
end;
FListResult.Text := LDest.DataString;
finally FreeAndNil(LDest)
end;
end;
这个函数的作用是将FTP服务器的当前目录信息保存在一个TStings对象中,调用这函数时需要提供一个TStrings对象。
问题就出在这里,提供给这个list函数的TStrings对象参数需不需要先对它进行初始化呢?
观察list函数的定义发现list函数中会对用create方法对这个对象参数进行初始化,所以我认为提供给list函数的对象参数事先不用进行初始化,否则会造成内存泄露(刘艺的“面向对象编程思想”中有讲),所以我认为应该用如下方法:
......
var
ls:tstringlist;
begin
.....
.....
ftpclient.List(ls);
.....
end;
但是在运行时出错
先对ls初始化就不不出错了
......
var
ls:tstringlist;
begin
.....
ls:=tstringlist.create;//因为tstrings是虚类,不能创建实例,可以用它的子类来创建实例
ftpclient.List(ls);
.....
end;
procedure TIdFTP.List(ADest: TStrings
const ASpecifier: string = ''
const ADetails: boolean = true);
var
LDest: TStringStream;
begin
LDest := TStringStream.Create('');
try
if ADetails then begin
InternalGet(trim('LIST ' + ASpecifier), LDest)
end else begin
InternalGet(trim('NLST ' + ASpecifier), LDest)
end;
FreeAndNil(FDirectoryListing);
if Assigned(ADest) then begin //APR: User can use ListResult and DirectoryListing
ADest.Text := LDest.DataString;
end;
FListResult.Text := LDest.DataString;
finally FreeAndNil(LDest)
end;
end;
这个函数的作用是将FTP服务器的当前目录信息保存在一个TStings对象中,调用这函数时需要提供一个TStrings对象。
问题就出在这里,提供给这个list函数的TStrings对象参数需不需要先对它进行初始化呢?
观察list函数的定义发现list函数中会对用create方法对这个对象参数进行初始化,所以我认为提供给list函数的对象参数事先不用进行初始化,否则会造成内存泄露(刘艺的“面向对象编程思想”中有讲),所以我认为应该用如下方法:
......
var
ls:tstringlist;
begin
.....
.....
ftpclient.List(ls);
.....
end;
但是在运行时出错
先对ls初始化就不不出错了
......
var
ls:tstringlist;
begin
.....
ls:=tstringlist.create;//因为tstrings是虚类,不能创建实例,可以用它的子类来创建实例
ftpclient.List(ls);
.....
end;