

函数返回值为TStringlist时
一、关于把TStringlist作为函数的返回值时
当Result为TStringlist时,如函数里使用了Result := TStringList.Create; ,调用时只用var声明即可,不用再初始化,但用完要释放,函数里没创建则调用时要创建
//找出路径列表有,而数据库中没有的返回列表
procedure findup(dbsl,pathsl: TStringList):TStringList;
var
i,j,k:integer;
begin
Result := TStringList.Create; //没上传的列表
try
.....
Result.Add(pathsl[i]);
.....
except
Result.free; //出现异常时可释放,但不能在Finally中释放,否则函数返回结果为空了
end;
end;
//调用方法:
var
dbsl, pathsl, resultList: TStringList; //resultList只需要声明,它是在findup过程中初始化的
begin
dbsl := TStringList.Create;
pathsl := TStringList.Create;
try
// 假设 dbsl 和 pathsl 已经被填充
try
resultList := findup(dbsl, pathsl); //这里的resultList不需初始化,它是在findup中初始化的
try
Memo.Lines.AddStrings(resultList);
finally
resultList.Free; // 但是需要释放resultList,因为在函数里只在异常进才释放,所以这里必须要释放
end;
except
on E: Exception do
begin
ShowMessage('Error: ' + E.Message); // 异常处理
end;
end;
finally
dbsl.Free;
pathsl.Free;
end;
end;
三、关于把TStringlist写为过程的out参数时返回数据时,
1)初始化也是在过程中,释放也时在调用时
procedure findup(dbsl, pathsl: TStringList; out resultList: TStringList);
var
i: Integer;
begin
resultList := TStringList.Create; // 在过程中初始化
try
for i := 0 to pathsl.Count - 1 do // 找出路径列表有,而数据库中没有的
begin
if not IsSubstringInList(pathsl[i], dbsl) then
resultList.Add(pathsl[i]);
end;
except
resultList.Free; //出现异常时也可释放,但不能在Finally中释放,否则返回结果为空了
raise; // 重新抛出异常以供上层处理
end;
end;
//调用方法
var
dbsl, pathsl, resultList: TStringList; //resultList只需要声明,无需初始化
begin
dbsl := TStringList.Create;
pathsl := TStringList.Create;
try
// 假设 dbsl 和 pathsl 已经被填充
// 调用 findup 方法
findup(dbsl, pathsl, resultList); //resultList只需要声明,它是在findup过程中初始化的
Memo.Lines.AddStrings(resultList); //resultList是在findup过程中初始化的
finally
dbsl.Free;
pathsl.Free;
resultList.Free; //resultList在findup中没有释放,所在这里用完必需要释放
end;
end;