-1

複数のファイルがあります。ファイルでは、メイン フォームに存在する TImage インスタンスを表示クラスに渡します。main.pas表示クラスはそれをクラスのプロパティとして設定します。

この画像はクラス内では問題なく使用できますが、このプロパティを使用しようとする他のクラスでは、何をしてもアクセス違反の問題が発生します。

問題を示すコードの一部を次に示します。

main.pas

unit main;

interface

uses

  snake, display,

  ExtCtrls, Classes, Controls, Windows, Messages, SysUtils, Variants, Graphics, Forms,
  Dialogs, StdCtrls;

type
  TfrmGameScreen = class(TForm)
    Image: TImage;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmGameScreen: TfrmGameScreen;
  snake: TSnake;
  display: TDisplay;

implementation

{$R *.dfm}

procedure TfrmGameScreen.FormCreate(Sender: TObject);
begin
  DoubleBuffered := True;
  display := TDisplay.create(Image);
end;




end.

display.pas

unit display;

interface

uses
   ExtCtrls, Graphics;

type

  TDisplay = class
  public
    image: TImage;
    constructor create(img: TImage);
  end;

  TDraw = class(TDisplay)
  public
     procedure rectangle(x1, y1, x2, y2: integer);
  end;

implementation

constructor TDisplay.create(img: TImage);
begin
  image := img;
  image.Canvas.Rectangle(100, 100, 150, 150);

end;


procedure TDraw.rectangle(x1, y1, x2, y2: integer);
begin
 // image.canvas.rectangle(x1, y1, x2, y2); THIS IS WHERE THE ACCESS VIOLATION ARISES

end;


end.

スネークパス

unit snake;

interface

uses display, Dialogs, sysUtils, Graphics, ExtCtrls;

type
  TBlock = record
    width, height: integer;
  end;

  TCoordinate = record
    x, y: integer;
  end;

  TVector = TCoordinate;

  TSnake = class
  public
    position: TCoordinate;
    direction: integer;
    block: TBlock;
    velocity: TVector;
    constructor create(initialPosition: TCoordinate);
    procedure draws(x, y: integer);
    procedure move(x, y: integer);
  end;

  var
    display: TDisplay;
    draw: TDraw;
implementation

constructor TSnake.create(initialPosition: TCoordinate);
begin
  position.x := initialPosition.x;
  position.y := initialPosition.y;

  velocity.x := 3;
  velocity.y := 3;

  block.height := 50;
  block.width := 50;

end;

procedure TSnake.draws(x, y: integer);
begin
  display.clear;
  draw.rectangle(1, 2, 3, 4);
  //image.canvas.Rectangle(100, 100, 150, 150);
  //display.canvas.rectangle(x, y, x + block.width, y + block.height);
end;

procedure TSnake.move(x, y: integer);
begin
  draws(x, y);

end;


end.

これは私が得ているアクセス違反エラーです

別のファイルで TDraw オブジェクトを使用しています。

私の目標は、他のすべてのユニットで main.pas ファイルの TImage インスタンスを使用することです。画像が設定されているインスタンスのクラスでは正常に機能しますが、インスタンスを参照する他のクラスは実行時にエラーをスローします。

私の質問は次のとおりです。これを克服する方法はありますか?より良い解決策はありますか?

提供されたヘルプに感謝します。

4

1 に答える 1

3

グローバル変数

draw: TDraw;

では、snake.pas は作成されません。その上でメソッドを呼び出す前に、それを作成する必要があります。

于 2013-03-16T18:45:00.413 に答える