Анімуйте ваше додаток!, Delphi, Програмування, статті

Пер. Руденко Є.В., Небесна мережа

Коли тиждень тому я подумав зробити своє додаток більш “живим”, то вирішив створити процедуру, яка б анімувала кошти управління. Це виявилося більш важкою справою, ніж я припускав.
Отже, нижченаведений код – це результат майже тижня “важкої” роботи. Ймовірно багато можна зробити для збільшення функціональності та підвищення швидкості даної програми. Частина коду для даної процедури я подчерпнул у статті на сайті Delphi3000.com.

Невелике опис використовуваних параметрів:

Control: Як цієї змінної використовується будь-який компонент – спадкоємець класу TControl. Якщо компонент не є спадкоємцем TControl, але має властивості Left та Top, все одно помістіть його на місці TControl. Оскільки процедура звертається тільки до Властивостями Top і Left, то це спрацює OK.
Dest: Величина типу TPoint, яка показує, де зупиниться Control (на поточній формі) після анімації.
PixPTick: Pixels Per Tick. Будь величина (рекомендується 2-4) від 0 і вище. Вона не змінює положення Control точно на кожен крок (tick). Чим вище ця величина, тим швидше рух.
procedure MoveControl(var Control: TControl; Dest: TPoint; PixPTick: Integer);
var
StartTick, OldTick, CurTick, TickDif: Cardinal;
Steps: Integer;
begin
StartTick :=3D GetTickCount;
CurTick :=3D StartTick;
Steps :=3D 0;
/ / Перекладає Control відповідно до Dest.y і PixPTick
if Control.Top <> Dest.y then / / Проводить необхідні обчислення
if Control.Top < Dest.y then
while (Control.Top <> 0) and (Dest.y <> 0) and / / Усуває поділ на 0
/ / Перевірка на необхідність подальшої регулювання
((Dest.y – Control.Top) mod PixPTick <> 0) do
Control.Top :=3D Control.Top – 1
else
while (Control.Top <> 0) and (Dest.y <> 0) and / / Усуває поділ на 0
/ / Перевірка на необхідність подальшої регулювання
((Control.Top – Dest.y) mod PixPTick <> 0) do
Control.Top :=3D Control.Top + 1;
/ / Перекладає Control відповідно до Dest.x і PixPTick
if Control.Left <> Dest.x then / / Проводить необхідні обчислення
if Control.Left < Dest.x then
while (Control.Left <> 0) and (Dest.x <> 0) and / / Усуває поділ на 0
/ / Перевірка на необхідність подальшої регулювання
((Dest.x – Control.Left) mod PixPTick <> 0) do
Control.Left :=3D Control.Left – 1
else
while (Control.Left <> 0) and (Dest.x <> 0) and / / Усуває поділ на 0
/ / Перевірка на необхідність подальшої регулювання
((Control.Left – Dest.x) mod PixPTick <> 0) do
Control.Left :=3D Control.Left + 1;
repeat
Application.ProcessMessages; / / Реакція програми на введення користувача
OldTick: = 3D CurTick; / / Час останнього кадру
CurTick: = 3D GetTickCount; / / Поточний час
TickDif: = 3D CurTick – OldTick; / / Різниця в часі
if TickDif> 0 then / / По крайней мере 1 мілісекунда пройшла з моменту показу останнього кадру
begin
Inc(Steps);
if Control.Left > Dest.x then
Control.Left :=3D Control.Left – PixPTick
else if Control.Left < Dest.x then
Control.Left :=3D Control.Left + PixPTick;

if (Control.Top > Dest.y) then
Control.Top :=3D Control.Top – PixPTick
else if (Control.Top < Dest.y) then
Control.Top :=3D Control.Top + PixPTick;
end;
/ / Якщо минуло більше 150 кроків (що малоймовірно), рух
/ / Зупиниться, щоб не увійти в нескінченний цикл. Змініть цю величину відповідно
/ / З вашими вимогами, або видаліть її.
until ((Control.Left =3D Dest.x) and (Control.Top =3D Dest.y)) or (Steps > 150);
end;

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*