[EAccessViolation] Классы, баг
Добрый день, колупаю классы, код компилится, но при нажатии на кнопку выбивает ошибку доступа к памяти(?), собственно интересует где облажался с этим.
Unit1:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Math, Unit2;
type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Button2: TButton;
Button3: TButton;
procedure FormCreate(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
implementation
{$R *.dfm}
var
a, b, c, d, al, bl, cl, dl : Integer;
alpha : Extended;
Krug : TKrug;
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text := '20';
Edit2.Text := '40';
Edit3.Text := '60';
Edit4.Text := '80';
a := StrToInt(Edit1.Text);
b := StrToInt(Edit2.Text);
c := StrToInt(Edit3.Text);
d := StrToInt(Edit4.Text);
al := a;
bl := b;
cl := c;
dl := d;
alpha := 0;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
//ShowMessage(IntToStr(key)); //Key-codes
if (Key = 37) then begin
Button2.Click; // Left
end
else if (Key = 38) then begin
// Up
end
else if (Key = 39) then begin
Button3.Click; // Right
end
else if (Key = 40) then begin // Down
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Krug.Create(a, b, c, d, al, bl, cl, dl, alpha);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Krug.MoveLeft(a, b, c, d, al, bl, cl, dl, alpha, Image1, Canvas);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Krug.MoveRight(a, b, c, d, al, bl, cl, dl, alpha, Image1, Canvas);
end;
end.
Unit2:
Код:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Math;
type
TViz = class(Tobject)
Canvas : TCanvas;
Button1: TButton;
Image1: TImage;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Button2: TButton;
Button3: TButton;
a, b, c, d, al, bl, cl, dl: Integer;
alpha: Extended;
Procedure Ris; virtual; abstract;
//Procedure Show;
//Procedure Hide;
Procedure MoveLeft(a, b, c, d, al, bl, cl, dl : Integer; alpha : Extended; Image1 : TImage; Canvas : Tcanvas);
Procedure MoveRight(a, b, c, d, al, bl, cl, dl : Integer; alpha : Extended; Image1 : TImage; Canvas : Tcanvas);
end;
TKrug = class(Tviz)
a, b, c, d, al, bl, cl, dl : Integer;
alpha : Extended;
Constructor Create(a, b, c, d, al, bl, cl, dl : Integer; alpha : Extended);
end;
var
Form1 : TViz;
Image1 : TImage;
Krug : TKrug;
implementation
Constructor TKrug.Create;
begin
Form1.Image1.Canvas.FillRect(Image1.ClientRect);
Form1.Image1.Canvas.Ellipse(a, b, c, d);
Form1.Image1.Canvas.MoveTo(a, c);
Form1.Image1.Canvas.LineTo(c, c);
Form1.Image1.Canvas.MoveTo(b, b);
Form1.Image1.Canvas.LineTo(b, d);
end;
Procedure TViz.MoveLeft;
begin
if (alpha > 3.1415926535897932385/2) then begin
alpha := 0;
end;
Form1.Image1.Canvas.FillRect(Image1.ClientRect);
Form1.Image1.Canvas.Ellipse(a, bl, c, d);
Form1.Image1.Canvas.MoveTo(a+al, cl);
Form1.Image1.Canvas.Polygon([Point(b, cl), Point(Round(b-bl*0.45*abs(sin(alpha))), Round(cl-al*abs(cos(alpha))))]);
Form1.Image1.Canvas.Polygon([Point(b, cl), Point(Round(b+bl*0.45*abs(sin(alpha))), Round(cl+al*abs(cos(alpha))))]);
Form1.Image1.Canvas.Polygon([Point(b, cl), Point(Round(b+bl*0.45*abs(cos(alpha))), Round(cl-al*abs(sin(alpha))))]);
Form1.Image1.Canvas.Polygon([Point(b, cl), Point(Round(b-bl*0.45*abs(cos(alpha))), Round(cl+al*abs(sin(alpha))))]);
Dec(a); Dec(c); Dec(b); alpha := alpha + (3.1415926535897932385/24);
end;
Procedure TViz.MoveRight;
begin
if (alpha > 3.1415926535897932385/2) then begin
alpha := 0;
end;
Form1.Image1.Canvas.FillRect(Form1.Image1.ClientRect);
Form1.Image1.Canvas.Ellipse(a, bl, c, d);
Form1.Image1.Canvas.MoveTo(a+al, cl);
Form1.Image1.Canvas.Polygon([Point(b, cl), Point(Round(b+bl*0.45*abs(sin(alpha))), Round(cl-al*abs(cos(alpha))))]);
Form1.Image1.Canvas.Polygon([Point(b, cl), Point(Round(b-bl*0.45*abs(sin(alpha))), Round(cl+al*abs(cos(alpha))))]);
Form1.Image1.Canvas.Polygon([Point(b, cl), Point(Round(b-bl*0.45*abs(cos(alpha))), Round(cl-al*abs(sin(alpha))))]);
Form1.Image1.Canvas.Polygon([Point(b, cl), Point(Round(b+bl*0.45*abs(cos(alpha))), Round(cl+al*abs(sin(alpha))))]);
Inc(a); Inc(c); Inc(b); alpha := alpha + (3.1415926535897932385/24);
end;
end.
Ошибку выкидывает на втором юните, на строке
Код:
Form1.Image1.Canvas.FillRect(Form1.Image1.ClientRect);
|