Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все по ФБ (VS6).doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
210.43 Кб
Скачать

Использование групп, набор входов которых определяется пользователем.

Шаблон CFBPropPageImpl предназначен для создания страничек свойств функциональных блоков. Этот шаблон обеспечивает управление составом группы входов этого ФБ (определенной с помощью макроса FREE_PINGROUP_DEF) со стороны пользователя (добавление входа, удаление входа, переименование, перетаскивание выходов из дерева).

Определение группы free_pingroup_def в фб.

С помощью этого макроса можно определить группу входов, которая может содержать входы с произвольными именами и произвольных типов.

Для этого в раздел BEGIN_FB_MAP нужно поместить строчку

FREE_PINGROUP_DEF (GROUP_ID, "Group Name"),

где GROUP_ID – идентификатор группы (определенный в BEGIN_GROUP_NAMES_DEF),

"Group Name" – имя группы.

Группа изначально создается пустой. Добавление и удаление входов обычно осуществляется со странички свойств с использованием шаблона CFBPropPageImpl.

Необходимо обеспечить персистентность структуры блока. Если функциональный блок использует класс IPersistStreamInitImpl (из ATL) для обеспечения своей персистентности, то достаточно в описание класса поместить макрос FB_STANDARD_LOAD_SAVE (CMyClass).

Если же интерфейс IpersistStreamInit реализуется вручную, то в функцию Load нужно добавить LoadItems (pStm), а в функцию Save - SaveItems (pStm).

Инструкция по внедрению шаблона cfbPropPageImpl в страничку свойств функционального блока.

  • В редакторе ресурсов создать ListView установить стиль просмотра Report, назначив ему ID = IDC_LIST_GROUPMAP и установить стиль просмотра - Report, создать кнопки «Добавить» и «Удалить» (IDC_ADD_GROUPMAP и IDC_DEL_GROUPMAP соответственно).

  • В header-файл класса странички свойств добавить #include "FBPropPageImpl.h".

  • Нужно определить идентификаторы групп функционального блока (из BEGIN_GROUP_NAMES_DEF). Описать их как enum еще раз в страничке свойств. Например:

enum

{

SINGROUP,

SAWGROUP,

FREEGROUP

};

  • Параметризовать шаблон CFBPropPageImpl (поскольку он используется в 2 местах лучше его переименовать) :

class CMyPP;

typedef CFBPropPageImpl<CMyPP, GROUP_ID> CGROUPImpl; где CMyPP – класс странички свойств, GROUP_ID – идентификатор группы, CGROUPImpl – произвольный идентификатор.

  • В список базовых классов добавить CGROUPImpl (переименованный шаблон CFBPropPageImpl).

  • В раздел BEGIN_MSG_MAP вначале вставить переадресацию сообщений базовому классу CHAIN_MSG_MAP (CGROUPImpl).

  • В функции Apply вызвать HRESULT hr = ApplyGroup(); (определена в CFBPropPageImpl). Эта функция переносит набор входов, сформированный на страничке свойств, в определение группы в функциональном блоке.

При получении сообщения WM_INITDIALOG описание набора входов из ФБ заносится в массив m_items, а также формируется ListView. Массив m_items модифицируется при добавлении, удалении, переименовании. Позиции входов в массиве m_items соответствуют позициям в ListView.

Функциональный блок содержит подобный массив. Функция ApplyGroup() очищает этот массив и заносит в него описания всех входов из массива странички свойств m_items.

Атрибуты входов, находящихся в группе free_pingroup_def.

Имя – отображается в дереве проекта. Может меняться (при переименовании входа в ListView).

Индекс – позиция данного входа в массиве входов данной группы. Может меняться при удалении других входов.

ID – однозначно идентифицирует вход. Присваивается при первоначальном создании входа.

Тип – при перетаскивании выхода устанавливается равным типу выхода.

Значение по умолчанию – …