从另一个类访问公共字段失败,但存在访问冲突

时间:2013-03-16 17:52:50

标签: delphi class delphi-7 access-violation

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

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

以下是一些用于演示此问题的代码段:

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.

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.

This is the access violation error, that I'm getting

我在另一个文件中使用TDraw对象。

我的目标是在所有其他单元中使用main.pas文件中的TImage实例。它在类中设置了图像的实例中工作正常,但是引用该实例的任何其他类在执行时都会引发错误。

我的问题是:这怎么可能?有没有办法克服这个问题?有更好的解决方案吗?

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:3)

全局变量

draw: TDraw;
在snake.pas中的

永远不会被创建。您必须先创建它,然后才能在其上调用方法。