关于:帮忙看看这段代码,为什么出错?(listbox的addobject),再出100分谢谢各位的帮助!(100分)

J

jbas

Unregistered / Unconfirmed
GUEST, unregistred user!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1079881
原来这个问题这么难,再出100分谢谢各位的帮助!
 
TListBox的Items的AddObject是向Items中加入一个字符串,
并且向Items.Objets中加入一个指针,该指针指向一个内存空间,
你现在将一个局部变量的字符串TempStr用
AddObject(TempStr,Tobject(TempPstr))
将TempStr的地址加入Objects中,
显然,TempStr再Button1Click执行后就被销毁了,
这样下一次进入Button1Click事件使用: String(hbDpList.Items.Objects)=TempPstr
就可能发生错误,因为hbDpList.Items.Objects是一个指向被销毁了的内存!
你可以用两个ComboBox,将其中一个的Visible属性设置为False,分别把两个字符串加入:
程序如下:
procedure TForm1.Button1Click(Sender: TObject);
var
I:integer;
TempBl:boolean;
TempStr:string;
TempPstr:string;
begin
TempBl:=true;
TempPstr:=FramDpInfo1.EdtDpbh.Text;
TempStr:=FramDpInfo1.EdtDpName.Text;
for I:=0 to hbDpList.Items.Count-1 do
begin
if hbDpList2.Items=TempPstr then
TempBl:=false;
end;
if TempBl=true then begin
hbDpList.Items.Add(TempStr);
hbDpList2.Items.Add(TempPstr);
end;
end;
 
TMyType=class
name:string;
age:integer;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
exists:boolean;
mydata:TMyType
begin
exists:=false;
mydata :=TMyType.Create;
mydata.name:=edit1.Text;
mydata.age :=strtoint(edit2.Text);

for i:=0 to ListBox1.Items.Count -1 do
if (ListBox1.Items.Objects as TMyType).name =mydata.name then
begin
exists :=true;
break;
end;

if not exists then
ListBox1.Items.AddObject(mydata.name,mydata)
end;

procedure TForm1.FormClose(Sender: TObject
var Action: TCloseAction);
var
i:integer;
begin
for i:=0 to ListBox1.Items.Count -1 do
(ListBox1.Items.Objects as TMyType).Free;
end;
 
谢谢关注!Pipi.大虾有了不用两个listbox就可以的代码!
来自:Pipi., 时间:2002-5-2 11:57:00, ID:1080470
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
u:boolean;
mydata:pMyType;
begin
u:=false;
for i:=0 to listbox1.Items.Count-1 do
begin
if Edit1.Text=PMyType(listbox1.Items.Objects)^.s then
begin
u:=true;
break;
end;
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;


 
to savenight:谢谢!
用类和用record有什么区别呀?
 
大侠:能否再说说
PMyType(listbox1.Items.Objects)和listbox1.items.objects as pmytype
这两种强制类型转换有什么区别呀?
 
其实用什么都一样,不过用对象的话简单一些,因为只用mydata :=TMyType.Create;这一句就搞定内存分配了,
用record的话你得自己搞定内存分配。
 
PMyType(listbox1.Items.Objects) : 这一种不进行类型检查
listbox1.items.objects as pmytype : 这一种进行类型检查
 
其实我个人觉得用对象好一些,很方便。再者,人家的方法名字就是addObject嘛,[:D]
 
感觉学了挺多!
原来类这个东西,还可以这么简单的用在这里,以前总觉的写一个类要create,destory,继承,
加属性,加方法,想不到在这里用的这么简洁。感谢savenight兄的帮助!
 
呵呵~~,要不然为什么面向对象这么流行?
 
顶部