0
我嘗試製作類球應該在單位,然後我需要使用Canvas
在形式上畫球。其實我從來沒有嘗試過在Delphi中使用OOP(我只是在帕斯卡爾的學校簡單的練習),所以我遇到了很多問題。哦。 所以,這裏的代碼 單元Ball類一些德爾菲錯誤
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
MyPoint = record
x, y: integer;
end;
Ball = class
Pos:MyPoint;
Vel:MyPoint;
Rad:integer;
Can:TCanvas;
procedure BallCreate(crd, spd:MyPoint; Sender: TObject);
procedure BallDraw(Sender: TObject);
procedure BallMove();
private
{ Private declarations }
public
{ Public declarations }
end;
var
posX, posY, speedX, speedY, radius:Integer;
implementation
procedure Ball.BallMove;
begin
if((posX + radius > 700) or (posX - radius < 0)) then speedX:= (-speedX);
if((posY + radius > 500) or (posY - radius < 0)) then speedY:= (-speedY);
posX:=posX+speedX;
posY:=posY+speedY;
end;
procedure Ball.BallCreate(crd, spd:MyPoint; Sender: TObject);
begin
Vel.x:=3;
Vel.y:=3;
pos.X:=crd.x;
pos.Y:=crd.y;
radius:=30;
end;
procedure Ball.BallDraw(Sender: TObject);
begin
with Can do
begin
brush.Style:=bsSolid;
brush.Color:=clRed;
ellipse((pos.X-radius),(pos.Y-radius),(pos.X+radius),(pos.Y+radius));
end;
end;
end.
單元形式
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Unit2;
type
TForm1 = class(TForm)
Timer1: TTimer;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
x1,y1,x2,y2,x,y:integer;
posX, posY, speedX, speedY, radius:Integer;
f:boolean;
obj:Ball;
p:MyPoint;
s:MyPoint;
implementation
{$R *.dfm}
{procedure TForm1.BallMove;
begin
if((posX + radius > ClientWidth) or (posX - radius < 0)) then speedX:= (-speedX);
if((posY + radius > ClientHeight) or (posY - radius < 0)) then speedY:= (-speedY);
posX:=posX+speedX;
posY:=posY+speedY;
end; }
procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Enabled:=false;
Timer1.Interval:=5;
p.x:= Round(ClientWidth/2);
p.y:= Round(ClientHeight/2);
s.y:=3;
s.x:=s.y;
obj.BallCreate(p,s,Sender);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if not f then
begin
Timer1.Enabled:=true;
Button1.Caption:='Ñòîï';
f:=not f;
end
else
begin
Timer1.Enabled:=false;
Button1.Caption:='Ïóñê';
f:=not f;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
obj.BallDraw(Sender);
obj.BallMove;
end;
end.
當我嘗試運行它,它說,
raised exception class EAccessViolation with message 'Access violation at address 0044DE7B in module Project1.exe. Write of address 000000C'
,並在代碼中的招突出顯示爲紅色
Vel.x:= 3; 和 用能做到
我不明白什麼是錯,如何我sholud聲明,並在這裏正確使用畫布。也許你在Delphi中使用Canvas的單元中有OOP的東西的例子嗎?
「CALSS」來命名一個類的實例 - >你可以複製和粘貼文本:用鼠標標記文本,按ctrl + c,去你想要的地方,按ctrl + v –
哦對不起。實際上,它是錯誤的窗口,我不能做這樣的事情,所以我只是決定鍵入它 – DanilGholtsman
你聲明一個TCanvas變量,並試圖使用它沒有實例化它。事先需要'Can:= TCanvas.Create'。當你完成它時,不要忘記釋放它。在'Ball'中相同,在嘗試調用'BallCreate'之前,您需要'obj:= Ball.Create'。 –