Delphi7Personal EAccessViolation同时创建源自TImage的组件

时间:2013-06-18 22:42:26

标签: delphi components delphi-7

我有一个在Delphi中创建游戏的任务,因为我想通过从TImage派生我自己的组件来实现它的大小7x7。由于我想在阵列中的所有磁贴的位置,我想使用Create方法来做,但每当我尝试时,我遇到EAccessViolation,同时调用.Create(self)

这是我的组件代码:

        unit iles1;

       interface

         SysUtils, Classes, Controls, ExtCtrls;

type
  Tiles1 = class(TImage)
  private
      FPlayer:Boolean; //determines whether it is an empty field or a player
      FTeam:Boolean;   //determines the team the tile belogns to
      FBall:Boolean;   //posession of the ball
      {FBackLight : whether it is available to interact  with this component,
      with the method on click after one of the tiles has already been chosen,
      if it is not lit but belongs to the same team, it is flagged as chosen
      but not as lit, this field is used to determine whether i can pass a ball
      to this direction or swap places with other player from the same team}
      FBackLight:Boolean;
      FChosen:Boolean; //whether the player decided to click on it
      {FPostion determines where it is in a table, it ranges from
      36 to 0 where  its position divided by 10 determines the column
      and position mod 10 determines the row}
      FPosition:Byte;
    { Private declarations }
  protected
    { Protected declarations }
  public
     constructor Create(AOwner : TComponent);  override;
    { Public declarations }
  published
     property Team: boolean
        read FTeam
        write FTeam;
     property Ball: boolean
       read FBall
       write FBall;
     property Player:boolean
       read FPlayer
       write FPlayer;
     property BackLight:boolean
       read FBackLight
       write FBackLight;
     property Chosen:boolean
      read FChosen
      write FChosen;
     property Position:byte
      read FPosition
      write FPosition;
     end;

    { property Ball: Boolean;
     //read FHasBall
     //write FSetBall;
     end;}
    { Published declarations }

procedure Register;

implementation
procedure Register;
begin
  RegisterComponents('Samples', [Tiles1]);
end;

{Creator procedure calling the Timage creator
and setting parent to self(impossible here, then i will do it in
 main window), visible to true
}
constructor Tiles1.Create(AOwner:TComponent); 
begin
  inherited;
   FPlayer:=false;
   FTeam:=false;
   FBall:=false;
   FBackLight:=false;
   FChosen:=false;
   FPosition:=0;
 end;
end.

这里我有我的主菜单方法使用它:

procedure TForm1.FormCreate(Sender: TObject);
var x,y:Integer;
begin
  for y:=1 to INAROW do begin
    for x:=1 to INAROW do begin
      tiles[x,y].Create(self);
      tiles[x,y].Parent:=self;
      tiles[x,y].Visible:=true;
      tiles[x,y].Top:=(y-1)*(GAPBETWEEN+TILES1HEIGHT)+GAPTOP;
      tiles[x,y].Left:=GAPLEFT+(x-1)*(GAPBETWEEN+TILES1WIDTH);
      tiles[x,y].Width:=TILES1WIDTH;
      tiles[x,y].Height:=TILES1HEIGHT;
      tiles[x,y].Position:=10*x+y;
      tiles[x,y].BackLight:=false;
      tiles[x,y].Ball:=false;
      tiles[x,y].Player:=false;
      tiles[x,y].Chosen:=false;
     end;
  end;
  setAlphaTeam;
  setBetaTeam;
  setTiles;
end;

1 个答案:

答案 0 :(得分:3)

tiles[X,Y] := Tiles1.Create(self);

假设tiles是Tiles1的数组。

构造函数是有效的类方法,您可以在类上调用它们,而不是实例。

您正在获取访问冲突,因为磁贴[X,Y]为零。如果您注释掉了创建行,则会尝试设置父属性。