![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
таймер [D7]
newbie © (2008-11-04 15:08:00)Здравствуйте, мастера.
Первый раз работаю с таймерами и возникла проблема: когда пытаюсь сделать так, чтобы событие OnTimer сработало несколько раз, то получается, что оно срабатывает только последний из разов.
Суть программы в следующем: она должна перемещать несколько картинок по форме(типа анимации). Я процедуру написал, но когда вызываю её несколько раз, то перемещается только последняя картинка.
Подскажите пожалуйста, куда копать или как переделать.
Правильный$Вася (2008-11-04 20:46:00) [1]
> newbie (04.11.08 19:49) [23]
еще огромное количество других событий и сообщений, как внутри процессов, так и между ними
newbie (2008-11-04 19:49:00) [2][22] - на этом уровне понимание есть, я думал, что в [18] имеется в виду что-то ещё...
Правильный$Вася (2008-11-04 18:40:00) [3]
> Обработку сообщений "вындовса" не очень понимаю
винда вся построена на событиях и сообщениях о том, что события произошли
срабатывание таймера - событие
нажатие кнопки - событие
отрисовка окна - событие
переключение между программами - событие
и на события ты пишешь обработчики "что делать, когда такое событие произошло"
Andy BitOff (2008-11-04 17:34:00) [4]> newbie (04.11.08 17:20) [20]
> Обработку сообщений "вындовса" не очень понимаю, да и без
> этого всё заработало
Жуть.
newbie (2008-11-04 17:20:00) [5][19] - спасибо за разъясняние, теперь до меня дошло.
Хочу сказать, что сделать всё в одном обработчике было хорошей идеей, сейчас всё заработало ))
Обработку сообщений "вындовса" не очень понимаю, да и без этого всё заработало )
{RASkov} (2008-11-04 16:54:00) [6]> [16] newbie (04.11.08 16:12)
> почему не выполняется? Я же про это спрашивал.
потому как Timer2Timer и MoveImage выполняются независимо друг от друга и в Timer2Timer всегда MovingImage = последней картинке...
просто подумай...)
Эт плохой алгоритм перемещения картинок)
Плохиш (2008-11-04 16:21:00) [7]
> а то, что до этого написано
> MoveImage(Image1, 1, 1);
> MoveImage(Image2,1,1);
> ...
> почему не выполняется?
Почему же, вполне выполняется. А тебе советую почитать не про бесполезные для тебя в данный момент функции/процедуры, а про основы выполнения операторов в программе и про обработку сообщений вындовса...
Правильный$Вася (2008-11-04 16:16:00) [8]
> newbie (04.11.08 16:12) [16]
потому что не видно, где же оно все вызывается
еще раз - соедини все в один метод
когда поймешь всю механику, осторожно можно будет вынуть независимую часть из него, если понадобится
а сейчас у тебя каша - управление таймером раскидано по разным местам, назначение координат - тоже, номера картинок вообще каким-то диковинным способом назначаются
newbie (2008-11-04 16:12:00) [9]
> Потому что MoveImage(<последняя картинка>, фигня, фигня);
а то, что до этого написано
MoveImage(Image1, 1, 1);
MoveImage(Image2,1,1);
...
почему не выполняется? Я же про это спрашивал.
Плохиш (2008-11-04 16:02:00) [10]
> Но всё-таки хотелось бы услышать, почему перемещается только
> последняя картинка?
Потому чтоMoveImage(<последняя картинка>, фигня, фигня);
Плохиш (2008-11-04 16:01:00) [11]Скушная ветка :-(
> В данный момент читаю про ProcessMessages
В ракурсе приведённой информации в этой ветке, совершенно бесполезное занятие...
newbie (2008-11-04 15:59:00) [12]
> соедини это в одном методе
спасибо за ответ.
P.S. Но всё-таки хотелось бы услышать, почему перемещается только последняя картинка?
newbie (2008-11-04 15:52:00) [13]Такое чувство, что пришёл на собеседование какое-то, а не вопрос задал.
[0] - общее описание проблемы,
[6] и [7] -попросили код показать
[8] - не очень понял вопрос, попытался внести ясность, расписав подробнее
В данный момент читаю про ProcessMessages, ибо первый раз про них слышу.
Правильный$Вася (2008-11-04 15:51:00) [14]соедини это в одном методе обработки срабатывания таймера и не городи огород из глобальных переменных, кои уследить в событийной среде вообще нереально
Плохиш (2008-11-04 15:46:00) [15]
> newbie (04.11.08 15:40) [9]
Ok,
ну и какая связь между newbie (04.11.08 15:08)и newbie (04.11.08 15:40) [9]?
newbie (2008-11-04 15:40:00) [16]
> Ну и какая связь
если имеются в виду переменные, то они глобальные. Описаны в одном модуле. Ну и когда в MoveImage Timer2 энейблится, то он перемещает картинку (MovingImage) в точку (EndX, EndY). По окончании перемещения(k=5) делаю дизейбл таймеру. Разве не так происходит?
Плохиш (2008-11-04 15:35:00) [17]
> newbie (04.11.08 15:27) [7]
Ну и какая связь междуTForm2.Timer2TimerиMoveImage?
newbie (2008-11-04 15:27:00) [18]извиняюсь, пока писал, тут уже много ответов появилось )
вот
> код пыток в студию
procedure TForm2.Timer2Timer(Sender: TObject);
begin
if k<5
then
begin
MovingImage.Left := MovingImage.Left + sml;
MovingImage.Top := MovingImage.Top + smt;
inc(k);
end
else
begin
Timer2.Enabled := false;
MovingImage.Left := EndX;
MovingImage.Top := EndY;
end
end;
procedure MoveImage(a: TImage; x, y: Integer);
begin
MovingImage := a; //для передачи в онтаймер2
k := 1;
begX := a.Left; //глобальные переменные для работы в онТаймер2
begY := a.Top;
endX := x;
endY := y;
sml := trunc((endx-begx)/5); //перемещается
smt := trunc((endy-begy)/5); //5 шагов
Form2.Timer2.Enabled := true;
end;
newbie (2008-11-04 15:18:00) [19]Тогда почему он во время предыдущих срабатываний не перемещает картинки?
MoveImage(Image1, 10, 10);
...
MoveImage(Image5, 10, 10);
Перемещается только Image5, причём как надо, остальные на месте...
Anatoly Podgoretsky (2008-11-04 15:17:00) [20]
> код попыток в студию
код пыток в студию