Здравствуйте.
Сброс таймера vrTimer в 0 по трем кнопкам Btn1, Btn2, Btn3 с управлением подсветкой кнопок К1, К2, К3.
Предполагается, что кнопки реагируют на нажатие только при завершению интервала контроля, т.е. когда кнопки мигают. Нажатия кнопок запоминаются в переменной состояние кнопок vrBtnState. Для разрешения реагирования на кнопки в любой момент времени достаточно удалить условие проверки состояния таймера: (vrTimer.AsInt < (Tmax - 2)).
После нажатия всех трех кнопок может выполняться проверка на правильный порядок нажатия 1-2-3 или 3-2-1.
Скрипт "Изменились переменные Btn1, Btn2, Btn3":
const Tmax = 120 * 60; // константа используется в двух скриптах - её можно перенести в глобальный модуль
begin
if vrTimer.AsInt < (Tmax - 2) then exit; // интервал контроля ещё не истек (рано кнопки нажимать). Для исключения контроля удалить оператор
if not Variable.AsBool then exit; // переход в false - игнорировать
if Variable = btn1 then begin K1.Value := 29; vrBtnState.Value := SetBit(vrBtnState.AsInt, 0, true); end; // запомнить нажатые кнопки
if Variable = btn2 then begin K2.Value := 29; vrBtnState.Value := SetBit(vrBtnState.AsInt, 1, true); end;
if Variable = btn3 then begin K3.Value := 29; vrBtnState.Value := SetBit(vrBtnState.AsInt, 2, true); end;
// СОСТОЯНИЕ КНОПОК - другой оператор должен быть закомментирован или удален
// этот оператор контролирует порядок нажатия кнопок 1-2-3 или 3-2-1
case vrBtnState.AsInt of
2, 5: vrBtnState.Value := SetBit(vrBtnState.AsInt, 3, true); // установить флаг ошибки порядка нажатия кнопок
7: vrTimer.Value := 0; // сброс таймера
15: begin
vrTimer.Value := 0; // сброс таймера
AddMessage(Now, mkWarning, 'Он шел на Одессу, а вышел к Херсону...(матрос-партизан Железняк)', true, false);
end;
end;
// этот оператор контролирует факт нажатия всех кнопок
// if vrBtnState.AsInt = 7 then vrTimer.Value := 0; // сброс таймера
end.
Скрипт "Прошла секунда":
const Tmax = 120 * 60; // константа используется в двух скриптах - её можно перенести в глобальный модуль
begin
vrTimer.inc(1, 0, Tmax);
case vrTimer.AsInt of
1: vrBtnState.Value := 0; // сброс регистра нажатых кнопок
2, Tmax - 1: begin
if not Getbit(vrBtnState.AsInt, 0) then K1.Value := 31; // включать индикатор не нажатой кнопки
if not Getbit(vrBtnState.AsInt, 1) then K2.Value := 31;
if not Getbit(vrBtnState.AsInt, 2) then K3.Value := 31;
end;
Tmax: begin
K1.Value := 29; // выключить индикаторы кнопок
K2.Value := 29;
K3.Value := 29;
vrTimer.inc( -2);
end;
end;
end.
Возможно ещё нужен контроль времени нажатия всех трёх кнопок.
Пример во вложении.