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

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

Автор Тема: Динамическая смена формата отображения числа в объекте TM_Field  (Прочитано 597 раз)

Кирилл_ШКЫ

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Добрый день!

Задача: отображать значение переменной Х типа single в форматах:
1)"0" если Х > 1, т.е. отображать "53", например, когда переменная равно 53.282
2) "0.00E+00" если Х < 1, т.е. отображать "2.82E-2" когда переменная равно 0.0282

Моё решение (Работает):
1) Исходной переменной Х при объявлении задать формат "0". Создать внутреннюю переменную Х_2  задать ей формат "0.00E+00"
2) Создать 2 поля TM_Field, одному присвоить Х, другому Х_2 (и Х в качестве доп.переменной). Наложить одно поле на другое.
3) Создать скрипты(приведены ниже):
    а) Скрывать объект, если переменная ушла из своего диапазона, иначе отображать (OnDataChange)
    б) Сопоставлять значение Х и Х_2 при изменении Х (OnDataChangeEx)

Вопросы:
1) Правильно ли я понимаю, что такой подход сейчас единственно возможный? Свойство Format ведь доступно только для чтения? (См скрин 1)
2) Не планируется ли открыть данное свойство на запись?

Дополнительно:
3) Не планируется ли сделать для пользователей возможность конструировать свои объекты типа фигура, т.к. эллипса и прямоугольника не хватает? Ну или дать возможность из набора эллипсов и прямоугольников собирать один объект с едиными свойствами.
4) Можно ли указать в руководстве какие свойства доступны на запись, а какие только на чтение? Было бы полезно. Или укажите если я не заметил это.

Заранее благодарен.

Приложение (листинг скриптов)
1) Сокрытие
Код: (delphi)
begin
            if Sender is TM_Field then   // проверяем, что Sender это поле
              with Sender as TM_Field do // приводим Sender к типу "TM_Field"
                begin
                  if Value  < 5 THEN
                    Visible  := FALSE // скрываем поле
                  ELSE
                    Visible  := TRUE;
                end;
end.
2) сопоставление внешней и внутренней переменной
Код: (delphi)
begin
          if Sender is TM_Field then   // проверяем, что Sender это поле
            with Sender as TM_Field do // приводим Sender к типу "TM_Field"
               TM_Field(Sender).Variable.Value := TM_Field(Sender).VariableEx.Value; // передача значения из внешнего тега во внутренний
end.
« Изменён: 03 Сентября 2024, 18:56:23 от Simple-Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1247
    • Просмотр профиля
Здравствуйте.

Для решения описанной задачи можно использовать компонент "Текст" (при необходимости можно настроить внешний вид аналогичный компоненту "Поле"), который нужно связать с исходной переменной и на событие "OnDataChange" написать универсальный скрипт:
Код: (delphi)
begin
  if Sender is TM_Text then
    with Sender as TM_Text do
    begin
      if AsFloat > 1 then
        Text := FormatFloat('0', AsFloat)
      else
        Text := FormatFloat('0.00E+00', AsFloat);
    end;
end.

Цитировать
Свойство Format ведь доступно только для чтения?
Формат можно поменять у переменной (например, Variable.Format := '0'; ), но это повлияет на отображение и ввод переменной во всех объектах связанных с ней. В примере выше, переменная будет отображаться с заданным форматом в объекте "Текст" и при этом будет доступна для изменения из других компонентов в формате, заданном при создании переменной. 

Цитировать
Не планируется ли сделать для пользователей возможность конструировать свои объекты типа фигура, т.к. эллипса и прямоугольника не хватает? Ну или дать возможность из набора эллипсов и прямоугольников собирать один объект с едиными свойствами.
Добавление таких возможностей не планируется. В последнем обновлении были добавлены новые типы фигур: треугольник и ромб. Также, можно добавить в проект свое Изображение с нужной фигурой и использовать его.

Цитировать
Можно ли указать в руководстве какие свойства доступны на запись, а какие только на чтение? Было бы полезно. Или укажите если я не заметил это.
У свойств, которые доступны только для чтения, имеется соответствующая пометка в описании. Например, см. свойство "StatesCount".
« Изменён: 03 Сентября 2024, 18:57:26 от Simple-Scada »

Кирилл_ШКЫ

  • Новичок
  • *
  • Сообщений: 5
    • Просмотр профиля
Большое спасибо за помощь!

Правильно ли я понимаю, что свойства классов классов TM_Object и TM_Control наследуются только на чтение? А переменная же не наследует свойство Format, оно у неё "собственное"(скрин 2), потому доступно на запись.

Если да, то, по возможности, добавьте это уточнение в руководство(скрин 1), было бы удобно.
« Изменён: 03 Сентября 2024, 21:00:57 от Simple-Scada »

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1247
    • Просмотр профиля
Здравствуйте.

Цитировать
Правильно ли я понимаю, что свойства классов классов TM_Object и TM_Control наследуются только на чтение?
Нет, неправильно. В классах TM_Object и TM_Control имеются как свойства доступные для записи, так и доступные только для чтения. В руководстве, для свойства Format класса TM_Object добавили пометку, что оно доступно только для чтения.

Цитировать
А переменная же не наследует свойство Format, оно у неё "собственное"
Да, у переменной имеется отдельное свойство Format.