急问一个小问题:Invalid pointer operation

1982fish 2006-08-25 04:58:45
我有两个窗口Form1跟Form2,其中Form1的按钮点击后
procedure TForm1.FlatButton2Click(Sender: TObject);
begin
application.createform(Tform2,form2);
Form2.ShowModal;
end;




Form2里面有个小小的数据库,(Picturename,X,Y三项)用于控制窗口显示的时候载入哪张图片及图片的坐标

Image: array of TImage;


procedure TForm2.FormShow(Sender: TObject);
var
Rec_count:Integer;
begin
with ADOTable1 do
begin
try
First;
while not Eof do
begin
Rec_count:=ADOTable1.RecNo;
Image[Rec_count]:= Timage.Create(nil);
Image[Rec_count].Picture.LoadFromFile('.\Sprite\'+ADOTable1['Sprite_Name']+'.bmp');
Image[Rec_count].Parent:= PaintBox1.Parent;
Image[Rec_count].Left:= ADOTable1['X'];
Image[Rec_count].Top:= ADOTable1['Y'];
Image[Rec_count].Transparent:=true;
Image[Rec_count].Autosize:=true;
Next;
end;
finally
end;
end;
end;

运行结果没问题,但是再退出窗口的时候就问题来了,关第一个窗口的时候没问题,关第二个窗口的时候提示 Invalid pointer operation,我点了确定,再按一次F9,变成了Access violation at address 004C7EFD in module.....

请问是怎么回事哦 ?我想加个
for i:= 1 to MaxRecod1 do
begin
Image[i].free;
end;
但是不知道加在Form1 的FormDestroy还是form2的,我都试过,都是不行的
...全文
906 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
1982fish 2006-08-25
  • 打赏
  • 举报
回复
多谢楼上的,问题解决了

真是读千卷书不如行万里路,行万里路不如贵人相助哈
OO_is_just_P 2006-08-25
  • 打赏
  • 举报
回复
其实如果只是显示,这样更好一些:
procedure TForm2.FormShow(Sender: TObject);
var
Rec_count,i :Integer;
Image: TImage;
begin
with ADOTable1 do
begin
First;
While not AdoTable1.Eof do
begin
With Timage.Create(self) do
Try
Picture.LoadFromFile('.\Sprite\'+ADOTable1['Sprite_Name']+'.bmp');
Parent:= PaintBox1.Parent;
Left:= ADOTable1['X'];
Top:= ADOTable1['Y'];
Transparent:=true;
Autosize:=true;
Except
free;
end;
Next;
end;
end;
end;
OO_is_just_P 2006-08-25
  • 打赏
  • 举报
回复
应该是
Except
Image[i].free;
end;
OO_is_just_P 2006-08-25
  • 打赏
  • 举报
回复
我一般都这样搞:

procedure TForm2.FormShow(Sender: TObject);
var
Rec_count,i :Integer;
Image: array of TImage;
begin
with ADOTable1 do
begin
First;
Rec_count :=ADOTable1.RecordCount;
SetLength(Image,Rec_count);
for I := 0 to Rec_count - 1 do
begin
Image[i]:= Timage.Create(self);
Try
Image[i].Picture.LoadFromFile('.\Sprite\'+ADOTable1['Sprite_Name']+'.bmp');
Image[i].Parent:= PaintBox1.Parent;
Image[i].Left:= ADOTable1['X'];
Image[i].Top:= ADOTable1['Y'];
Image[i].Transparent:=true;
Image[i].Autosize:=true;
finally
Image[i].free;
end;
Next;
end;
end;
end;
1982fish 2006-08-25
  • 打赏
  • 举报
回复
回楼上的,试了一下不行,如果在Form2的 Onclse 加 Action :=caFree;则在关闭Form2的时候就已经出现 Invalid pointer operation 的提示在Form1加则在关 Form1的时候出现Invalid pointer operation
1982fish 2006-08-25
  • 打赏
  • 举报
回复
THX,我这就去试一下
OO_is_just_P 2006-08-25
  • 打赏
  • 举报
回复
Image[Rec_count]:= Timage.Create(Self);就行了

然后在Onclose中写
Action :=caFree;

5,392

社区成员

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

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