帮忙看看这段代码,为什么出错?(listbox的addobject)(100分)

  • 主题发起人 主题发起人 jbas
  • 开始时间 开始时间
大家分析:
procedure TForm1.Button1Click(Sender: TObject);
var
I:integer;
TempBl:boolean;
TempStr:string;
TempPstr:string;
begin
TempBl:=true;
TempPstr:=Edit1.Text;
TempStr:=Edit2.Text;
for I:=0 to ListBox1.Items.Count-1 do
begin
if string(ListBox1.Items.Objects)=TempPstr then
// if ListBox1.Items=TempStr then
TempBl:=false;
end;
if TempBl=true then
ListBox1.Items.AddObject(TempStr,tobject(TempPStr));
// ListBox1.Items.Add(TempStr);
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
close;
end;

如果去掉Button2控件,则点击三次button1出错,why?bug?
 
你的是d5写的,我的是d6的环境,怎么提示找不到vcl50.不能运行程序。
你的源代码,考到我的d6中,同样的问题,多点几下,就出现cpu窗口。
》》如果去掉Button2控件,则点击三次button1出错,why?bug?
什么意思,我放了button2也同样出错呀!
 
在d6测试过也没问题,
注意:在Project-Options-Packeges,去掉勾
 
发去d6编译程序。
 
重新编译可以了,但是还有你说的问题!
 
莫名其妙的事不少,绕过去能执行就行。
 
可是这个检查功能我是必须的,一定要在一个item中存两个数的。
以前这样没有问题的。
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
s:string;
begin
s:='aa';
listbox1.Items.AddObject('s',tobject(integer(s)));
s:='bb';
listbox1.Items.AddObject('k',tobject(integer(s)));
if listbox1.ItemIndex=-1 then listbox1.ItemIndex:=0;
label1.Caption:=string(listbox1.items.objects[listbox1.ItemIndex]);
end;
现在不知为什么?
 
你给的源码不出错,但结果是不是你的预期?
 
我给的源代码中没有检验的功能,所以不会出错,但我想要有那个检验相同数据的功能
但却总是出错。我真的搞不懂了。谢谢您一直关注!
其他各位也一起帮帮忙呀!
 
原来这个问题这么难,再出100分谢谢各位的帮助!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1080304
 
AddObject(TempStr,tobject(Pchar(TempPStr)))可以么,我没用过!
 
总的来说,string是Delphi自动维护的数据类型,过程内部申明的字串过程结束后就
无效了,对它的引用当然也是非法的,其结果是不可知的。也就是说,有可能工作,
有可能不工作。

具体到你这段代码,TempStr:=Edit1.Text这句,因为内容未做修改,TempStr直接指
向了Edit1.Text的地址,但是Edit1.Text的内容做了改动后,Edit1.Text会指向新的
地址,原来位置的内容被还给了堆,也就是说,那个地址无效了。而你用
Item.AddObject添加进去的string(实际上是个串指针)也就是无效的了。

要解决这个问题,你需要显式地申请内存,然后把串的内容Copy进该地址中。然后将
该地址的指针传给Item.AddObject。
 
object保存的数据必须是另外申请来的指针类型,而且最后必须自己释放掉
比如,
type TMyType=record
s:array[0..nnn]of char
//nnn要足够大,能存放你的字符串长度+1
end;
type PMyType=^TMyType;

var mydata:PMyType;
getmem(mydata,sizeof(TMyType);
strCopy(mydata^.s,PChar(Edit1.Text));
然后添加mydata为object
在某个适当的时候,比如object被替换前、程序结束前,等,必须用FreeMem释放

 
谢谢关注!但这样还不行,你看看哪里错了,谢谢了!
procedure TForm1.Button1Click(Sender: TObject);
type
myt=^string;
var
i:integer;
s,x:string;
u:boolean;
my:^string;
begin
u:=false;
for i:=0 to listbox1.Items.Count-1 do
begin
s:=edit1.Text;
if string(listbox1.Items.Objects)=s then
// if myt(listbox1.Items.Objects)^=myt(s)^ then
u:=true;
end;
if u=false then
begin
new(my);
my^:=edit2.Text;
s:=edit1.Text;
listbox1.items.AddObject(s,tobject(my));
end;
end;
 
到QQ上来说说看吧,584740,给你去了信,你怎么没动静?害得我还得来回答一次,:-)
 
string(listbox1.Items.Objects)是不行的
另外你不按我上面的用一个record内含char array,那么所有数据都只能在程序退出的时候被windows释放
 
to Pipi.:
我试试!
to truecat:
我们这里不能上qq了,现在socks 5被封了。sorry!
 
to truecat:
163的信箱现在总是这样:Error: Session Timeout, please try it later
sorry....
我再试试你们的方法。谢谢了
 
小弟愚昧试不出来,还有错误:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
u:boolean;
mydata:PMyType;
mydata2:pmytype;
begin
u:=false;
for i:=0 to listbox1.Items.Count-1 do
begin
getmem(mydata2,sizeof(TMyType));
strCopy(mydata2^.s,PChar(Edit1.Text));
if listbox1.Items.Objects=tobject(mydata2) then
u:=true;
end;
if u=false then
begin
getmem(mydata,sizeof(TMyType));
strCopy(mydata^.s,PChar(Edit1.Text));
listbox1.items.AddObject(edit2.text,tobject(mydata));
end;

end;
 
后退
顶部