Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

DNK
I. DNK
Баллы: 5

Подробнее »



Вопрос # 1 422

/ вопрос решён /

Здравствуйте, уважаемые эксперты! Мой вопрос состоит в следующем. При запуске по кнопке ВКЛЮЧИТЬ ТАЙМЕР появляется отсчет времени в 50 секунд с бегущей строкой времени, затем выполняется та же бегущая строка с временной длинной в 10 секунд. Как сделать так, чтобы во время выполнения отсчета времени в 50 секунд при щелчке по кнопке "Досрочный ответ" сразу включался отсчет времени в 10 секунд. Хочу использовать для интеллектуальной игры, но пока не получается. Помогите, пожалуйста! То что я намудрил в прикрепленном архиве

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

bzfar_77 Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: bzfar_77 (статус: Посетитель)
Вопрос отправлен: 16 марта 2008, 09:36
Состояние вопроса: решён, ответов: 3.

Ответ #1. Отвечает эксперт: Dron

Здравствуйте, bzfar_77!
Самый простой вариант такой: делаем 2 таймера (Timer1 и Timer2). У каждого Interval = 1000, т.е. 1 сек. Изначально оба таймера выключены. Заводим две переменные - это будут счётчики. Изначально оба счётчика равны 0. Запускаем Timer1 и в OnTimer у него увеличиваем значение первого счётчика на единицу. Если счётчик достиг значения 50, выключаем первый таймер и включаем второй. Второй работает со своим счётчиком, но верхняя граница - 10. Тогда в любой момент можно выключить первый таймер и включить второй - они никак не связаны друг с другом.
P.S. Ваш проект не смотрел, вроде бы здесь ничего сложного нет.
Удачи!

Ответ отправил: Dron (статус: Студент)
Время отправки: 16 марта 2008, 09:53
Оценка за ответ: 5

Комментарий к оценке: Спасибо! Очень помог! Все ясно и понятно. Остальных знаний мне хватило.

Ответ #2. Отвечает эксперт: Drozdov D.V.

Здравствуйте, bzfar_77!
Предлогаю следующий способ.
1 создаём timer1
2 создаём progressbar
3 манифест XP
4 подключаем CommCtrl
Дальше кодим
Удачи!

Приложение:
  1.  
  2. procedure TForm1.Button1Click(Sender: TObject);
  3. begin
  4. // Set the Background color to teal
  5. Progressbar1.Brush.Color := clTeal;
  6. // Set bar color to yellow
  7. SendMessage(ProgressBar1.Handle, PBM_SETBARCOLOR, 0, clYellow);
  8. end;
  9.  
  10. const
  11. PBS_MARQUEE = $08;
  12. PBM_SETMARQUEE = WM_USER+10;
  13. ...
  14. with ProgressBar1 do
  15. begin
  16. // cikl
  17. SetWindowLong (Handle, GWL_STYLE, (GetWindowLong (Handle, GWL_STYLE) or PBS_MARQUEE));
  18. Perform(PBM_SETMARQUEE, 1, 50);
  19. end;
  20.  
  21. with ProgressBar2 do
  22. begin
  23. // cikl
  24. SetWindowLong (Handle, GWL_STYLE, (GetWindowLong (Handle, GWL_STYLE) or PBS_MARQUEE));
  25. Perform(PBM_SETMARQUEE, 1, 50);
  26. end;
  27.  
  28. procedure TForm1.Button1Click(Sender: TObject);
  29. var
  30. FSpeed: Integer;
  31. begin
  32. FSpeed := 100;
  33. SetWindowLong(ProgressBar1.Handle, GWL_STYLE,
  34. GetWindowLong(ProgressBar1.Handle, GWL_STYLE) Or PBS_MARQUEE);
  35.  
  36. SendMessage(ProgressBar1.Handle, PBM_SETMARQUEE, 1, FSpeed);
  37. end;
  38.  
  39.  
  40. procedure TForm1.Button2Click(Sender: TObject);
  41. begin
  42.  
  43. SendMessage(ProgressBar1.Handle, PBM_SETMARQUEE, 0, 0);
  44. end;
  45.  
  46.  


