怎样让一个函数返回一个tstrings的值?(20分)

  • 主题发起人 主题发起人 ildg
  • 开始时间 开始时间
I

ildg

Unregistered / Unconfirmed
GUEST, unregistred user!
rt,不知道怎样搞定
 
定义时指定不行吗?
function FuncName () :String
begin
Result = 'Your returned string';
end;

不知道你说的是不是这个意思。
 
function FuncName () :TStrings
begin
Result:=TStrings.create;
Result.add( 'Your returned string');
end;

 
以下也许更好一些
procedure FuncName (returnstr:TStrings);
 
非常感谢,呵呵,
我要返回一个TStrings类型的值
而不是一个string类型的值,怎么搞定呢?谢谢
 
张无忌:
我在程序里面也是这样搞的,
用result.create,但由于create了没有释放,
我想问一下这样会不会有内存泄露呢?对不起我
不太懂,呵呵,能不能麻烦你帮我说一下这个,谢谢。

yzhshi:
你说的那个用过程我没看懂,不知道怎么一回事
 
我的代码有问题吗?
 
张无忌的不行吗,我也想知道。
 
hehe,张无忌,我们是同时回的文章,但你比我先发,其实我那篇是
回给峻祁连的,由于他的名字是中文并且很生僻,所以我没敲
 

tempStr:TStringList;
tempStr:=FuncName ('aa');
tempStr.free;
 
就是说尽量在主程序里面创建TStringLIst,然后作为参数传递给子函数,由子函数处理,得出结果后写回去。
编程尽量遵循一个原则:在那里创建的东西,尽量在那里销毁。

var lst: TStringList;
begin
lst:=TStringList.Create;
callfunction(lst);
...
lst.Free;
end;

procedure ( var alst: TStringList)
begin
alst.Add('');
..
end;
 
再次感谢张无忌,我是指在函数的内部:
function FuncName () :TStrings
begin
Result:=TStrings.create;
Result.add( 'Your returned string');
end;
_______用result.create以后并没有释放,
也不可能释放,否则就没法返回值了.这时候
没释放会有问题吗?

 
其实我认为yzhshi的办法应该更好一些,但是VCL原代码里面有一些和我写法相同的代码
我经常看的TServerSocket和TClientSocket里就有类似的代码,
 
指针传递回去,在主程序中释放,应该没有问题。
但是从程序规范性来说,尽量避免这种做法。
使用参数传递完全可以满足需求的。
 
但是你的程序后面必须释放这个资源,还有其实你返回的是一个指针
 
或许编译器会释放内存吧,
毕竟result这个变量比较特殊。
不过我更想清楚地知道到底有没有问题。
 
procedure FuncName (var returnstr:TStrings);
begin
...

end;
 
我以前试过,Tstrings类不能作为参数返回。
后来我用了一个控件TMemo的Lines属性传递参数值,成功!
关注上述问题。
 
定义函数的时候定义一个TString 的变量就行了。
 
jianguobu说的是什么意思?
能说清楚点吗?谢谢
 
后退
顶部