改错 ( 积分: 50 )

  • 主题发起人 主题发起人 LUJIAYU110
  • 开始时间 开始时间
L

LUJIAYU110

Unregistered / Unconfirmed
GUEST, unregistred user!
定义一个函数:
function ssss:tstrings;
var
i:integer;
list:tstringlist;
begin
list:=tstringlist.create;
for i:=1 to 10 do
list.add(inttostr(i));
result.assign(list);
list.free;
end;
我现在想用listbox显示Tstrings的内容;
listbox.items.assign(ssss)或
listbox.items:=ssss;都错误.
创建一个list:tstringlist,同样方法赋值,也是错误.
问错在哪?函数有错吧,不求变通的方法,只求原因.
如果函数没错,怎么把值取出来?
 
在ssss函数里加一句result创建的句子
result := ...... //公司不让写代码外发:(,这句你也会写的了,知道了吧
 
result.assign(list);
Result没有被创建
 
只要能够通过编译,当然函数就不会有错,实时函数本身不能够达到楼主的目的而已!
之所以函数不能传出结果,是因为
result.assign(list);
这一句出错了,Result 在没有被创建之前就使用了它的 Assign 方法。
解决方法:改变一下传出结果的方法
procedure TForm1.Button1Click(Sender: TObject);
begin
sssss(ListBox1.Items);
end;

procedure TForm1.sssss(const Alist: TStrings);
var
i: Integer;
begin
for i := 1 to 10 do
AList.Add(IntToStr(i));
end;
 
to liyinwei:谢谢,我知道这种用法
但不知道用我的方法,为什么不行,
to all:
我在
result.assign(list);前用
result:=tstrings.create;
再调用为什么还错,也就是说作为传出值的这种函数形式,该怎么用才行.
原因应该是没创建,可是什么时侯创建呢?希望各位指点,谢谢.
 
因为我看有的贴子,函数传出的是Tstringlist形式,所以我想传出TSTRINGS应该也行
 
>>“再调用为什么还错”
因为正确的创建方法是: Result := TStringList.Create;
TStrings 是抽象类,它的方法需要由派生类来实现,就如 TStringList 。

可行的方法可以如下:
procedure TForm1.Button1Click(Sender: TObject);
var
s: TStrings;
begin
s := ssss;
ShowMessage(s.CommaText);
s.Free;
end;

function TForm1.ssss: TStrings;
var
sList: TStrings;
i: Integer;
begin
sList := TStringList.Create;
for i := 0 to 10 do
sList.Add(IntToStr(i));
Result := TStringList.Create;
Result.Assign(sList);
sList.Free;
end;

但是以 TStrings 作为函数返回的结果,绝对不是一种好的编写函数的方法!
因为怎样使用非常容易造成内存泄漏。
 
谢谢liyinwei,明白了
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
948
import
I
后退
顶部