Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.09.04;
Скачать: CL | DM;

Вниз

Летающие формы   Найти похожие ветки 

 
Smersh03-1   (2005-08-05 13:32) [0]

Мне надо реализовать в своем проекте в одной форме две летающие  формы. Которые отскакивают от стен и друг от друга. В нутри каждой из них летают фигуры отражаясь друг от друга и от краёв форм.


 
k2 ©   (2005-08-05 13:37) [1]

Удалено модератором


 
Skyle ©   (2005-08-05 13:43) [2]

В чём именно сложность?


 
clickmaker ©   (2005-08-05 14:07) [3]


> Smersh03-1   (05.08.05 13:32)

TTimer
OnTimer -> Form.Left := Left +/- X, Form.Top := Form.Top +/- X
то же и с фигурами
+ проверять на выход за пределы экрана/формы, типа
if (Left + Width) > Screen.Width или Form.ClientWidth


 
Алхимик ©   (2005-08-05 14:08) [4]

Как говорится - иногда лучше жевать, чем говорить.
Вот займусь, пожую.
Итак объявим переменные:
координаты верхнего левого угла
x,y,
приращение координат
dx,dy,
ширина и высота формы
MyWidth,MyHeight

...
Один цикл "летания формы" будет выглядеть примерно следующим образом:
x:=x+dx;
y:=y+dy;
if x>Screen.Width-MyWidth then dx:=-dx;
if x<0 then dx:=-dx;
if y>Screen.Height-MyHeight then dy:=-dy;
if y<0 then dy:=-dy;
MoveWindow(MyHandle,x,y,MyWidth,MyHeight,True);

Из кода видно, что в условии if проверяется достигла ли форма края экрана и если это так, то приращение соответсвующей координаты меняет знак. На примере - форма достигла верхнего края:
if y<0 then dy:=-dy;
Далее идёт функция, название которой говорит само за себя. Да! она действительно перемещает окна и изменяет их размеры!
Первый параметр этой функции - дескриптор(описатель) окна.
Получить дескриптор форму можно так : <Имя формы>.Handle
Теперь надо подумать как сделать из одного цикла "летания формы".

---


 
Алхимик ©   (2005-08-05 14:20) [5]

Теперь надо подумать как сделать из одного цикла "летания формы" некий продолжительный полет. Можно воспользоваться компонентом TTimer, который имеет замечательное событие OnTimer, срабатывающее через заранее установленные интервалы.
Итак бросим на форму TTimer и две кнопки (например TButton, но я не настаиваю).
Зададим кнопкам обработчики
procedure Form1.Button1Click(...)
begin
  Timer1.Enabled := true;
end;
и
procedure Form1.Button2Click(...)
begin
  Timer1.Enabled := false;
end;

Нажатие на первую кнопку будет включать таймер, нажатие на вторую - соответственно выключать.
Теперь осталось написать обработчик события OnTimer:
procedure Form1.Timer1Timer(...)
begin
  x:=x+dx;
  y:=y+dy;
  if x>Screen.Width-MyWidth then dx:=-dx;
  if x<0 then dx:=-dx;
  if y>Screen.Height-MyHeight then dy:=-dy;
  if y<0 then dy:=-dy;
  MoveWindow(MyHandle,x,y,MyWidth,MyHeight,True);
  Application.ProcessMessages;
end;

Как видно, к написанному ранее коду добавилась строка:
  Application.ProcessMessages;
Она дает команду системе обработать текущие события, как то нажатия клавишь, отрисовку окон и т.д.



Страницы: 1 вся ветка

Текущий архив: 2005.09.04;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.038 c
6-1116528072
NikNet
2005-05-19 22:41
2005.09.04
У кого есть пример FTP клиент/сервер на WinSock?


14-1122567008
Knight
2005-07-28 20:10
2005.09.04
Где можно недорого остановиться в Москве недели на две?


1-1123606864
Cerberus
2005-08-09 21:01
2005.09.04
Архиватор


3-1122349974
Oleg_S
2005-07-26 07:52
2005.09.04
Проблема с компонентом UpdateSQL


6-1116575092
Zavs
2005-05-20 11:44
2005.09.04
как соедениться с FTP-сервером, через прокси