Pzl-Компонента: различия между версиями
Строка 1: | Строка 1: | ||
=Необходимые условия признания класса компонентой= | =Необходимые условия признания класса pzl-компонентой= | ||
Любой класс, порождающий объекты (имеющий интерфейс), может быть признан компонентой, если | Любой класс, порождающий объекты (имеющий интерфейс), может быть признан компонентой, если | ||
#Имя интерфейса и имя класса различаются; | #Имя интерфейса и имя класса различаются; | ||
Строка 64: | Строка 64: | ||
#include @"pfc\core.ph" | #include @"pfc\core.ph" | ||
</vip> | </vip> | ||
=Константа Описания Компоненты сomponentDescriptor_C= | |||
Константа описания pzl-компоненты является важной составной частью ее интерфейса. Эта константа описывает важные свойства компоненты, необходимые для ее использования. Константа сomponentDescriptor_C соответствует домену pzlDomains::pzlComponentInfo_D, объявленному в интерфейсном файле pzlDomains: | |||
<vip> | |||
pzlComponentInfo_D=pzlComponentInfo | |||
( | |||
string Alias, | |||
entityUID_D ComponentID, | |||
booleanInt Runable, | |||
core::namedValue_List UserDefinedInfo | |||
). | |||
</vip> | |||
==Параметр ComponentID== | |||
Этот параметр описания определяет идентификатор компоненты, который (по-возможности) должен быть уникальным в глобальном смысле. То есть две программы в глобальном информационном пространстве (не говоря уже об одном копьютере), использующие компоненты с одним и тем же идентификатором могут быть уверены, что они используют точно одну и ту же pzl-компоненту. Этого можно добиться, если использовать способ, аналогичный способу, применяемому Microsoft для идентификации COM-компонент. | |||
Для этого в pzl-технологии используется структура с функтором uid: | |||
<vip> | |||
uid( | |||
core::unsigned32 Unsigned, | |||
core::unsigned16 Short1, | |||
core::unsigned16 Short2, | |||
core::unsigned8 Byte1, | |||
core::unsigned8 Byte2, | |||
core::unsigned8 Byte3, | |||
core::unsigned8 Byte4, | |||
core::unsigned8 Byte5, | |||
core::unsigned8 Byte6, | |||
core::unsigned8 Byte7, | |||
core::unsigned8 Byte8). | |||
</vip> | |||
что, на самом деле является полным аналогом структуры core::nativeGuid системы Visual Prolog. | |||
Идентификатор ComponentID используется в двух случаях: | |||
*Он является идентификатором, под которым в реестре Windows или в файле регистрации приложения записывается регистрационная информация о компоненте | |||
*Он является идентификатором, под которым эта компонента зарегистрирована в pzl-контейнере | |||
Поскольку идентификатор в форме uid является громоздкой последовательностью цифр и букв, то применять его в процессе освоения технологии неудобно. | |||
С целью упрощения процесса освоения имеется вторая версия представления идентификатора - строковая - в форме str(string). Естественно, уникальность строкового представления обеспечить крайне трудно, но в процессе освоения, можно пожертвовать глобальной уникальностью и контролировать только уникальность идентификатора на данном компьютере. | |||
В результате мы получаем две альтернативные формы представления идентификатора в объявлении домена entityUID_D: | |||
<vip> | |||
entityUID_D= | |||
str(string); | |||
uid(unsined16,...). | |||
</vip> | |||
==Параметр Alias (Условное имя)== | |||
Наряду с уникальным идентификатором, pzl-технология предоставляет воможность присвоить каждой компоненте условное, содержательное имя, являющееся строкой символов. Однако уникальность Условного Имени (Alias) не является жестким требованием. | |||
Так, Вы можете создать несколько текстовых редакторов с различными свойствами, которые поддерживают одни и те же интерфейсы. Каждый из этих текстовых редакторов будет иметь уникальный идентификатор типа entityUID_D. Но все они могут иметь одно и то же условное имя "Текстовый Редактор". Тогда Ваша программа может при создании экземпляра pzl-компоненты использовать имя "Текстовый Редактор" и будет создаваться экземпляр той компоненты, которая в данный момент зарегистрирована на Вашем компьютере. Перерегистрировав новый редактор, вместо старого, Ваша программа будет использовать новый редактор с другими свойствами. | |||
Однако не следует забывать, что все коллизии, связанные с возможной неуникальностью условных имен, должны разрешаться программистом. | |||
Условное имя может использоваться различными средствами pzl-технологии для идентификации компонент как на экране, так и в сообщениях об ошибках. | |||
==Параметр Runable== | |||
==Параметр UserDefinedInfo== | |||
=Пример описания pzl-компоненты= | |||
В реальной компоненте константа описания может выглядеть так: | |||
<vip> | |||
constants | |||
componentDescriptor_C:pzlDomains::pzlComponentInfo_D=pzlDomains::pzlComponentInfo | |||
( | |||
componentAlias_C, | |||
componentID_C, | |||
componentRunAble_C, | |||
componentMetaInfo_C | |||
). | |||
componentID_C:pzlDomains::entityUID_D=pzlDomains::str("ComponentExample"). | |||
componentAlias_C="ПримерКомпоненты". | |||
componentRunAble_C=b_True. | |||
componentMetaInfo_C:namedValue_List=[]. | |||
</vip> | |||
[[Категория:VpPuZzle]] | [[Категория:VpPuZzle]] |
Версия 11:26, 18 октября 2007
Необходимые условия признания класса pzl-компонентой
Любой класс, порождающий объекты (имеющий интерфейс), может быть признан компонентой, если
- Имя интерфейса и имя класса различаются;
- Декларация класса содержит единственный конструктор new(object ИспользуемыйОбъект);
- Интерфейс класса поддерживает интерфейс pzlComponent;
- Интерфейс класса включает декларацию константы сomponentDescriptor_C с типом pzlDomains::pzlComponentInfo_D;
- Имплементация класса наследует от класса pzlComponent;
- Пакетный файл деклараций класса (.PH) включает файл "System\Packs\pzlcomponent\pzlcomponent.ph".
Ниже приведены фрагменты различных составляющих компоненты, удовлетворяющей перечисленным выше условиям.
Декларация класса содержит коструктор new(...) и имя интерфейса отличается от имени класса. При этом класс содержит единственный конструктор new:(object UsingObject)
class сomponentExample:iComponentExample constructors new:(object UsingObject). end class
Интерфейс класса содержит квалификатор supports pzlComponent и декларацию константы componentDescriptor_C типа pzlDomains::pzlComponentInfo_D
interface iComponentExample supports pzlComponent open core constants componentDescriptor_C:pzlDomains::pzlComponentInfo_D=pzlDomains::pzlComponentInfo ( componentAlias_C, componentID_C, componentRunAble_C, componentMetaInfo_C ). componentID_C:pzlDomains::entityUID_D=pzlDomains::str("ComponentExample"). componentAlias_C="ПримерКомпоненты". componentRunAble_C=b_True. componentMetaInfo_C:namedValue_List=[]. predicates show:(). end interface iComponentExample
Имплементация класса содержать директиву наследования inherits pzlComponent и содержит клаузу для конструктора new(UsingObject)
implement componentExample inherits pzlComponent clauses new(UsingObject):- pzlComponent::new(), ... clauses show():- ... end implement componentExample
Файл деклараций пакета ComponentExample.PH содержит директиву включения файла PzlComponent.ph
#requires ... #include @"System\Packs\pzlcomponent\pzlcomponent.ph" #include @"pfc\core.ph"
Константа Описания Компоненты сomponentDescriptor_C
Константа описания pzl-компоненты является важной составной частью ее интерфейса. Эта константа описывает важные свойства компоненты, необходимые для ее использования. Константа сomponentDescriptor_C соответствует домену pzlDomains::pzlComponentInfo_D, объявленному в интерфейсном файле pzlDomains:
pzlComponentInfo_D=pzlComponentInfo ( string Alias, entityUID_D ComponentID, booleanInt Runable, core::namedValue_List UserDefinedInfo ).
Параметр ComponentID
Этот параметр описания определяет идентификатор компоненты, который (по-возможности) должен быть уникальным в глобальном смысле. То есть две программы в глобальном информационном пространстве (не говоря уже об одном копьютере), использующие компоненты с одним и тем же идентификатором могут быть уверены, что они используют точно одну и ту же pzl-компоненту. Этого можно добиться, если использовать способ, аналогичный способу, применяемому Microsoft для идентификации COM-компонент. Для этого в pzl-технологии используется структура с функтором uid:
uid( core::unsigned32 Unsigned, core::unsigned16 Short1, core::unsigned16 Short2, core::unsigned8 Byte1, core::unsigned8 Byte2, core::unsigned8 Byte3, core::unsigned8 Byte4, core::unsigned8 Byte5, core::unsigned8 Byte6, core::unsigned8 Byte7, core::unsigned8 Byte8).
что, на самом деле является полным аналогом структуры core::nativeGuid системы Visual Prolog. Идентификатор ComponentID используется в двух случаях:
- Он является идентификатором, под которым в реестре Windows или в файле регистрации приложения записывается регистрационная информация о компоненте
- Он является идентификатором, под которым эта компонента зарегистрирована в pzl-контейнере
Поскольку идентификатор в форме uid является громоздкой последовательностью цифр и букв, то применять его в процессе освоения технологии неудобно. С целью упрощения процесса освоения имеется вторая версия представления идентификатора - строковая - в форме str(string). Естественно, уникальность строкового представления обеспечить крайне трудно, но в процессе освоения, можно пожертвовать глобальной уникальностью и контролировать только уникальность идентификатора на данном компьютере. В результате мы получаем две альтернативные формы представления идентификатора в объявлении домена entityUID_D:
entityUID_D= str(string); uid(unsined16,...).
Параметр Alias (Условное имя)
Наряду с уникальным идентификатором, pzl-технология предоставляет воможность присвоить каждой компоненте условное, содержательное имя, являющееся строкой символов. Однако уникальность Условного Имени (Alias) не является жестким требованием.
Так, Вы можете создать несколько текстовых редакторов с различными свойствами, которые поддерживают одни и те же интерфейсы. Каждый из этих текстовых редакторов будет иметь уникальный идентификатор типа entityUID_D. Но все они могут иметь одно и то же условное имя "Текстовый Редактор". Тогда Ваша программа может при создании экземпляра pzl-компоненты использовать имя "Текстовый Редактор" и будет создаваться экземпляр той компоненты, которая в данный момент зарегистрирована на Вашем компьютере. Перерегистрировав новый редактор, вместо старого, Ваша программа будет использовать новый редактор с другими свойствами.
Однако не следует забывать, что все коллизии, связанные с возможной неуникальностью условных имен, должны разрешаться программистом.
Условное имя может использоваться различными средствами pzl-технологии для идентификации компонент как на экране, так и в сообщениях об ошибках.
Параметр Runable
Параметр UserDefinedInfo
Пример описания pzl-компоненты
В реальной компоненте константа описания может выглядеть так:
constants componentDescriptor_C:pzlDomains::pzlComponentInfo_D=pzlDomains::pzlComponentInfo ( componentAlias_C, componentID_C, componentRunAble_C, componentMetaInfo_C ). componentID_C:pzlDomains::entityUID_D=pzlDomains::str("ComponentExample"). componentAlias_C="ПримерКомпоненты". componentRunAble_C=b_True. componentMetaInfo_C:namedValue_List=[].