2

Delphi でゲームを作成する割り当てがあり、ボードのサイズは 7x7 になるため、TImage から独自のコンポーネントを派生させて作成したいと考えていました。配列内のボード内のすべてのタイルの位置を取得したかったため、Create メソッドを使用してそれを実行したかったのですが、試行するたびに .Create(self) の呼び出し中に EAccessViolation が発生しました。

これが私のコンポーネントのコードです:

        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;
4

1 に答える 1

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

tiles が Tiles1 の配列であると仮定します。

コンストラクターは実質的にクラス メソッドであり、インスタンスではなくクラスで呼び出します。

tiles[X,Y] が nil であるため、アクセス違反が発生しています。create 行をコメント アウトすると、Parent プロパティを設定しようとします。

于 2013-06-18T22:52:44.353 に答える