Ответ отправил: Drozdov D.V. (статус: 4-ый класс)
Время отправки: 16 марта 2008, 11:50
Оценка за ответ: 5

Комментарий к оценке: Немного сложновато для меня, т.к. мой уровень познаний оставляет желать лучшего. Буду разбирать Ваш ответ детально

Ответ #3. Отвечает эксперт: Вадим К

Здравствуйте, bzfar_77!
Честно сказать, я не понял ответ Drozdov D.V. Но предлагать делать цикл внутри обрабочкика Button, который будет длиться долгое время - грубая программерская ошибка.
Такие задачи обычно решаются либо с помощью потока, либо с помощью "машины состояний". Второе более просто, но иногда сложно в реализации. Но в данном случае это самое оно. Вся идея заключается в том, что наша система может находиться в нескольких состояниях. В нашем случае таких два - основное время и дополнительное. Хотя можно выделить и третье - время истекло.
В таймере нужно добавить case или серию if с помощью которых мы смотрим, в каком состоянии находится наша "машинка" и принимаем нужное действие.
Можно конечно и 10 таймеров сделать. Останавливать и запускать нужные, но это ложный путь. Начиная с какого то момента будет сложно управлять всем этим.
Для программирования игр и не только, машинка состояний - самое оно.
В одной с моих программ было две переменные для указания состояния и всего было несколько сотен состояний - эта система обрабатывала поток данных с com порта и расшифровывала. также она исправляла на лету ошибки.

Примерную реализацию для вашего случая смотрите в приложении.

Приложение:
  1. unit Unit2;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls, ComCtrls, ExtCtrls;
  8.  
  9. type
  10. TForm2 = class(TForm)
  11. Timer1: TTimer;
  12. Button1: TButton;
  13. Button2: TButton;
  14. ProgressBar1: TProgressBar;
  15. Label1: TLabel;
  16. procedure Button1Click(Sender: TObject);
  17. procedure Timer1Timer(Sender: TObject);
  18. procedure Button2Click(Sender: TObject);
  19. private
  20. procedure GoToSost2;
  21. { Private declarations }
  22. public
  23. { Public declarations }
  24. end;
  25.  
  26. var
  27. Form2: TForm2;
  28.  
  29. implementation
  30.  
  31. {$R *.dfm}
  32. var
  33.  
  34.  
  35.  
  36.  
  37.  
  38. procedure TForm2.Button1Click(Sender: TObject);
  39. begin
  40. ti := 50;
  41. sost := 1;
  42. ProgressBar1.Max := ti;
  43. ProgressBar1.Position := ti;
  44. Timer1.Enabled := True;
  45. end;
  46.  
  47. procedure TForm2.Timer1Timer(Sender: TObject);
  48. begin
  49. Dec(ti);
  50. ProgressBar1.Position := ti;
  51. if (ti = 0) and (sost = 1) then
  52. GoToSost2;
  53. if (ti = 0) and (sost = 2) then
  54. begin
  55. Timer1.Enabled := false;
  56.  
  57. end;
  58. case sost of
  59.  
  60.  
  61. else
  62.  
  63. end;
  64. end;
  65.  
  66.  
  67. procedure TForm2.Button2Click(Sender: TObject);
  68. begin
  69. GoToSost2;
  70. end;
  71.  
  72. procedure TForm2.GoToSost2;
  73. begin
  74. sost := 2;
  75. ti := 10;
  76. ProgressBar1.Max := ti;
  77. ProgressBar1.Position := ti;
  78. end;
  79.  
  80. end.
  81.  


Ответ отправил: Вадим К (статус: Академик)
Время отправки: 16 марта 2008, 13:46
Оценка за ответ: 5

Комментарий к оценке: Спасибо! Все очень даже стало понятно. Я знаю, что циклом это не дело. Просто не знал как, есть только знания начального программирования на Паскале. Очень помогли. Спасибо!

Мини-форум вопроса

Всего сообщений: 0.

31 января 2011, 19:23: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 июля 2017, 01:51
Выполнено за 0.08 сек.
Рейтинг@Mail.ru