Казалось бы мелочь, но как?? или создание своего класса!
Вот такой наивынй вопрос. Хочу создать класс для хранение узла определенной сложной структуры данных. В общем класс! Как в билдере это сдлеть
То есть с классами их панели компонент все яснее ясного, драг и дроп как говориться. А вот свой , просто с плюсный класс??
С Уважением, Александра!
Привет всем!
Вот такой наивынй вопрос. Хочу создать класс для хранение узла определенной сложной структуры данных. В общем класс! Как в билдере это сдлеть
То есть с классами их панели компонент все яснее ясного, драг и дроп как говориться. А вот свой , просто с плюсный класс??
С Уважением, Александра!
Советую по своему рецепту:
Если хочешь сделать VCL компонент чтобы добавить его в палитру билдеровских компонентов, для начала пишешь сам класс! Отлаживаешь его - чтобы все работало без изъяна.
Затем следующие действия:
В билдеровском меню выбираешь контекстное меню Component->New Component
В появившемся диалоге указываешь:
Ansector Type: - либо родительский класс твоего класса (если он child) либо TComponent - ежели пишешь класс с нуля.
Class Name - имя своего класса
Palette Page - Имя закладки в палитре компонентов - можешь укзать либо сществующую, либо создать свою.
Unit File Name: - имя cpp-шника куда будет сгенерен код компонента.
Будет создан следующий файл:
К примеру я назвал компонент TComponent1:
CPP:
//---------------------------------------------------------------------------
#include <basepch.h>
#pragma hdrstop
#include "Component1.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//
static inline void ValidCtrCheck(TComponent1 *)
{
new TComponent1(NULL);
}
//---------------------------------------------------------------------------
__fastcall TComponent1::TComponent1(TComponent* Owner)
: TComponent(Owner)
{
}
//---------------------------------------------------------------------------
namespace Component1
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TComponent1)};
RegisterComponents("Samples", classes, 0);
}
}
//---------------------------------------------------------------------------
H:
//---------------------------------------------------------------------------
#ifndef Component1H
#define Component1H
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
//---------------------------------------------------------------------------
class PACKAGE TComponent1 : public TComponent
{
private:
protected:
public:
__fastcall TComponent1(TComponent* Owner);
__published:
};
//---------------------------------------------------------------------------
#endif
Вот теперь делаешь следующее:
В h файл со спокойной душой вставляешь хидерсвоего VCL класса.
А вот с CPP поступаешь следующим образом:
Оставляешь обязательно:
//---------------------------------------------------------------------------
#include <basepch.h>
#pragma hdrstop
#include "Component1.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//
static inline void ValidCtrCheck(TComponent1 *)
{
new TComponent1(NULL);
}
//---------------------------------------------------------------------------
и
//---------------------------------------------------------------------------
namespace Component1
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TComponent1)};
RegisterComponents("Samples", classes, 0);
}
}
//---------------------------------------------------------------------------
А вот между этими кусками втыкаешь код своего класса! Обязательно между ними!
(в свое время много мучился с этим делом на 4 билдере - там как раз от перемены мест слагаемых начинались глюки).
Когда cpp и h файлы готовы, делаешь следующее:
Лезем в билдере в контекстное меню:
Component->Install Component
В появившемся диалоге:
Закладка Into existing package - устанавливает компонент в существующий пэкэдж компонентов.
Закладка Into new package - устанавливает компонент в новый пэкэдж компонентов.
Выбираешь либо то, либо это,
Unit File Name - выбираешь cpp-шник.
А дальше все просто - в появившемся окошке жмешь compile - а потом install.
Все твой компонент будет добавлен в палитру.
ВАЖНО!
После установки компонента желательно чтобы
.bpl и .bpi файлы валялись в билдеровской директории в папке projects\bpl projects\lib (для сокращения геморроя).
Потом обязательно h файл своего компонента закидываешь в директорию, которая доступна для компилятора (я кидаю в билдеровскую директорию include\vcl) и все obj файлы тоже должны находиться в доступном месте - я их направляю в билдеровскую директорию lib\obj.
Вроде все. Может чего напутал, но сам через день два буду добавлять свой компонент - ежели чего не так сделал - исправлю и сообщю подробности!
:D
Советую по своему рецепту:
Спасибо, ты все просто супер описал, буду пробовать.Но для этого нужно решить вначале первую проблему- как оттестироать класс, Если после добавления к проекту файлов Node.cppp b node.h со следующим содерижмим
class CNode :public TObject
{
protected :
int ID;
public :
int getID(){return this->ID;}
}
прокет просто не компилисться((
Пишет [C++ Error] Unit2.h(13): E2176 Too many types in declaration
что это моет быть?
Спасибо, ты все просто супер описал, буду пробовать.Но для этого нужно решить вначале первую проблему- как оттестироать класс, Если после добавления к проекту файлов Node.cppp b node.h со следующим содерижмим
class CNode :public TObject
{
protected :
int ID;
public :
int getID(){return this->ID;}
}
прокет просто не компилисться((
Пишет [C++ Error] Unit2.h(13): E2176 Too many types in declaration
что это моет быть?
Во первых:
{
protected :
int ID;
public :
int getID(){return this->ID;}
};
Должно быть вот так! Т.е. пропущена точка с запятой. Это как раз и причина появления ошибки.
Во вторых: желательно иметь конструктор по умолчанию. Или пустой конструктор.