Необходимо написать программу с применением класса. Написал сначала без класса - все ок. Перенес процедуры в класс - все ок. Перенес переменные из вара в класс - начало выбивать ошибку EAcessViolation при обращении к любой из этих переменных, а их значение = inaccessible value. Пробовал обращаться и напрямую и через Property - без разницы.
Код HTML:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, jpeg, StdCtrls, unit2;
type
TForm1 = class(TForm)
PaintBox1: TPaintBox;
Start: TButton;
exit: TButton;
Timer1: TTimer;
EditSpeed: TLabeledEdit;
EditAlpha: TLabeledEdit;
procedure StartClick(Sender: TObject);
procedure exitClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure EditKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormResize(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
B:TPaint;
implementation
{$R *.dfm}
procedure TForm1.StartClick(Sender: TObject); //установка новых значений
var n:integer;
Buff:real;
begin
PaintBox1.Canvas.FillRect(PaintBox1.ClientRect);
val(EditSpeed.Text,Buff,n);
B.Speed:=Buff;
val(EditAlpha.Text,Buff,n);
B.Alpha:=Buff;
B.Drift:=0;
if (B.Speed=0) then
Timer1.Enabled:=false else
Timer1.Enabled:=true;
Timer1Timer(self);
end;
procedure TForm1.exitClick(Sender: TObject); //выход
begin
Application.Terminate;
end;
procedure TForm1.Timer1Timer(Sender: TObject); //"обновление рисунка"
begin
B.Paint;
end;
procedure TForm1.FormResize(Sender: TObject); //смена масштаба при смене размера формы
begin
if (PaintBox1.Width/400>PaintBox1.Height/300) then
B.Scale:=PaintBox1.Height/300 else
B.Scale:=PaintBox1.Width/400-0.03;
if (B.Speed=0) then
B.Paint;
end;
procedure TForm1.EditKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState); //обработка нажатия enter
begin
if (Key=13) then
StartClick(self)
;
end;
end.
Код HTML:
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, jpeg, StdCtrls;
type
TBabina=class(TObject)
Private
AlphaP,SpeedP,DriftP,scaleP:real;
public
Procedure Babina(a:real; wid,x,y,r:integer);
procedure Line(x1,y1,x2,y2,wid:integer);
Property Alpha:real read AlphaP write AlphaP;
property Speed:real read SpeedP write SpeedP;
property Drift:real read DriftP write DriftP;
property Scale:real read scaleP write ScaleP;
end;
TPaint=class(TBabina)
procedure Paint;
end;
implementation
Uses unit1;
procedure TPaint.Paint; //расчет новых значений
var l1,l2:real;
begin
l1:=7-round(Drift/1.5) mod 25;
Line(75+round(l1),206,300+round(l1),206,7);
l1:=frac(Drift/200/Pi)*Pi;
Babina(alpha/180*Pi+l1,10,300,100,100);
l2:=frac(Drift/150/Pi)*Pi;
Babina(alpha/180*Pi+l2,10,75,125,75);
if (round(l1*1000)=0)and(round(l2*1000)=0) then
Drift:=0;
Drift:=Drift+Speed;
end;
procedure TBabina.Line(x1,y1,x2,y2,wid:integer); //рисование толстой пунктирной линии
var i:integer;
begin
with Form1.PaintBox1.Canvas do begin
Pen.Width:=1;
Pen.Style:=psDash;
Pen.Color:=clBlack;
for i:=0 to wid-1 do begin
MoveTo(round(x1*scale),round(y1*scale)-i);
LineTo(round(x2*scale),round(y2*scale)-i);
end;
end;
end;
Procedure TBabina.Babina(a:real; wid,x,y,r:integer); //рисование бабины(колесо с 4 спицами)
begin
with Form1.PaintBox1.Canvas do begin
Pen.Color:=clMaroon;
Pen.Width:=wid;
wid:=wid div 2;
Brush.Color:=clBtnFace;
Ellipse(round((x+wid-r)*scale),round((y+wid-r)*scale),round((x+wid+r)*scale),round((y+wid+r)*scale));
dec(r);
MoveTo(round((x+wid+round(r*sin(a)))*scale),round((y+wid-round(r*cos(a)))*scale));
LineTo(round((x+wid-round(r*sin(a)))*scale),round((y+wid+round(r*cos(a)))*scale));
MoveTo(round((x+wid-round(r*cos(a)))*scale),round((y+wid-round(r*sin(a)))*scale));
LineTo(round((x+wid+round(r*cos(a)))*scale),round((y+wid+round(r*sin(a)))*scale));
end;
end;
end.