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

  • 主题发起人 主题发起人 jbas
  • 开始时间 开始时间
》》添加两个数据进一个item,但不能有相同的data(addobject中的object),
说明白点,两个数据进一个item是什么意思?不能有相同的data是什么意思?
 
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;
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure ListBox1Click(Sender: TObject);
procedure FormClose(Sender: TObject
var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

type
PListItem = ^TMyListItem;
TMyListItem = record
s1,s2: string
//或是其它类型的数据。
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
ListItemPtr: PListItem;
begin
new(ListItemPtr);
ListItemPtr.s1 := 's1';
ListItemPtr.s2 := 's2';
listbox1.Items.AddObject('k',TObject(ListItemPtr));
end;


procedure TForm1.ListBox1Click(Sender: TObject);
var ListItemPtr: PListItem;
begin
ListItemPtr:= PListItem(ListBox1.items.Objects[ListBox1.ItemIndex]);
label1.Caption:=ListItemPtr.s1+':'+ListItemPtr.s2;
end;

procedure TForm1.FormClose(Sender: TObject
var Action: TCloseAction);
var
i:integer;
begin
for i := 0 to ListBox1.items.count -1 do
freemem(PListItem(listbox1.Items.Objects));
end;

end.
 
to savenight:
》》添加两个数据进一个item.
我的意思就是在listbox中添加一条item,但这个item可以有两个值。
一个就是listbox1.Items.Text,而另一个就是listbox1.Items.Objects中的值。
》》不能有相同的data是什么意思?
就是那个listbox1中不能有相同的listbox1.Items.Objects
不知我说明白了吗?
to Pipi.大虾:谢谢!通过了!
》》另外你不按我上面的用一个record内含char array,那么所有数据都只能在程序退出的时候被windows释
》》object保存的数据必须是另外申请来的指针类型,而且最后必须自己释放掉。
这两句怎么理解,到底我这里要不要释放呢?
按你的方法,现在是不是不用按zw84611,所说的这样:
procedure TForm1.FormClose(Sender: TObject
var Action: TCloseAction);
var
i:integer;
begin
for i := 0 to ListBox1.items.count -1 do
freemem(PListItem(listbox1.Items.Objects));
end;
来释放内存了?

to zw84611,谢谢了,不过你的代码好象没有检验相同数据的代码!
 
这并不难呀。“检验相同数据的代码”你可以自己加上。
 
to zw84611:
谢谢,我已经加进去了!
谢谢各位!分数有分配不合理的地方请见谅!
 
for i := 0 to ListBox1.items.count -1 do
freemem(PListItem(listbox1.Items.Objects));
还是要的

用PString则会有内存的问题
 
来自:savenight, 时间:2002-5-2 12:32:00, ID:1080523
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;
这是savenight的代码,好象比Pipi.大侠的还要简单,还能让我学了点oop的知识。:)
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1080304

 
后退
顶部