Показать сообщение отдельно
  #1  
Старый 20.11.2011, 18:11
Syfer Syfer вне форума
Прохожий
 
Регистрация: 20.11.2011
Сообщения: 1
Репутация: 10
По умолчанию [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);
Ответить с цитированием