全局Tlist输出结构体错误

younerest 2011-11-11 10:59:19
请教大虾们个问题:在程序中我定义一个结构体MyRecord和一个全局的Tlist;
type
MyRecord = record
Code: String;
Name: string;
Age: Integer;
end;

var
list:TList;
在窗体的OnCreate事件中初始化list list:=TList.create;
在一个button1的单击事件中给list赋值:
procedure TForm1.Button1Click(Sender: TObject);
var
col,rol:MyRecord;
i:Integer;
begin
col.Code:='1';
col.Name:='张三';
col.Age:=22;

rol.Code:='2';
rol.Name:='李四';
rol.Age:=23;

list.Add(@col);
list.Add(@rol);
end;

然后点击另一个button2,输出list中的值就会出错,提示access violation at address,请大虾们帮我看看是什么原因:
procedure TForm1.Button2Click(Sender: TObject);
var
i:Integer;
begin
for i:=0 to list.Count-1 do
begin
ShowMessage(MyRecord((list.Items[i])^).name);
end;
end;
...全文
140 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
谢谢,我也学到了。我用的D7。QQ交流一下:472231001
kaikai_kk 2011-11-11
  • 打赏
  • 举报
回复
type
PMyRecord =^ MyRecord;
MyRecord = record
Code: String;
Name: string;
Age: Integer;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
col:PMyRecord;
i:Integer;
begin
new(col);
col^.Code:='1';
col^.Name:='张三';
col^.Age:=22;
list.Add(col);

new(col);
col^.Code:='2';
col^.Name:='李四';
col^.Age:=23;
list.Add(col);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i:Integer;
begin
for i:=0 to list.Count-1 do
begin
ShowMessage(PMyRecord(list.Items[i])^.name);
end;
end;
bambuz 2011-11-11
  • 打赏
  • 举报
回复
增加一个指针类型定义:
PMyRecord = ^MyRecord;

ShowMessage(PMyRecord(list.Items[i])^.name); //这里改一下
s11ss 2011-11-11
  • 打赏
  • 举报
回复
释放的时候用dispose(PMyRecord(list.Items[i]));

你的方式是操作栈,而且还是局部的,所以出错;在你的代码中用你的方式的时候,应当使用全局的变量。

而典型的方式是操作堆,正如我改过后的代码。
liyangliyang001 2011-11-11
  • 打赏
  • 举报
回复
上楼说的就对,你就照办吧,就行
s11ss 2011-11-11
  • 打赏
  • 举报
回复
type
PMyRecord = ^MyRecord;
MyRecord = record
Code: String;
Name: string;
Age: Integer;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
col,rol:PMyRecord;
i:Integer;
begin
New(col);
col.Code:='1';
col.Name:='张三';
col.Age:=22;

New(rol);
rol.Code:='2';
rol.Name:='李四';
rol.Age:=23;

list.Add(col);
list.Add(rol);
end;


procedure TForm1.Button2Click(Sender: TObject);
var
i:Integer;
begin
for i:=0 to list.Count-1 do
begin
ShowMessage(PMyRecord(list.Items[i])^.name);
end;
end;


lhy 2011-11-11
  • 打赏
  • 举报
回复
你的col,rol都是局部变量,在Button1Click结束后空间都被释放了。
younerest 2011-11-11
  • 打赏
  • 举报
回复
谢谢各位的热心解答。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