-1

我有多个文件。在main.pas文件中,我将主窗体中存在的 TImage 实例传递给显示类,然后将其设置为其类的属性。

该图像可以在类内毫无问题地使用,但我在任何其他类中都有访问冲突问题,无论我做什么,它都会尝试使用此属性。

以下是一些代码片段来演示该问题:

主文件

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.

显示.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.

蛇.pas

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 回答