我有多个文件。在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 实例。它在图像设置的实例的类中运行良好,但是任何其他引用该实例的类在执行时都会引发错误。
我的问题是:这怎么可能?有什么办法可以克服这个吗?有更好的解决方案吗?
我将不胜感激提供的任何帮助。