用函數返回一個TStringList類型的值﹐正確的應該怎么做﹖(30分)

  • 主题发起人 主题发起人 dadabox
  • 开始时间 开始时间
D

dadabox

Unregistered / Unconfirmed
GUEST, unregistred user!
function test:TStringList;
begin
; Result:=TStringList.Create;
; Result.add('aaa');
; Result.add('aaa');
; Result.add('aaa');
; Result.add('aaa');
; //可怎么釋放掉呢﹖誰能給我一個解釋﹖
end;
凡是要函數返回物件﹐或其他類型的﹐該怎么寫是正確的﹐給出一個例子和解釋。謝謝﹗
 
试试这样.
function ;test(slTemp :TStringList): TStringList;
var
; ss : TStringList;
begin
; ss := TStringList.Create;
; ss.Add('aaaaa');
; ss.Add('bbbbb');
; slTemp.AddStrings(ss);
; ss.Free;
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
var
; slTmp : TStringList;
begin
; slTmp := TStringList.Create;
; test(slTmp);
; caption := slTmp.Strings[0]+' '+slTmp.Strings[1];
; slTmp.Free;
end;
 
使用
function ;test(var slTemp :TStringList);
begin
; slTemp.Add('aaaaa');
; slTemp.Add('bbbbb');
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
var
; slTmp : TStringList;
begin
; slTmp := TStringList.Create;
; test(slTmp);
; caption := slTmp.Strings[0]+' '+slTmp.Strings[1];
; slTmp.Free;
 
TO:yanlei
好象和我的一样。
不过,函数必须要有返回类型。
你的回复是错误的。
 
樓上兩位大哥﹐你們那叫函數嗎﹖哪位大俠快來吧﹐這可算得上是一個簡單問題喲。
 
function test:TStringList;
begin
; Result:=TStringList.Create;
; Result.add('aaa');
; Result.add('aaa');
; Result.add('aaa');
; Result.add('aaa');
; //可怎么釋放掉呢﹖誰能給我一個解釋﹖
end;

procedure TestList;
var list : TStringList;
begin
; List := Test;
; try
; ; // do something
; finally
; ;List.Free;
; end;
end;
 
你要什么参数?
你认为的函数是怎样的?

呵呵
 
我的做法,以下是我写的一个挺实用的函数,供大家参考,它是通过变量的方式来返回TStringList值的。
以下代码在D4、5+Windows95/98/2000/NT下调试运行通过
function CheckSite(const Str, Ch: string; var Mystring: TStrings): boolean;
{字符串Str以Ch分隔成几段小字符串,该函数是将这些小字符串提取出来并保存在MyString中}
var
; sit, n ; ; ; ; ; ;: integer;
; S ; ; ; ; ; ; ; ; : string;
begin
; Result := True;
; MyString.Clear;
; S := Str;
; n := Length(Ch);
; while True do
; ; begin
; ; ; if Pos(Ch, S) = 0 then
; ; ; ; begin
; ; ; ; ; MyString.Add(S);
; ; ; ; ; Break;
; ; ; ; end;
; ; ; sit := Pos(Ch, S);
; ; ; MyString.Add(Copy(S, 1, sit - 1));
; ; ; S := Trim(Copy(S, sit + n, Length(S)));
; ; end;
; if MyString.Count < 2 then Result := False;
end;
 
to wind2000﹐可是你的還是在使用的參數改掉的TStrings呀﹐我是問的如何傳回一個TStrings﹐
請再賜教。
function test:TStringList;
begin
; Result:=TStringList.Create;
; Result.add('aaa');
; Result.add('aaa');
; Result.add('aaa');
; Result.add('aaa');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
; ListBox1.Items:=Test;//這是希望這樣來得到TStringList﹐如果在過程中修改TStringList等等﹐我會
end;
強調一點﹐我要通過Function的傳回參數傳回一個TStringList類型﹐但擔心沒有釋放掉。
因為我在函數中生成了TStringList后﹐要在哪兒釋放掉﹖如果這個方法不正確﹐請告訴我
正確的方法。難道要傳回物件等都不能用Function返回嗎﹖
 
to dadabox:
我知道你的意思,不过你可以这样用啊
var
; MyList : TStrings;
begin
; MyList := TStringList.Create;
; CheckSite(str,ch,MyList);//函数见我上面贴的
; ListBox1.Items:=MyList; //这样和你的要求不是也一样吗?
......
end;
 
