- •Введение
- •Создание функциональных блоков Создание новой библиотеки функциональных блоков
- •Последовательность разработки функциональных блоков
- •Использование групп, набор входов которых определяется пользователем.
- •Определение группы free_pingroup_def в фб.
- •Инструкция по внедрению шаблона cfbPropPageImpl в страничку свойств функционального блока.
- •Атрибуты входов, находящихся в группе free_pingroup_def.
- •Получение событий от таймера
- •Получение текущего времени
- •Проверка правильности в страничках свойств.
- •Использование таймера в функциональных блоках.
- •Признаки качества в Функциональных блоках Коды признака качества значения
- •Установка признаков качества выходов фб
- •Получение признака качества
- •Передача признаков качества входа выходу
- •Сообщения в фб.
- •Вывод информация об ошибках в фб в протокол работы.
- •Восстановление состояния фб при горячем рестарте.
- •Страницы свойств фб
- •Справка к фб
- •Справка к страницам свойств фб
- •Разработка визуальных фб на основе существующей библиотеки фб
- •Создание общего h-файла (подкл в файл описания фб и файл описания контрола)
- •Изменения в создании фб
- •Создание ActiveX контрола
- •Чтобы создать свойства нужно:
Создание ActiveX контрола
С пом wizard создать New ATL object -> controls -> Full control.
Подключить файл #include "IVisualControlImpl.h"
В список наследования добавить public IVisualControlImpl<ИмяКлассаКонтрола>
В список интерфейсов добавить макрос VISUAL_CONTROL_ENTRY
Обеспечить персистентность данных, отвечающих за связь, с помощью функций LoadFBData (pStream) и SaveFBData (pStream). Это можно сделать автоматически, вставив в декларацию класса макрос VISUAL_CONTROL_STANDARD_LOAD_SAVE(ИмяКлассаКонтрола) (в классе также должен быть указан раздел BEGIN_PROP_MAP).
Если в списке наследования есть класс IPerPropertyBrowsingImpl<ControlClass>, заменить его на IPerPropertyBrowsingImplFixed<ControlClass>.
Поскольку контрол реализует два dual-интерфейса, необходимо разрешить неоднозначность, возникающую для декларации в COM MAP интерфейса IDispatch. Это можно сделать, заменив вводящий его макрос COM_INTERFACE_ENTRY(IDispatch) на макрос COM_INTERFACE_ENTRY2, наподобие следующего:
COM_INTERFACE_ENTRY2(IDispatch, INewControl)
Доступ к переменным, как и в ФБ (последние два пункта).
Чтобы создать свойства нужно:
создать страницу свойств: New ATL Object - Property Page
в BEGIN_PROP_MAP //контрола
PROP_PAGE(CLSID_ИмяСтрСвойств) // вписать (без «С»)
Добавить свойство контролу правой кнопкой на интерфейсе, указать имя, тип.
в
BEGIN_PROP_MAP
PROP_ENTRY(«Описание», N, CLSID_ИмяСтрСвойств)
N взять из интерфейса, там где id(N)
В контроле описать переменную того же типа (напр int X) и заполнить функции
…get…
{ *pVal = X;}
и
…put…
{X = pVal;}
В OnInitDialog (который надо добавить через Add Windows Message Handler для WM_INITDIALOG)
CComQIPtr<ИмяИнтерфейса>pEx(m_ppUnk[0]); //pEx – любое имя
ASSERT(pEx)
If (!pEx) return 1;
Завести переменную типа свойства
int X
вызвать pEx->…get…(&X)
в конце вызвать SetDirty(FALSE)
в Apply()
сначала
If (!pEx) return 1;
Завести переменную типа свойства
int X
вызвать pEx->…get…(&X)
потом pEx->put…
8. Добавить функции, которые реагируют на изменения в стр всойств. На классе РР сделать Add WM Handler, выбрать нужный элемент управления, слева выбрать сообщение, добавить функцию. В добавленной функции сделать SetDirty(TRUE), в put-ах вызвать FireViewChange(), если MASTERGraph не перерисовывает автоматически.
Замечание: не стоит разделять функциональность между ФБ и контролом, так как мнемосхемы могут открываться и закрываться в runtime, при этом контролы будут создаваться и уничтожаться. Также, если необходимо использовать информацию о предыдущих состояниях, не следует хранить ее в контроле.
