C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Про написание компонента
Андрей
Отправлено: 04.03.2005, 11:33


Не зарегистрирован







Такой вопрос возник при написании компонента

Есть компонент
namespace Siemensopc
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(SiemensOPC)};
RegisterComponents("Samples", classes, 0);

}
}

переопределены классы

class PACKAGE NewProperty : public TStringProperty{
private:
protected:
public:
void __fastcall GetValues(Classes::TGetStrProc Proc);
TPropertyAttributes __fastcall GetAttributes(void);
};

//---------------------------------------------------------------------------

class PACKAGE TTagEditor: public TComponentEditor{
private:
protected:
public:
int __fastcall GetVerbCount(void);
AnsiString __fastcall GetVerb(int Index);
void __fastcall ExecuteVerb(int Index);
};

- для переопределения и создания компонент Едитора и подключена в проект designide.bpi

Вопрос — Где проводить регистрацию

RegisterPropertyEditor(*((GetPropInfo(__typeinfo(SiemensOPC), "ServerName"))->PropType),__classid(SiemensOPC),"ServerName",__classid(NewProperty));
RegisterComponentEditor(__classid(SiemensOPC),__classid(TTagEditor));

- нового Проперти Едитора и КомпонентЕдитора?? И если в namespace Siemensopc то как потом приложению сказать, чтобы он вслед за компонентом не тянул designide.bpi ?? Иначе получаеться, что при попытке компиляции он ищет все virtual классов TComponentEditor и TStringProperty и не может их найти
olegenty
Отправлено: 04.03.2005, 12:20


Ветеран

Группа: Модератор
Сообщений: 2412



ты определись, что переопределяешь/добавляешь. а для того, чтобы дизайнерские штучки не тянулись, разбей пакет на Runtime only и Design Time only, и будет тебе счастье...
Андрей
Отправлено: 04.03.2005, 12:39


Не зарегистрирован







Подробнее пожалуйста или ссылку на документацию

Как тогда зарегестрировать для пакета новые

RegisterPropertyEditor
RegisterComponentEditor

olegenty
Отправлено: 04.03.2005, 13:57


Ветеран

Группа: Модератор
Сообщений: 2412



Создать для Property- и ComponentEditor отдельный пакет, Design time only, заинклудить туда Runitme only пакет с компонентом, да и
1. Объявить и определить редакторы компоенента и свойств.
2. Зарегистрировать их указанным тобой способом.
Rius
Отправлено: 06.03.2005, 22:59


Мастер участка

Группа: Участник
Сообщений: 321



Андрей Пример, урезанный только.
CODE
//---------------------------------------------------------------------------
//*.cpp
bool Registered = false;
namespace Opcclient
{
       void __fastcall PACKAGE Register()
       {
                TComponentClass classes[1] = {__classid(TOPCTag)};
                RegisterNoIcon(classes, 0);

                classes[0] = __classid(TOPCClient);
                RegisterComponents("OPC", classes, 0);

                RegisterComponentEditor(classes[0], __classid(TOPCClientEditor));

              PTypeInfo ti = *GetPropInfo(__typeinfo(TOPCClient),"Items")->PropType;
         RegisterPropertyEditor(ti, __classid(TOPCClient),
                       "Items",__classid(TOPCClientProperty));

              ti = *GetPropInfo(__typeinfo(TOPCTag),"ID")->PropType;
         RegisterPropertyEditor(ti, __classid(TOPCTag),
                       "ID",__classid(TOPCTagIDProperty));
       }
}
//---------------------------------------------------------------------------

CODE
//---------------------------------------------------------------------------
//*.h
class TOPCClientEditor : public TComponentEditor
{
private:
       void __fastcall ExecuteVerb(int Index);
       AnsiString __fastcall GetVerb(int Index);
       int __fastcall GetVerbCount();
protected:
public:
};
//---------------------------------------------------------------------------
class TOPCClientProperty : public TPropertyEditor
{
       void __fastcall Edit();
       TPropertyAttributes __fastcall GetAttributes();
       AnsiString __fastcall GetValue();
};
//---------------------------------------------------------------------------
class TOPCTagIDProperty : public TPropertyEditor
{
       TPropertyAttributes __fastcall GetAttributes();
       AnsiString __fastcall GetValue();
};
//---------------------------------------------------------------------------

olegenty Можно ссылку на подробное пошаговое описание с примерами? Летом долго над этим парился, но ничего не получилось разделить. "Дизайнерские штучки тянутся".
(C++Builer 6)
Andrey
Отправлено: 09.03.2005, 09:55


Не зарегистрирован







Да. Получилось разделить. Спасибо. Но действительно хотелось бы примеров больше и узнать по поводу тестирования компонентов. А то при закрытии тестовог оприложения часто падает билдер с криком Аксцесс виалейшен или ошибки VCL выползают.
Rius
Отправлено: 09.03.2005, 10:13


Мастер участка

Группа: Участник
Сообщений: 321



Для тестирования создаёшь компонент в RealTime, а не установкой компонента на форму в дизайнере. К сожалению для редактора свойств это не пройдет.
Литература в т.ч. и по созданию компонент: http://progz.ru/forum/viewtopic.php?t=11128
Andrey
Отправлено: 10.03.2005, 10:00


Не зарегистрирован







Спасибо большое всем, кто откликнулся.
Сейчас гляну книгу.
Rius
Отправлено: 13.03.2005, 09:38


Мастер участка

Группа: Участник
Сообщений: 321



Разделил пакет на runtime и designtime.
Регистрация в первом:
CODE
namespace Opcclient
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TOPCTag)};
RegisterNoIcon(classes, 0);

classes[0] = __classid(TOPCClient);
RegisterComponents("OPC", classes, 0);
}
}

Во втором:
CODE
namespace OpcclientDes
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1];
classes[0] = __classid(TOPCClientEditor);
RegisterComponentEditor(classes[0], __classid(TOPCClientEditor));

PTypeInfo ti = *GetPropInfo(__typeinfo(TOPCClient),"Items")->PropType;
RegisterPropertyEditor(ti, __classid(TOPCClient),
"Items",__classid(TOPCClientProperty));

ti = *GetPropInfo(__typeinfo(TOPCTag),"ID")->PropType;
RegisterPropertyEditor(ti, __classid(TOPCTag),
"ID",__classid(TOPCTagIDProperty));
}
}

Ко второму пакету добавил первый runtime bpi и designide.bpi
Все компилируется без ошибок, но компоненты не появляются на палитре. В чём дело?

Отредактировано Rius — 13/03/2005, 12:18
Rius
Отправлено: 13.03.2005, 11:39


Мастер участка

Группа: Участник
Сообщений: 321



Вот очень простой пример. Исправте кто знает.
Все, вроде разобрался (спустся полгода, и то случайно smile.gif ).

Отредактировано Rius — 13/03/2005, 18:14

User Attached Image Скачать файл
ELabel_2005.03.13_13_38.rar



Вернуться в Вопросы программирования в C++Builder