0 / 0 / 0
Регистрация: 03.03.2014
Сообщений: 34
1

Ожидание окончания работы Timer

17.10.2014, 12:51. Показов 2673. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Итак проблема вот в чём: у меня в программе вылетают шарики из разных труб(случайных), вылет шара реализован с помощью таймера
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TMainForm.Timer1Timer(Sender: TObject);
begin
  Timer1.Interval:=25;
  ArrImBall[i].Top:=ArrImBall[i].Top+10;
  if ArrImBall[i].Top>345 then begin
    ArrImBall[i].Visible:=false;
    Timer1.Enabled:=false;
  end;
end;
 
procedure TMainForm.ButtonStartClick(Sender: TObject);
begin
    Moveball(i); // процедура, которая ставит шар на нужное место перед полётом
      timer1.Enabled:=true;
end;
Тут соответственно ОДИН шар долетит до нужного места и всё, далее придётся снова нажимать кнопку
Если сделать цикл, то по таймеру проходит 1 раз и шар делает всего 1 сдвиг на Top+10.
Как сделать так, чтобы программа подождала пока таймер закончит свою работу, а только потом идти на следующий шаг цикла?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.10.2014, 12:51
Ответы с готовыми решениями:

Ожидание окончания процедуры
Имеется процедура поиска изображения и клик по нему procedure Search(name:string) и имеется...

OnDocumentComplete или ожидание окончания загрузки
Страница загружается при событие OnCreate. procedure TfrmMain.FormCreate(Sender: TObject);...

Оповещение окончания времени выполнения работы в программе
Доброго времени суток! Подскажите, пожалуйста, можно ли сделать в Delphi систему оповещения по...

Ожидание завершения работы потоков
допустим есть программа, которая многопоточно отправляет get запросы через idhttp сначала на первый...

5
842 / 737 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
17.10.2014, 14:07 2
Цитата Сообщение от chstr Посмотреть сообщение
Тут соответственно ОДИН шар долетит до нужного места и всё, далее придётся снова нажимать кнопку
Потому что ты так и написал в коде -
Delphi
1
Timer1.Enabled:=false;
Таймер отработает один раз и остановится.
Заведи переменную s счетчик внутри таймера и плюсуй к ней единицу, inc(s) потом пиши например условие:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
var
  s: Integer; //глобально
//--------------
//--------------
//--------------
 
begin
  Inc(s);
  {твой код}
  if s = 5 then
    Timer1.Enabled := false;
end;
Или необязательно счетчик, любое другое условие которое нужно для остановки таймера:
Такое ощущение что ты и сам незнаеш какое условие тебе нужно.
Delphi
1
2
  if {условие которое тебе нужно} then
    Timer1.Enabled := false;
0
0 / 0 / 0
Регистрация: 03.03.2014
Сообщений: 34
17.10.2014, 14:16  [ТС] 3
Каждый раз надо вызывать процедуру перемещения шара, ведь вылетает именно случайный шар, а в той процедуре еще происходит выбор шара. На счёт выключения таймера: таймер хотел выключить, когда шар дойдет до нужного места, потом генерировать случайный шар и снова запускать таймер. Может я что то не понимаю именно в том КАК работает таймер?

Добавлено через 5 минут
У меня как раз стоит это условие, если ты не увидел
Delphi
1
2
3
4
if ArrImBall[i].Top>345 then begin
    ArrImBall[i].Visible:=false;
    Timer1.Enabled:=false;
  end;
0
842 / 737 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
17.10.2014, 15:21 4
Лучший ответ Сообщение было отмечено chstr как решение

Решение

Вылетают случайные шары из разных труб и по условию сделал тебе когда шар достиг низа формы он поднимается наверх и вылетает следующий шар из случайной трубы, а этот шар что подняли стоит и ждет своей очереди.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var
  Form1: TForm1;
  s: Integer;
implementation
 
{$R *.dfm}
 
procedure TForm1.Timer1Timer(Sender: TObject);
 
begin
  //запустим случайно выбранный шар вниз!
    TImage(FindComponent('Image' + IntToStr(s))).Top := TImage(FindComponent('Image' +
    IntToStr(s))).Top + 5;
 
     //упала за экран- поднимаем на верх
    if TImage(FindComponent('Image' + IntToStr(s))).Top > Form1.ClientHeight - Image1.Height then
    begin
      //настало это условие когда нужно поднять шар наверх
      TImage(FindComponent('Image' + IntToStr(s))).Top := 0;
      //шар наверх поднят! теперь выпустим другой случайный шар!
      s:= 1 + Random(3);
    end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Randomize; //случайность
  DoubleBuffered := True; //двойной буфер
  s:= 1 + Random(3); //случайный выбор шара
  Timer1.Enabled:=True; //старт
end;
Расписал весь код, ну лови исходник еще, а то думаю неразберешся сразу, трубы сделал из шейпа, шарики- имаги.
Если нужно слишком много шариков, тогда динамически их создадим.
Миниатюры
Ожидание окончания работы Timer  
Вложения
Тип файла: rar image.rar (175.5 Кб, 8 просмотров)
2
0 / 0 / 0
Регистрация: 03.03.2014
Сообщений: 34
18.10.2014, 03:15  [ТС] 5
С полетами разобрался, спасибо. Есть ещё 1 вопрос по таймеру, почему я не могу его вызвать в этой процедуре (он ругается на Timer1.Enabled:=true), а например в Button'е в событии OnClick он работает без ругани
Delphi
1
2
3
4
5
6
7
8
9
10
procedure MoveBall(var i:integer);
begin
  if k<>30 then begin
    i:=RandomRange(1,11);
    ArrImBall[i].Left:=100*i-80;
    ArrImBall[i].Top:=0;
    ArrImBall[i].Visible:=true;
    Timer1.Enabled:=true; // на эту строчку ругается
  end;
end;
Может надо передавать в процедуру что-то?
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
18.10.2014, 03:32 6
В этой процедуре Timer1 находится вне своей области видимости. Надо в процедуре объявить параметр и через него передавать ссылку на таймер:
Delphi
1
2
3
4
5
6
7
8
9
10
procedure MoveBall(aTimer : TTimer; var i:integer);
begin
  if k<>30 then begin
    i:=RandomRange(1,11);
    ArrImBall[i].Left:=100*i-80;
    ArrImBall[i].Top:=0;
    ArrImBall[i].Visible:=true;
    aTimer.Enabled:=true;
  end;
end;
Вызов в методе формы Form1:
Delphi
1
MoveBall(Timer1, X);
Вызов вне методов формы:
Delphi
1
MoveBall(Form1.Timer1, X);
1
18.10.2014, 03:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2014, 03:32
Помогаю со студенческими работами здесь

Ожидание нажатия клавиши Enter для продолжения работы процедуры
Здравствуйте. У меня есть процедура, в ней цикл, выполняющий алгоритм. Но мне после одной и той же...

Запуск/остановка таймера при вводе в Edit команд Timer Start/Timer Stop
Суть вот в чём на форме есть таймер который выполняет обратный отсчёт и есть Edit, задача вот...

ShellExecuteEx, WaitForSingleObject, Ожидание завершения работы другого приложения
добрый вечер. итак, задача (которую я решил благодаря CyberForum.ru :)), следующая: необходимо...

Ожидание окончания работы запущенных процессов
Запуск N заданных пользователем процессов. Ожидание окончания работы запущенных процессов. *на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru