Руководство программиста
Глава 1. Устройство RDS
§1.4. Параметры и внешний вид блоков
Описывается внутренняя структура блоков RDS, способы задания их внешнего вида в окне подсистем, возможности взаимодействия блоков с пользователем.
Помимо модели блока, на его поведение и внешний вид влияют различные параметры. Эти параметры могут различаться у разных блоков с одной и той же моделью, что позволяет использовать одну модель для целого семейства похожих блоков. Например, стандартные блоки числовой индикации и ввода числа используют одну и ту же функцию модели из библиотеки «Common.dll».
Каждый блок схемы имеет имя, уникальное в пределах родительской подсистемы. Имя блока – это строка произвольной длины, которая не может содержать символов двоеточия, доллара и коммерческого AT («:», «$» и «@»). При создании нового блока или загрузке его из библиотеки имя ему присваивается автоматически, позже оно может быть изменено пользователем (рис. 5) или сервисной функцией. Для удобства пользователя имя блока обычно отображается в окне подсистемы непосредственно под изображением этого блока, но, при необходимости, оно может быть перемещено или вообще отключено. Полное имя блока начинается с двоеточия, за которым следует последовательное перечисление через двоеточие всех имен подсистем на пути от корневой подсистемы до этого блока, которое завершается именем самого блока. Например, полное имя «:Sys1:Sys100:Block1» говорит о том, что блок с именем «Block1» находится в подсистеме «Sys100», которая, в свою очередь, находится в подсистеме «Sys1» корневой подсистемы. Полное имя блока в схеме всегда уникально.
Рис. 5. Параметры блока – общие
Комментарий блока – это произвольный текст, связанный с блоком, который может быть задан пользователем (в окне параметров блока) или сервисными функциями. RDS позволяет искать и выделять блоки, содержащие какой-либо текст в комментарии. При необходимости, модель блока может хранить в комментарии какие-либо данные в текстовом виде, однако, для этого есть более удобные способы.
Внешний вид блока в окне подсистемы может задаваться одним из трех способов: картинкой, прямоугольником с текстом, или рисоваться моделью блока (рис. 6).
Рис. 6. Параметры блока – внешний вид
Картинка блока – это набор векторных элементов: прямоугольников, линий, многоугольников, блоков текста и т.п. Некоторые элементы и группы элементов могут быть связаны с переменными блока, в этом случае в режимах моделирования и расчета внешний вид блока будет отражать изменения этих переменных – элементы будут появляться, исчезать, перемещаться и поворачиваться, будет меняться их текст, цвет и т.п. Картинка задается в векторном редакторе, встроенном в RDS, который вызывается из вкладки «» окна параметров блока кнопкой «». Если для блока задано отображение картинкой, а сама картинка не задана, блок будет иметь стандартный внешний вид, определяемый его типом.
Прямоугольник с текстом обычно используется в тех случаях, когда блоку не требуется анимированное векторное изображение – для большинства простых блоков достаточно названия в прямоугольной рамке. В окне параметров блока можно задать цвет прямоугольника, шрифт, текст (может быть несколько строк) и выравнивание текста внутри прямоугольника. Связать текст с какой-либо переменной блока в этом случае нельзя.
Рисование функцией модели – самый сложный способ задания внешнего вида блока. Модель может использовать стандартные функции Windows API (в модель передается контекст, на котором нужно рисовать) или сервисные функции-оболочки RDS. Рисование целесообразно применять для сложных блоков, внешний вид которых зависит от многих параметров (например, для графиков). Программное рисование внешнего вида блока рассматривается в §2.10.
Независимо от способа задания внешнего вида блока, его модель может нарисовать какие-либо дополнительные элементы поверх изображения (для этого существует специальное событие, на которое может отреагировать модель, см. §2.10.3). Можно, например, отображать таким образом состояние блока, или привлечь внимание пользователя к блоку, перечеркнув его изображение при возникновении каких-либо ошибок.
Способ запуска блока определяет момент срабатывания модели блока в режиме расчета. При запуске по сигналу модель будет запущена только в том случае, если значение первой статической переменной блока (Start) будет равно единице. При запуске каждый такт (см. рис. 5) модель будет запускаться постоянно независимо от значения переменной. Этот параметр может быть изменен как пользователем, так и вызовом сервисной функции из модели блока.
Отдельная группа параметров разрешает или запрещает реакцию блока на действия пользователя (рис. 7). Например, для того, чтобы блоки реагировали на нажатие кнопок мыши, нужно не только включить в модель обработку соответствующего события, но и разрешить реакцию на мышь в параметрах конкретных блоков с этой моделью. Можно разрешить или запретить следующие реакции:
Рис. 7. Параметры блока – модель и реакции
- реакция на мышь: нажатие и отпускание кнопок мыши и перемещение курсора с нажатыми кнопками;
- перемещение курсора мыши без нажатия кнопок (включается, только если включена реакция на мышь);
- функция настройки – специальный вызов модели для ввода параметров блока, который связан с пунктом «» контекстного меню этого блока в режиме редактирования (при желании, можно изменить имя этого пункта);
- всплывающая подсказка блока – модель блока может сформировать текст подсказки (см. §2.11) и, при необходимости, указать время, которое подсказка будет отображаться;
- реакция на клавиатуру;
- для подсистем можно также разрешить реакцию на мышь и клавиатуру в окне этой подсистемы, если ни один блок внутри этой подсистемы не среагировал на событие.
Если для блока разрешена функция настройки, можно также включить ее вызов по двойному щелчку в режиме редактирования (см. рис. 5, по умолчанию по двойному щелчку открывается окно параметров блока).
Кроме стандартных, блок может иметь произвольное количество специализированных параметров, с которыми может работать только его модель. Для хранения таких параметров предназначена личная область данных блока. Для каждого блока в RDS хранится указатель на область памяти, которая может создаваться (в языке C++ – при помощи оператора new или функции malloc) и освобождаться (в C++ – оператором delete или функцией free) моделью блока. RDS не имеет доступа к личной области данных блока, все действия по ее обслуживанию должны выполняться в модели. При создании нового блока указателю на личную область данных присваивается нулевое значение (NULL), после чего RDS больше никогда к нему не обращается. Если модель отвела себе память под личную область и хранит там какие-либо параметры, она должна освободить эту область самостоятельно при уничтожении блока, иначе возможны утечки памяти. Поскольку RDS не работает с личной областью, при записи и загрузке схемы все действия по сохранению и загрузке параметров, которые хранятся в личной области, а также по созданию пользовательского интерфейса для редактирования этих параметров тоже должны выполняться моделью блока. Обычно для редактирования параметров используется функция настройки блока (пример модели с функцией настройки параметров приведен в §2.7.1).