var Form1: TForm1; a:integer; n1,n2,r,xc,k:integer; var i:integer;
implementation
{$R *.dfm} procedure stakan(x,y:integer); var d:integer; begin d:=10; with Form1.Canvas do begin Pen.Mode:=pmNotXor; pen.Color:=clBlack; pen.Width:=2; brush.Color:=clSkyBlue; Ellipse(x-3*d,y,x+3*d,y+2*d); MoveTo(x-3*d,y+d); LineTo(x-5*d,y+d+9*d); MoveTo(x+3*d,y+d); LineTo(x+5*d,y+d+9*d); Arc(x-5*d,y+8*d,x+5*d,y+12*d,x-5*d,y+10*d,x+5*d,y+10*d); end; end;
procedure dvizh; begin n1:=random(3)+1; n2:=n1; while n2=n1 do n2:=random(3)+1; xc:=x0+round((n1+n2-2)*rast/2); r:=abs(round((n1-n2)*rast/2)); a:=0; form1.Button1.Enabled:=false; form1.Timer1.enabled:=true; end;
procedure TForm1.FormPaint(Sender: TObject); begin stakan(x0,y0); stakan(x0+rast,y0); stakan(x0+2*rast,y0); end;
procedure TForm1.FormCreate(Sender: TObject);
begin randomize; end;
procedure TForm1.Timer1Timer(Sender: TObject); begin stakan(xc+round(r*cos(a/180*pi)),y0+round(r*sin(a/180*pi))); stakan(xc-round(r*cos(a/180*pi)),y0-round(r*sin(a/180*pi))); inc(a,5); stakan(xc+round(r*cos(a/180*pi)),y0+round(r*sin(a/180*pi))); stakan(xc-round(r*cos(a/180*pi)),y0-round(r*sin(a/180*pi))); if a>=180 then begin timer1.Enabled:=false; button1.Enabled:=true; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin // вот этот цикл не работает for i:=1 to 10 do begin dvizh; label1.Caption:=inttostr(i); end; end;
end.
посмотрите что не так, уже все проверил...
Добавлено через 2 мин. да, забыл. на форму надо поставить таймер - неактивный с задержкой 1, кнопку, и для проверки цикла - лабел.
Ну, так вспоминай, что происходит при "нажатии на крестик"
Правильно, вызывается событие OnCloseQuery... И если сделать вот такой финт ушами:
type TForm1 = class(TForm) // Здесь все, что и было private { Private declarations } bCloseApp: Boolean; // <-- А вот это - добавили public { Public declarations } end;
// ...
procedure TForm1.FormCreate(Sender: TObject); begin Randomize; bCloseApp := False; // Изначально сбрасываем в False end;
// При запросе пользователя на закрытие формы - переключаем флаг... procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin bCloseApp := True; end;
// И самое интересное - это таймер: procedure TForm1.Timer1Timer(Sender: TObject); begin if not bCloseApp then // Не просили закрыть форму - работаем begin stakan(xc+round(r*cos(a/180*pi)),y0+round(r*sin(a/180*pi))); stakan(xc-round(r*cos(a/180*pi)),y0-round(r*sin(a/180*pi))); inc(a,5); stakan(xc+round(r*cos(a/180*pi)),y0+round(r*sin(a/180*pi))); stakan(xc-round(r*cos(a/180*pi)),y0-round(r*sin(a/180*pi))); if a>=180 then begin timer1.Enabled:=false; button1.Enabled:=true; end; end else // А вот это уже другое дело. Стоп, выходим Timer1.Enabled := False; end;
, то ничего не будет ждать. Ну, как максимум, закончится текущая отрисовка, и все.