关于addobject出的错,帮忙看看(100分)

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

thedream

Unregistered / Unconfirmed
GUEST, unregistred user!
//按纽1按下
var
a:string
begin
a:=form1.caption;
listbox1.items.addobject('aaaa',tobject(a));
a:=form1.name;
listbox1.items.addobject('bbbb',tobject(a));
a:='test';
listbox1.items.addobject('cccc',tobject(a));
end;
//按纽2按下
begin
showmessage(string(listbox1.items.objects[listbox1.itemindex]));
end;
问题:
为什么,我选中第一项的时候,按下按扭2会显示乱码,而选中第二,三项的时候正常
 
因为对象已经释放,声明为不同的全局变量!!!!!!

var
a,b,c:string ;
procedure TForm1.Button1Click(Sender: TObject);
begin
a:=form1.caption;
listbox1.items.addobject('aaaa',tobject(a));
b:=form1.name;
listbox1.items.addobject('bbbb',tobject(b));
c:='test';
listbox1.items.addobject('cccc',tobject(c));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
showmessage(string(listbox1.items.objects[listbox1.itemindex]));
end;
 
thedream:
你的Caption和Form.Name应该是一样的吧?
如果不一样,这个就没有问题了

另外实际上的并不是如jsxjd所说的因为对象释放这个原因引起的,不过用jsxjd的方法可以解决你的问题的
引起这个的原因是关于Delphi的编译器的工作原理的
 
to 青萍
caption 和 name一样和不一样,都会有问题

to jsxjd
可是为什么caption不行,而name却行呢?
另,还有地方不明白,已经释放了的话,那第二项和第三项怎么可以正常显示出来呢
 
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.
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
461
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
551
import
I
后退
顶部