Здравствуйте.
Можно построить вектор состояния действий, в котором каждый бит соответствует одному действию и биты упорядочены справа-налево в порядке следования действий.
Пока порядок не нарушен, у каждого бита = 0 все "левые" соседи будут равны 0, что проверяется обычным сравнение целых чисел - значением вектора и 2 в степени номер бита + 1.
Скрипт изменилась основная переменная объекта "Флажок":
begin
with Sender as TM_CheckBox do
if (not Checked) and (AsInt >= Setbit(0, BitNumber + 1, true)) then // флажок не установлен, но есть "левые" установленные биты
Text1.Text := Text1.Text + Caption + ' пропущен' + #10;
end.
Уменьшить количество вызовов предыдущего скрипта на одно нажатие флажка (по числу флажков) можно до одного скрипта по изменению переменной (с потерей простого доступа к свойствам флажка):
begin
var i: integer;
b: boolean;
begin
with Sender as TM_Text do
begin
Text := '';
i := 0;
b := AsInt <> 0;
while b and (i < 31) do
begin
b := AsInt >= Setbit(0, i + 1, true); // признак наличия "левых"
if (not GetBit(AsInt, i)) and b then // флажок не установлен, но есть "левые" установленные биты
Text := Text + 'пропущен этап ' + IntToStr(i + 1) + #10;
i := i + 1;
end;
end;
end.
Пример во вложении.
Отлично спасибо, использовал if ... then, а переменная IsAllDone как индикатор выполненного задания на начальном этапе:
var
IsAllDone: Boolean;
begin
if not ChBox1_l1m1_1.Checked then
begin
Text29.Text := 'ЗАДАНИЕ 1 ПРОЦЕССА 1 НЕ ВЫПОЛНЕНО';
IsAllDone := False;
end;
if not ChBox1_l1m1_2.Checked then
begin
Text29.Text := 'ЗАДАНИЕ 2 ПРОЦЕССА 1 НЕ ВЫПОЛНЕНО';
IsAllDone := False;
end;
if not ChBox1_l1m1_3.Checked then
begin
Text29.Text := 'ЗАДАНИЕ 3 ПРОЦЕССА 1 НЕ ВЫПОЛНЕНО';
IsAllDone := False;
end;
if IsAllDone then
begin
itap_varki_l1m1.Value := 2 ;
Text29.Text := 'ЗАДАНИЕ ПРОЦЕССА 2';
TimerPause(vrTimer_1); // Пауза таймера 1
TimerStart(vrTimer_2, 0); // Старт таймер 2
Window_ChBox_l1m1_1.CloseAll;
end
else
begin itap_varki_l1m1.Value := 1;
end;
end.
itap_varki_l1m1 как следует из названия этапы