送分啦 TstringList ( 积分: 30 )

  • 主题发起人 主题发起人 Frank.cai
  • 开始时间 开始时间
F

Frank.cai

Unregistered / Unconfirmed
GUEST, unregistred user!
下边的代码中怎样写才能让STRLST1释放后,
strlst2中的内容认识仍然是STRLST1中赋过去的,别告诉我用循环ADD进去
procedure TForm1.Button1Click(Sender: TObject);
var strlst1,strlst2:Tstrings;
begin
strlst1:=Tstringlist.Create;
strlst1.Add('1');
strlst1.Add('2');
strlst2:=strlst1;
strlst1.Free;
showmessage(inttostr(strlst2.count));
end;
 
下边的代码中怎样写才能让STRLST1释放后,
strlst2中的内容认识仍然是STRLST1中赋过去的,别告诉我用循环ADD进去
procedure TForm1.Button1Click(Sender: TObject);
var strlst1,strlst2:Tstrings;
begin
strlst1:=Tstringlist.Create;
strlst1.Add('1');
strlst1.Add('2');
strlst2:=strlst1;
strlst1.Free;
showmessage(inttostr(strlst2.count));
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var strlst1,strlst2:Tstrings;
begin
strlst1:=Tstringlist.Create;
strlst2:=Tstringlist.Create;
strlst1.Add('1');
strlst1.Add('2');
strlst2.CommaText:=strlst1.CommaText;
strlst1.Free;
showmessage(inttostr(strlst2.count));
strlst1.Free;
strlst2.Free;
end;
 
不建就别想保留
 
你没搞错吧?
strlst2:=strlst1;
你把strlst1释放掉了,strlst2怎么还会有东西。

我觉得有点奇怪的是strlst1先释放掉了,strlst2怎么不会出错呢?delphi有时真搞不懂。

var strlst1,strlst2:Tstrings;
begin
strlst1:=Tstringlist.Create;
strlst1.Add('1');
strlst1.Add('2');
strlst2:=Tstringlist.Create;
strlst2.Text:=strlst1.text;
strlst1.Free;
showmessage(inttostr(strlst2.count));
strlst2.Free;
 
strlst2是strlst1的引用
你把strlst1释放了 strlst2保留着引用有去引用谁呢
 
procedure TForm1.btn1Click(Sender: TObject);
var strlst1,strlst2:Tstrings;
begin
strlst1:=Tstringlist.Create;
strlst2:=Tstringlist.Create;//你为什么不创建呢?
strlst1.Add('1');
strlst1.Add('2');
strlst2.Assign(strlst1);
strlst1.Free;
showmessage(inttostr(strlst2.count));
strlst2.free;
end;
 
楼主的代码不可能不出错的,类都没有创建[:D]
100%会read of address。。。[:D]
这样写吧

var
a, b:Tstringlist;
begin
a:=Tstringlist.Create;
b:=Tstringlist.Create;
a.Add('dddd');
b.Assign(a);
a.Free;
showmessage(b.Strings[0]);
b.Free;
end;
 
Tstringlist.Create;这个谁都知道。

TO:Avalon,
一般情况下,如果strlst2是strlst1的引用,那么释放了strlst1以后它引用的是谁呢?那么怎么还能执行showmessage(inttostr(strlst2.count));

这个时候strlst1已经释放,strlst2没有create。
 
无论是strlst2.CommaText:=strlst1.CommaText;还是strlst2.Assign(strlst1);其实看看delphi的Classes单元的源码就知道了,还是将strlst1的内容复制过去,strlst2不是strlst1的引用。
 
to ZYONG
我说的引用指的是楼主最早的那段代码
楼主那段代码执行
showmessage(inttostr(strlst2.count));
就会出问题
你可以吧strlst1.Free;之前
把strlst1和strlst2的首地址取出来看看
 
strlst2.assign(strlst1)
这样就是一个ADD的循环了
 
TO:Avalon,
楼主最早的代码不是这个吗?
var strlst1,strlst2:Tstrings;
begin
strlst1:=Tstringlist.Create;
strlst1.Add('1');
strlst1.Add('2');
strlst2:=strlst1;
strlst1.Free;
showmessage(inttostr(strlst2.count));//我觉得奇怪的是这里居然不出错
end


 
是奇怪
如果这样改var strlst1,strlst2:Tstrings;
begin
strlst1:=Tstringlist.Create;
strlst1.Add('1');
strlst1.Add('2');
strlst2:=strlst1;
showmessage(inttostr(strlst2.count));
strlst1.Free;
showmessage(inttostr(strlst2.count));//出错
end;
 
更怪的
var strlst1,strlst2:Tstrings;
begin
strlst1:=Tstringlist.Create;
strlst1.Add('1');
strlst1.Add('2');
strlst2:=strlst1;
strlst1.Free;
showmessage(inttostr(strlst2.count));//我觉得奇怪的是这里居然不出错
showmessage(inttostr(strlst2.count));//出错了
end

 
很高兴,各位能老大能过来指点,首先声明我的那段代码是能跑得起来的,
只不过是strlst1.Free以前SHOWMESSAGE();的结果是2,strlst1.Free
以后,SHOWMESSAGE()的结果变成0了。我也纳闷的是上边的代码测试的时候为什么没报错。因为我在其他地方出错了,我才搞了上边的代码做测试


我的最初的程序是定义了记录类型
type
mydata = recoder
str1 :string;
str2 :string;
sl :Tstrings;
end;

至于上边问我为什么strlst2没有创建,我的这个SL是记录类型里边的一个字段,我也不知道怎么创建,我现在的目的就是,比如我创建一个临时的TMPSTRLIST,然后想把这个临时的TMPSTRLIST的值赋给记录类型中的SL,完了后还想把TMPSTRLIST释放掉,不知道怎样才能把TMPSTRLIST的值赋到记录类型里去,请各位指点。
 
本身在记录里面放一个不定长的数据类型就是不可行的,类似的处理都应该使用指针。这样在处理中就不需要删除TMPSTRLIST?

把sl编程pointer,TMPSTRLIST创建完成之后,直接付给sl,使用的时候强制转换sl为TStrings。
 
多谢各位,不了解TSTRINGS的话,问题很多啊,以后再请教各位。
散分了,不过太少,实在不好意思啊
 
多人接受答案了。
 
后退
顶部