Форум: "Начинающим";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];
Внизтаймер Найти похожие ветки
← →
newbie (2008-11-04 15:08) [0]Здравствуйте, мастера.
Первый раз работаю с таймерами и возникла проблема: когда пытаюсь сделать так, чтобы событие OnTimer сработало несколько раз, то получается, что оно срабатывает только последний из разов.
Суть программы в следующем: она должна перемещать несколько картинок по форме(типа анимации). Я процедуру написал, но когда вызываю её несколько раз, то перемещается только последняя картинка.
Подскажите пожалуйста, куда копать или как переделать.
← →
Palladin © (2008-11-04 15:10) [1]
> оно срабатывает только последний из разов.
оно срабатывает много разов, но ты видишь только результат последнего
← →
Правильный$Вася (2008-11-04 15:15) [2]код попыток в студию
← →
Плохиш © (2008-11-04 15:16) [3]
> newbie (04.11.08 15:08)
У тебя ошибка в программе и таймеры в ней не виноваты.
← →
Anatoly Podgoretsky © (2008-11-04 15:16) [4]> newbie (04.11.2008 15:08:00) [0]
Вставь ProcessMessages
← →
Anatoly Podgoretsky © (2008-11-04 15:17) [5]
> код попыток в студию
код пыток в студию
← →
newbie (2008-11-04 15:18) [6]Тогда почему он во время предыдущих срабатываний не перемещает картинки?
MoveImage(Image1, 10, 10);
...
MoveImage(Image5, 10, 10);
Перемещается только Image5, причём как надо, остальные на месте...
← →
newbie (2008-11-04 15:27) [7]извиняюсь, пока писал, тут уже много ответов появилось )
вот
> код пыток в студию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;
← →
Плохиш © (2008-11-04 15:35) [8]
> newbie (04.11.08 15:27) [7]
Ну и какая связь междуTForm2.Timer2Timer
иMoveImage
?
← →
newbie (2008-11-04 15:40) [9]
> Ну и какая связь
если имеются в виду переменные, то они глобальные. Описаны в одном модуле. Ну и когда в MoveImage Timer2 энейблится, то он перемещает картинку (MovingImage) в точку (EndX, EndY). По окончании перемещения(k=5) делаю дизейбл таймеру. Разве не так происходит?
← →
Плохиш © (2008-11-04 15:46) [10]
> newbie (04.11.08 15:40) [9]
Ok,
ну и какая связь между newbie (04.11.08 15:08) и newbie (04.11.08 15:40) [9]?
← →
Правильный$Вася (2008-11-04 15:51) [11]соедини это в одном методе обработки срабатывания таймера и не городи огород из глобальных переменных, кои уследить в событийной среде вообще нереально
← →
newbie (2008-11-04 15:52) [12]Такое чувство, что пришёл на собеседование какое-то, а не вопрос задал.
[0] - общее описание проблемы,
[6] и [7] -попросили код показать
[8] - не очень понял вопрос, попытался внести ясность, расписав подробнее
В данный момент читаю про ProcessMessages, ибо первый раз про них слышу.
← →
newbie (2008-11-04 15:59) [13]
> соедини это в одном методе
спасибо за ответ.
P.S. Но всё-таки хотелось бы услышать, почему перемещается только последняя картинка?
← →
Плохиш © (2008-11-04 16:01) [14]Скушная ветка :-(
> В данный момент читаю про ProcessMessages
В ракурсе приведённой информации в этой ветке, совершенно бесполезное занятие...
← →
Плохиш © (2008-11-04 16:02) [15]
> Но всё-таки хотелось бы услышать, почему перемещается только
> последняя картинка?
Потому чтоMoveImage(<последняя картинка>, фигня, фигня);
← →
newbie (2008-11-04 16:12) [16]
> Потому что MoveImage(<последняя картинка>, фигня, фигня);
а то, что до этого написаноMoveImage(Image1, 1, 1);
MoveImage(Image2,1,1);
...
почему не выполняется? Я же про это спрашивал.
← →
Правильный$Вася (2008-11-04 16:16) [17]
> newbie (04.11.08 16:12) [16]
потому что не видно, где же оно все вызывается
еще раз - соедини все в один метод
когда поймешь всю механику, осторожно можно будет вынуть независимую часть из него, если понадобится
а сейчас у тебя каша - управление таймером раскидано по разным местам, назначение координат - тоже, номера картинок вообще каким-то диковинным способом назначаются
← →
Плохиш © (2008-11-04 16:21) [18]
> а то, что до этого написано
> MoveImage(Image1, 1, 1);
> MoveImage(Image2,1,1);
> ...
> почему не выполняется?
Почему же, вполне выполняется. А тебе советую почитать не про бесполезные для тебя в данный момент функции/процедуры, а про основы выполнения операторов в программе и про обработку сообщений вындовса...
← →
{RASkov} © (2008-11-04 16:54) [19]> [16] newbie (04.11.08 16:12)
> почему не выполняется? Я же про это спрашивал.
потому как Timer2Timer и MoveImage выполняются независимо друг от друга и в Timer2Timer всегда MovingImage = последней картинке...
просто подумай...)
Эт плохой алгоритм перемещения картинок)
← →
newbie (2008-11-04 17:20) [20][19] - спасибо за разъясняние, теперь до меня дошло.
Хочу сказать, что сделать всё в одном обработчике было хорошей идеей, сейчас всё заработало ))
Обработку сообщений "вындовса" не очень понимаю, да и без этого всё заработало )
← →
Andy BitOff © (2008-11-04 17:34) [21]> newbie (04.11.08 17:20) [20]
> Обработку сообщений "вындовса" не очень понимаю, да и без
> этого всё заработало
Жуть.
← →
Правильный$Вася (2008-11-04 18:40) [22]
> Обработку сообщений "вындовса" не очень понимаю
винда вся построена на событиях и сообщениях о том, что события произошли
срабатывание таймера - событие
нажатие кнопки - событие
отрисовка окна - событие
переключение между программами - событие
и на события ты пишешь обработчики "что делать, когда такое событие произошло"
← →
newbie (2008-11-04 19:49) [23][22] - на этом уровне понимание есть, я думал, что в [18] имеется в виду что-то ещё...
← →
Правильный$Вася (2008-11-04 20:46) [24]
> newbie (04.11.08 19:49) [23]
еще огромное количество других событий и сообщений, как внутри процессов, так и между ними
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.006 c