用户名:  密码:   
您当前的位置:首页 > 程序设计 >  Delphi > 

函数返回值为TStringlist时如何创建与释放

上次修改时间: 2024-09-18 14:36:12      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\Delphi语言\Delphi相关\      下一页

函数返回值为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;