Hola:¿ Que versión de C++Builder utilizas ? Ya que este tipo de cosas ha ido variando levemente entre versiones.
Aquí te va un ejemplo con comentarios, espero que te sirva y lo puedas entender, sino dime que partes no entiendes e intentare ayudarte:
### Cabecera - ComponentePrueba.h
code:
//---------------------------------------------------------------------------#ifndef ComponentePruebaH
#define ComponentePruebaH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
//---------------------------------------------------------------------------
#include <DesignEditors.hpp> // En versiones anteriores a la 6
// debemos usar #include <DsgnIntf.hpp>
//---------------------------------------------------------------------------
/// Nuestro nuevo tipo de propiedad de prueba ///////////////////////////////
class TMiPropiedad : public TPersistent
{
private:
int _variableEjemplo;
public:
void __fastcall Assign(TPersistent *nuevoValor)
{
TMiPropiedad *objeto = dynamic_cast<TMiPropiedad*>( nuevoValor );
VariableEjemplo = objeto->VariableEjemplo;
}
__published:
__property int VariableEjemplo = {read=_variableEjemplo,
write=_variableEjemplo};
};
//---------------------------------------------------------------------------
/// Editor de propiedades de prueba /////////////////////////////////////////
// como ejemplo vamos a poner todo el codigo del editor de propiedades
// en esta cabecera
class PACKAGE TPropiedadPrueba : public TClassProperty
{
public:
// En versiones anteriores a la 6 cambiamos
// _di_IFormDesigner por _di_IDesigner
__fastcall TPropiedadPrueba(const _di_IDesigner ADesigner, int APropCount)
: TClassProperty(ADesigner, APropCount) { }
virtual TPropertyAttributes __fastcall GetAttributes(void)
{
// Aqui es donde le decimos que muestre ese botoncito ...
return TPropertyAttributes() << paDialog;
}
virtual void __fastcall Edit(void)
{
// Aqui mostramos el form o la tarea que se tiene que ejecutar
// al pulsar ese botoncito
TMiPropiedad *miPropiedad = reinterpret_cast<TMiPropiedad*>(GetOrdValue());
miPropiedad->VariableEjemplo =
MessageBox(NULL, "Seleccione una respuesta", "Pregunta", MB_YESNO);
}
};
//---------------------------------------------------------------------------
class PACKAGE TComponentePrueba : public TComponent
{
private:
TMiPropiedad *_propiedadPrueba;
protected:
public:
__fastcall TComponentePrueba(TComponent* Owner);
__fastcall ~TComponentePrueba();
__published:
__property TMiPropiedad *PropiedadPrueba = {read=_propiedadPrueba,
write=_propiedadPrueba};
};
//---------------------------------------------------------------------------
#endif
### Implementación - ComponentePrueba.cpp
code:
//---------------------------------------------------------------------------
#include <vcl.h>#pragma hdrstop
#include "ComponentePrueba.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(TComponentePrueba *)
{
new TComponentePrueba(NULL);
}
//---------------------------------------------------------------------------
__fastcall TComponentePrueba::TComponentePrueba(TComponent* Owner)
: TComponent(Owner)
{
_propiedadPrueba = new TMiPropiedad;
}
//---------------------------------------------------------------------------
__fastcall TComponentePrueba::~TComponentePrueba()
{
delete _propiedadPrueba;
}
//---------------------------------------------------------------------------
namespace Componenteprueba
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(TComponentePrueba)};
RegisterComponents("_Leo", classes, 0);
// Registramos nuestro editor de propiedades
RegisterPropertyEditor(
__typeinfo(TMiPropiedad), // Tipo de propiedad
__classid(TComponentePrueba), // Componente que va a usar el editor
"PropiedadPrueba", // Nombre de la propiedad
__classid(TPropiedadPrueba) // Nuestro editor
);
// Si queremos que el editor sirva para todas las propiedades
// del mismo tipo en cualquier componente lo anterior cambiaria:
//RegisterPropertyEditor( __typeinfo(TMiPropiedad),
// 0, "", __classid(TPropiedadPrueba) );
}
}
//---------------------------------------------------------------------------
Si quieres puedes bajarte todo el código del ejemplo para BCB6 con "package" compilado incluido y una pequeña modificación para BCB1
Saludos:
_Leo