Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Элемент Флажок  (Прочитано 525 раз)

AndrewNA

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Элемент Флажок
« : 18 Ноября 2025, 10:05:46 »
Доброго дня, помогите с кодом на элемент флажок пожалуйста. Задача пользователь отмечая флажки отмечает этапы выполненных действий, если какой либо флажок не отмечен выводится сообщение в элемент текст о конкретно не выполненном действие.

pan2000

  • Постоялец
  • ***
  • Сообщений: 217
    • Просмотр профиля
Re: Элемент Флажок
« Ответ #1 : 18 Ноября 2025, 13:51:01 »
   Здравствуйте.

 Можно построить вектор состояния действий, в котором каждый бит соответствует одному действию и биты упорядочены справа-налево в порядке следования действий.
Пока порядок не нарушен, у каждого бита = 0 все "левые" соседи будут равны 0, что проверяется обычным сравнение целых чисел - значением вектора и 2 в степени номер бита + 1.
Скрипт изменилась основная переменная объекта "Флажок":
Код: (delphi)
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.
Уменьшить количество вызовов предыдущего скрипта на одно нажатие флажка (по числу флажков) можно до одного скрипта по изменению переменной (с потерей простого доступа к свойствам флажка):
Код: (delphi)
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.
Пример во вложении.
« Изменён: 18 Ноября 2025, 14:50:20 от pan2000 »

AndrewNA

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Элемент Флажок
« Ответ #2 : 19 Ноября 2025, 09:01:02 »
Отлично спасибо, использовал if ... then, а переменная IsAllDone как индикатор выполненного задания на начальном этапе:
Код: (delphi)
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 как следует из названия этапы
« Изменён: 19 Ноября 2025, 09:44:40 от Simple_Scada »

AndrewNA

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: Элемент Флажок
« Ответ #3 : 05 Декабря 2025, 14:18:21 »
Доброго дня народ, продолжаю разбираться со скадой и в частности с элементами Флажок

1. Как можно отобразить системное время Отмеченного флажка.
2. Как исключить повторное отжатие флажка, не используя его скрытие с экрана
3. Либо фиксировать время нажатия и отжатия флажков
4. Как посчитать время между 2 мя последующими флажками

получились вопросы по временным функциям, спасибо за ответы

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 273
    • Просмотр профиля
    • Simple-Scada
Re: Элемент Флажок
« Ответ #4 : 09 Декабря 2025, 11:08:30 »
Здравствуйте.

Цитировать
Как исключить повторное отжатие флажка, не используя его скрытие с экрана
Для изменения доступности объекта нужно использовать свойство "Enabled".

Цитировать
получились вопросы по временным функциям, спасибо за ответы
Методы для работы с датой/временем можно найти в руководстве по ссылке. Текущую дату/время можно получить с помощью функции "Now". Если требуется получить количество секунд между переменными "DateTime", то можно использовать функцию "SecondsBetween". Далее, используя функцию "SecondsToDateTime", можно перевести количество секунд в значение "DateTime". Используя функцию "SecondsToStr", можно перевести количество секунд в строку вида "чч:мм:сс".