关于TStrings的问题(100分)

  • 主题发起人 TheMayDay
  • 开始时间
T

TheMayDay

Unregistered / Unconfirmed
GUEST, unregistred user!
我想由一个单元向另外的一个单元的函数传递一个TStrings的变量,但传过去之后一
使用就会出现地址错误,而把它做为返回值也不行,请高手们指点。后来我在另外一个单元
里面的interface下定义了一个全局的TStrings,然后在这个单元的函数里使用,也是出现
了地址错误,不知道为什么?
 
Create过吗?
 
我是这样写的:

代码:
function fun(var Value: TStrings): Boolean;
begin
  .......// some code
end;

var
  s: TStrings;
begin
  s := TStringList.Create();
  if fun(s) then
    ......  // some code
  s.free();
end;

但我不知道为什么是 TStringList.Create();还请高手指教。
 
提个醒,在引用另外单元的时候要保证此单元已运行,如Form已打开。
否则很容易出现上述现象
 
完全可以的,你的代码有问题!!!!!!!!!!!!!
如果你要对参数 TStrings 修改,注意在变量声明前加 var
 
请把你对TString的用法或运行时的出错信息贴出来。
 
[green]function fun(var Value: TStrings): Boolean;
begin
.......// some code
end;[/green]

=====================

function fun(var: TStringList): Boolean;
[red]^^^^^^^^^^^[/red]
begin
.......// some code
end;
 
不要用Tstrings
要用TStringlist
 
把你的代码贴出来看看吧
 
按照书上的说法,tstrings是一个“虚对象”,不能直接引用和create,必须用tstringlist
 
那我的代码应该是没有问题的咯?

TStrings 和 TStringList 是什么关系?
 

function fun(var Value: TStrings): Boolean;
begin
.......// some code
end;

var
s: TStrings;
begin
s := TStringList.Create();
if fun(s) then
...... // some code
s.free();
end;

上面的代码应该把 create 和 free 去掉!!!!!
由调用程序负责创建和释放 TStrings 对象。
否则你这样返回的是空的。因为你在函数退出时已经释放了对象。
 
jsxjd: 你可能没有看清楚,我也没写清楚。代码是这样的:

function fun(var Value: TStrings): Boolean;
begin
.......// some code
end;

procedure XXX.click();
var
s: TStrings;
begin
s := TStringList.Create();
if fun(s) then
...... // some code
s.free();
end;
 
同意 jsxjd
 
你有没有在函数内对s 进行了赋值的?
如果有,是要出问题的!
 
我可没出一点问题的!

function fff(var s:tstrings):boolean;
begin
s.Add('aaa1');
// s:=nil;
if s.Count >0 then
result:=true
else
result:=false;
end;

procedure TForm1.Button1Click(Sender: TObject);
var s:tstrings;
begin
s:=tstringlist.Create ;
if fff(s) then
showmessage(s.Strings[0]);
s.free;

end;
 
Tstrings是一个抽象类,抽象类不能被实例化的,所以不能创建一个Tstrings的对象,
TstringList是Tstrings的派生类,对其父类的抽象对象进行了重载!
 
哦,明白了。谢谢 firstkkk
 
多人接受答案了。
 
顶部