[:D][:D]That is function[:D][:D]

function mystringList:tstringlist;
var
mysl:tstringList;
begin
; mysl:=TstringList.Create ;
; mysl.Add ('aaa');
; mysl.Add ('bbb');
; mysl.Add ('ccc');
; result:=mysl;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
listbox1.Items :=mystringList;

end;
 
to wind2000:
; ;我不是不知道怎么傳參數達到目的﹐而是問能不能這樣定義函數﹐如果能﹐那么里面的
資源怎樣釋放﹖是這個意思。要說出道理。

to jixiangruyi:
; 像你這樣定義﹐我會。那么你的mysl怎么釋放呢﹖雖說他只一個局部變量﹐但是你result
回來的還是他的地址。你要是在函數中釋放﹐肯定出錯。怎么辦﹖

哪位大俠告訴我﹗我要例子和解釋。
 
functon 結束時自己釋放,因為mysl的作用域是function mystringlist,生存期是
僅在[red]函數被執行時[/red][:)]!!
 
to jixiangruyi:
; ;能不能來段依據﹐我就是要依據。分數不夠可以加。你說自動釋放掉了﹐那么為何在函
數中Free掉不行呢﹖而且Result回來的就是用的函數中mysl的地址﹐怎么解釋呢﹖來段依據
吧﹐讓我心服口服。如果精彩﹐我一定再加分。
 
看看以下代码,不知道你满意不!

unit Unit1;

interface

uses
; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
; Dialogs, StdCtrls;

const
; WM_GetSL = WM_USER + 1;
type
; TForm1 = class(TForm)
; ; Button1: TButton;
; ; ListBox1: TListBox;
; ; procedure Button1Click(Sender: TObject);
; private
; ; function ;test: TStringList;
; ; procedure GetSL(var Msg : TMessage);message WM_GetSL;
; public
; ; { Public declarations }
; end;

var
; Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.GetSL(var Msg : TMessage);
begin
; listbox1.Items.Add(pchar(Msg.LParam));
end;

function ;TForm1.test: TStringList;
var
; ss : TStringList;
; i : integer;
begin
; ss := TStringList.Create;
; ss.Add('aaaaa');
; ss.Add('bbbbb');
; for i := 0 to ss.Count-1 do
; begin
; ; sendmessage(self.handle,WM_GetSL,0,lparam(pchar(ss.Strings)));
; end;
; ss.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
; test;
end;


end.
 
不满意,我要的是告诉我能不能直接传回TStringList或其他物件的值,而不是变相的去做。
如果只要达到这个目的的话,我可以用传参数的方法就可以解决了。
我是想问问各位专家,这样做理论上行不行,实际中又应该怎样做。无论行与不行,都给出
解释。这下你们清楚我的意思了吧?谢谢前面答题的各位朋友,如果这个问题能够得到圆满
解决,我会额外拿分的答谢的。谢谢!请继续!
 
我不是专家。分也不算什么。
unit Unit1;

interface

uses
; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
; Dialogs, StdCtrls;

type
; TForm1 = class(TForm)
; ; Button1: TButton;
; ; ListBox1: TListBox;
; ; procedure Button1Click(Sender: TObject);
; private
; ; function ;test: TStringList;
; public
; ; { Public declarations }
; end;

var
; Form1: TForm1;

implementation

{$R *.dfm}

function ;TForm1.test: TStringList;
var
; ss : TStringList;
begin
; ss := TStringList.Create;
; ss.Add('aaaaa');
; ss.Add('bbbbb');
; result := ss;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
; ss : TStringList;
begin
; ss := test;
; listbox1.Items := ss;
; ss.Free;
end;

end.
 
to Dadabox: ;怎么不可以啊? 看我的
function test:TStringList;
var
; ss:TStringlist;
begin
; ss:=TStringList.Create;
; ss.add('aaa');
; ss.add('aaa');
; ss.add('aaa');
; Result=ss;
end;
在外部释放就可以
调用如下:
procedure TForm1.Button1Click(Sender: TObject);
var
; slist:TStringlist;
; i:integer;
begin
; sList:=test;
; for i:=0 to slist.count-1 do
; listbox1.items.add(slist.strings);
; ss.free;
end;
看看满足你的要求没有,给分吧

;
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=663100
 
后退
顶部