|
Вопрос # 1 422/ вопрос решён / |
|
Здравствуйте, уважаемые эксперты! Мой вопрос состоит в следующем. При запуске по кнопке ВКЛЮЧИТЬ ТАЙМЕР появляется отсчет времени в 50 секунд с бегущей строкой времени, затем выполняется та же бегущая строка с временной длинной в 10 секунд. Как сделать так, чтобы во время выполнения отсчета времени в 50 секунд при щелчке по кнопке "Досрочный ответ" сразу включался отсчет времени в 10 секунд. Хочу использовать для интеллектуальной игры, но пока не получается. Помогите, пожалуйста! То что я намудрил в прикрепленном архиве
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
 |
Вопрос задал: 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
Дальше кодим
Удачи!
Приложение: Переключить в обычный режим-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- // Set the Background color to teal
- Progressbar1.Brush.Color := clTeal;
- // Set bar color to yellow
- SendMessage(ProgressBar1.Handle, PBM_SETBARCOLOR, 0, clYellow);
- end;
-
- const
- PBS_MARQUEE = $08;
- PBM_SETMARQUEE = WM_USER+10;
- ...
- with ProgressBar1 do
- begin
- // cikl
- SetWindowLong (Handle, GWL_STYLE, (GetWindowLong (Handle, GWL_STYLE) or PBS_MARQUEE));
- Perform(PBM_SETMARQUEE, 1, 50);
- end;
-
- with ProgressBar2 do
- begin
- // cikl
- SetWindowLong (Handle, GWL_STYLE, (GetWindowLong (Handle, GWL_STYLE) or PBS_MARQUEE));
- Perform(PBM_SETMARQUEE, 1, 50);
- end;
-
- procedure TForm1.Button1Click(Sender: TObject);
- var
- FSpeed: Integer;
- begin
- FSpeed := 100;
- SetWindowLong(ProgressBar1.Handle, GWL_STYLE,
- GetWindowLong(ProgressBar1.Handle, GWL_STYLE) Or PBS_MARQUEE);
-
- SendMessage(ProgressBar1.Handle, PBM_SETMARQUEE, 1, FSpeed);
- end;
-
-
- procedure TForm1.Button2Click(Sender: TObject);
- begin
-
- SendMessage(ProgressBar1.Handle, PBM_SETMARQUEE, 0, 0);
- end;
-
-
 |
Ответ отправил: Drozdov D.V. (статус: 4-ый класс)
Время отправки: 16 марта 2008, 11:50
Оценка за ответ: 5
Комментарий к оценке: Немного сложновато для меня, т.к. мой уровень познаний оставляет желать лучшего. Буду разбирать Ваш ответ детально
|
Ответ #3. Отвечает эксперт: Вадим К
Здравствуйте, bzfar_77!
Честно сказать, я не понял ответ Drozdov D.V. Но предлагать делать цикл внутри обрабочкика Button, который будет длиться долгое время - грубая программерская ошибка.
Такие задачи обычно решаются либо с помощью потока, либо с помощью "машины состояний". Второе более просто, но иногда сложно в реализации. Но в данном случае это самое оно. Вся идея заключается в том, что наша система может находиться в нескольких состояниях. В нашем случае таких два - основное время и дополнительное. Хотя можно выделить и третье - время истекло.
В таймере нужно добавить case или серию if с помощью которых мы смотрим, в каком состоянии находится наша "машинка" и принимаем нужное действие.
Можно конечно и 10 таймеров сделать. Останавливать и запускать нужные, но это ложный путь. Начиная с какого то момента будет сложно управлять всем этим.
Для программирования игр и не только, машинка состояний - самое оно.
В одной с моих программ было две переменные для указания состояния и всего было несколько сотен состояний - эта система обрабатывала поток данных с com порта и расшифровывала. также она исправляла на лету ошибки.
Примерную реализацию для вашего случая смотрите в приложении.
Приложение: Переключить в обычный режим- unit Unit2;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, ComCtrls, ExtCtrls;
-
- type
- TForm2 = class(TForm)
- Timer1: TTimer;
- Button1: TButton;
- Button2: TButton;
- ProgressBar1: TProgressBar;
- Label1: TLabel;
- procedure Button1Click(Sender: TObject);
- procedure Timer1Timer(Sender: TObject);
- procedure Button2Click(Sender: TObject);
- private
- procedure GoToSost2;
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form2: TForm2;
-
- implementation
-
- {$R *.dfm}
- var
-
-
-
-
-
- procedure TForm2.Button1Click(Sender: TObject);
- begin
- ti := 50;
- sost := 1;
- ProgressBar1.Max := ti;
- ProgressBar1.Position := ti;
- Timer1.Enabled := True;
- end;
-
- procedure TForm2.Timer1Timer(Sender: TObject);
- begin
- Dec(ti);
- ProgressBar1.Position := ti;
- if (ti = 0) and (sost = 1) then
- GoToSost2;
- if (ti = 0) and (sost = 2) then
- begin
- Timer1.Enabled := false;
-
- end;
- case sost of
-
-
- else
-
- end;
- end;
-
-
- procedure TForm2.Button2Click(Sender: TObject);
- begin
- GoToSost2;
- end;
-
- procedure TForm2.GoToSost2;
- begin
- sost := 2;
- ti := 10;
- ProgressBar1.Max := ti;
- ProgressBar1.Position := ti;
- end;
-
- end.
-
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 16 марта 2008, 13:46
Оценка за ответ: 5
Комментарий к оценке: Спасибо! Все очень даже стало понятно. Я знаю, что циклом это не дело. Просто не знал как, есть только знания начального программирования на Паскале. Очень помогли. Спасибо!
|
Мини-форум вопроса
Всего сообщений: 0.
31 января 2011, 19:23: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|