Под своим компонентом я подразумеваю класс, производный от FBComponent. Почему это может быть нужно, есть несколько преимуществ:

  • FBComponent имеет возможность реализации внутренних свойств properties, причем присутствуют все методы для их регистрации и управления. Об этом я писал не так давно в своем блоге. Мне свойства очень пригодились, ведь есть визуальный компонент BrowserProperties, в котором можно просматривать свойства своего компонента и непосредственно работать с ними. Это очень удобно!

  • поддержка мета информации о классе и его свойствах, часто используется ClassName, TypeInfo
  • использование callback’ов
  • задавать флаги существования объекта, в том числе для авто освобождения памяти из-под данного класса или для контроля наличия только одного экземпляра.

Однако чтобы работать с метаинформацией и с объектом, унаследованным от FBComponent, его следует зарегистрировать в МоБи, иначе будет краш кучи.

1. Для удобства декларации основных методов и типов, имеется заготовка FBClassDeclare, в которой нужно указать свой класс и родителя, в данном случае FBComponent

1
2
3
4
class CEPointsCloud : public FBComponent
{
FBClassDeclare( CEPointsCloud, FBComponent );
...

2. Конструктор класса должен обязательно содержать вызов FBClassInit и вызывать конструктор FBComponent с указанием родителя (чаще всего просто NULL)

1
2
3
4
5
CEPointsCloud::CEPointsCloud()
: FBComponent(NULL)
{
FBClassInit;
}

А в случае когда объекту требуется вводит новые свойства, это лучше сделать, переопределив метод FBCreate и там описав все необходимые вызовы. Аналогично дело обстоит и с освобождением памяти, это следует делать не в деструкторе, а переопределяя методы FBDestroy, FBDelete.

3. В коде вызываем заготовку FBClassImplementation для того чтобы реализовать базовые методы, созданные через FBClassDeclare.

1
FBClassImplementation( CEPointsCloud );

Далее следует ввести статическую операцию по созданию нового класса, она имеет вид

1
typedef HIObject (* kObjectCreatorFnc)(HIObject pOwner,char *pName,void *pData);

в данном случае для нашего класса будет такая функция

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static HIObject RegisterPointsCloud(HIObject pOwner,char *pName,void *pData)

{

CEPointsCloud *Class = new CEPointsCloud();

if (Class->FBCreate() ) {

return Class->GetHIObject();

} else {

delete Class;

return NULL;

}

}

это позволяет выделить память под наш новый класс для МоБи.

? следует описать заготовку FBLibraryModule, которая вводит саму функцию регистрации для объекта. При этом мы указываем категорию объекта и мета имя для создания данного класса

1
2
3
4
5
6
7
8
9
FBLibraryModule( CEPointsCloud )

{

FBRegisterObject( CEPointsCloud, "PointsCloud/Object", "CEPointsCloud", "Object",

RegisterPointsCloud, true, FB_DEFAULT_SDK_ICON );

}

4. Остается только зарегистрировать описанную выше функцию для нового класса. Это делается в ходе объявления самой библиотеки, например

1
2
3
4
5
6
7
8
9
10
11
12
13
//--- Library declaration.

FBLibraryDeclare( ortool_template )

{

FBLibraryRegister( CEPointsCloud );

FBLibraryRegister( ORTool_Template );

}

FBLibraryDeclareEnd;

Такой вот процесс, новым классом можно пользоваться

1
2
3
mOptical = (CEPointsCloud*)FBCreateObject( "PointsCloud/Object",

"CEPointsCloud", "CEPointsCloud" );
Свой компонент в OR SDK
Метки:        

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *