我有两个窗口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的,我都试过,都是不行的

解决方案 »

  1.   

    Image[Rec_count]:= Timage.Create(Self);就行了然后在Onclose中写
    Action :=caFree;
      

  2.   

    回楼上的,试了一下不行,如果在Form2的 Onclse 加 Action :=caFree;则在关闭Form2的时候就已经出现  Invalid pointer operation 的提示在Form1加则在关 Form1的时候出现Invalid pointer operation
      

  3.   

    我一般都这样搞: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;
      

  4.   

    应该是
             Except
               Image[i].free;
             end;
      

  5.   

    其实如果只是显示,这样更好一些:
    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;