Если вместо строчки r.Owner:=c2; написать r.Owner:=nil; , то круг r потеряет владельца и снова будет позиционироваться относительно левого верхнего угла экрана:
Графика и анимация
Анимация без мерцания
Данная программа иллюстрирует применение процедур LockDrawing и Redraw для реализации анимации без мерцания:
uses GraphABC;
begin
LockDrawing;
for var i:=1 to 500 do
begin
Window.Clear;
Brush.Color := clGreen;
Ellipse(i,100,i+100,200);
Redraw;
Sleep(1);
end;
end.
Основная идея состоит в следующем: отключим рисование на экране, вызвав LockDrawing (рисование будет осуществляться только во внеэкранном буфере), после чего будем всякий раз формировать новый кадр изображения и выводить его целиком на экран, вызывая Redraw. При вызове Redraw перерисовывается все графическое окно, поэтому скорость анимации ограничена скоростью вывода внеэкранного буфера на экран.
Простейшие события
Рисование мышью в графическом окне
Данная программа осуществляет рисование мышью в графическом окне:
uses GraphABC;
procedure MouseDown(x,y,mb: integer);
begin
MoveTo(x,y);
end;
procedure MouseMove(x,y,mb: integer);
begin
if mb=1 then LineTo(x,y);
end;
begin
// Привязка обработчиков к событиям
OnMouseDown := MouseDown;
OnMouseMove := MouseMove
end.
Перемещение окна с помощью клавиатуры
Данная программа осуществляет перемещение графического окна с помощью клавиатуры:
uses GraphABC;
procedure KeyDown(Key: integer);
begin
case Key of
VK_Left: Window.Left := Window.Left - 2;
VK_Right: Window.Left := Window.Left + 2;
VK_Up: Window.Top := Window.Top - 2;
VK_Down: Window.Top := Window.Top + 2;
end;
end;
begin
// Привязка обработчиков к событиям
OnKeyDown := KeyDown;
end.
Пример использования таймера
Данная программа выводит 1 каждые 100 миллисекунд в течение 3 секунд:
uses Timers;
procedure TimerProc;
begin
write(1);
end;
begin
var t := new Timer(100,TimerProc);
t.Start;
Sleep(3000);
end.
Вызов Sleep здесь обязателен, иначе программа после создания таймера сразу закончится, и обработчик таймера ни разу не сработает.