我有多个文件。
在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.
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.
snake.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实例。它在类中设置了图像的实例中工作正常,但是引用该实例的任何其他类在执行时都会引发错误。
我的问题是:这怎么可能?有没有办法克服这个问题?有更好的解决方案吗?
感谢您提供的任何帮助。
答案 0 :(得分:3)
全局变量
draw: TDraw;
在snake.pas中的永远不会被创建。您必须先创建它,然后才能在其上调用方法。