C++builder Embarcadero XE6中属性编辑器的问题 通常,每一个新版本的C++ Builder都需要几天的修改… 我在修复属性编辑器时遇到问题,代码是:

C++builder Embarcadero XE6中属性编辑器的问题 通常,每一个新版本的C++ Builder都需要几天的修改… 我在修复属性编辑器时遇到问题,代码是:,c++builder,c++builder-xe6,C++builder,C++builder Xe6,*****************H文件 //--------------------------------------------------------------------------- #ifndef ufrmLabelEditorH #define ufrmLabelEditorH //--------------------------------------------------------------------------- #include <System.Cl

*****************H文件

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

#ifndef ufrmLabelEditorH
#define ufrmLabelEditorH
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.Buttons.hpp>
#include <Vcl.ExtCtrls.hpp>

#include <DesignIntf.hpp>
#include <TypInfo.hpp>
#include <DesignEditors.hpp>
#include <Classes.hpp>

// Add DesignIDE.bpi to your package's Requires list in the Project Manager
#pragma comment(lib, "DesignIDE.bpi")



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


class TfrmLabelEditor : public TForm
{
__published:    // IDE-managed Components
TPanel *Panel1;
TMemo *Memo1;
TBitBtn *BitBtn1;
TBitBtn *BitBtn2;
private:    // User declarations
public:     // User declarations
__fastcall TfrmLabelEditor(TComponent* Owner);
};


class PACKAGE TLabelProperty : public TStringProperty
{
public:
virtual Designintf::TPropertyAttributes __fastcall GetAttributes() {
    return TStringProperty::GetAttributes()<<paDialog;
}

virtual void __fastcall Edit(void) {
    TfrmLabelEditor *frmEditor = new TfrmLabelEditor(Application);
    frmEditor->Memo1->Lines->Text = GetStrValue();
    try {
        if (frmEditor->ShowModal()==mrOk) {
            int i;
            for (i = 0; i < PropCount; i++) {
                ((TLabel*)GetComponent(i))->Caption = frmEditor->Memo1->Lines->Text;
            }
            Modified();
        }
    } catch (...) {
    }
    frmEditor->Free();
}

};



//---------------------------------------------------------------------------
extern PACKAGE TfrmLabelEditor *frmLabelEditor;
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "ufrmLabelEditor.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmLabelEditor *frmLabelEditor;
//---------------------------------------------------------------------------
__fastcall TfrmLabelEditor::TfrmLabelEditor(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

namespace Labelproperty {

void __fastcall PACKAGE Register()
{
    TTypeInfo* typeInfo = new TTypeInfo();
    typeInfo->Name = "AnsiString";
    typeInfo->Kind = tkLString;

    Designintf::RegisterPropertyEditor(typeInfo,__classid(TfrmLabelEditor),"Caption",     __classid(TLabelProperty));

    TComponentClass classes[1] = {__classid(TfrmLabelEditor)};
    RegisterComponents(L"SGM", classes, 0);
}
}
//---------------------------------------------------------------------------
#ifndef ufrmLabelEditorH
#定义ufrmLabelEditorH
//---------------------------------------------------------------------------
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
//将DesignIDE.bpi添加到项目管理器中包的需求列表中
#pragma注释(lib,“DesignIDE.bpi”)
//---------------------------------------------------------------------------
类TfrmLabelEditor:公共TForm
{
__已发布://IDE托管组件
TPanel*Panel1;
TMemo*备忘录1;
TBitBtn*BitBtn1;
TBitBtn*BitBtn2;
private://用户声明
public://用户声明
__fastcall TfrmLabelEditor(TComponent*所有者);
};
类包属性:public TStringProperty
{
公众:
虚拟设计intf::TPropertyAttributes\uu快速调用GetAttributes(){
返回TStringProperty::GetAttributes()行->Text=GetStrValue();
试一试{
如果(frmEditor->showmodel()==mrOk){
int i;
对于(i=0;iCaption=frmEditor->Memo1->line->Text;
}
修饰();
}
}捕获(…){
}
frmEditor->Free();
}
};
//---------------------------------------------------------------------------
外部包TfrmLabelEditor*frmLabelEditor;
//---------------------------------------------------------------------------
#恩迪夫
**************CPP文件

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

#ifndef ufrmLabelEditorH
#define ufrmLabelEditorH
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.Buttons.hpp>
#include <Vcl.ExtCtrls.hpp>

#include <DesignIntf.hpp>
#include <TypInfo.hpp>
#include <DesignEditors.hpp>
#include <Classes.hpp>

// Add DesignIDE.bpi to your package's Requires list in the Project Manager
#pragma comment(lib, "DesignIDE.bpi")



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


class TfrmLabelEditor : public TForm
{
__published:    // IDE-managed Components
TPanel *Panel1;
TMemo *Memo1;
TBitBtn *BitBtn1;
TBitBtn *BitBtn2;
private:    // User declarations
public:     // User declarations
__fastcall TfrmLabelEditor(TComponent* Owner);
};


class PACKAGE TLabelProperty : public TStringProperty
{
public:
virtual Designintf::TPropertyAttributes __fastcall GetAttributes() {
    return TStringProperty::GetAttributes()<<paDialog;
}

virtual void __fastcall Edit(void) {
    TfrmLabelEditor *frmEditor = new TfrmLabelEditor(Application);
    frmEditor->Memo1->Lines->Text = GetStrValue();
    try {
        if (frmEditor->ShowModal()==mrOk) {
            int i;
            for (i = 0; i < PropCount; i++) {
                ((TLabel*)GetComponent(i))->Caption = frmEditor->Memo1->Lines->Text;
            }
            Modified();
        }
    } catch (...) {
    }
    frmEditor->Free();
}

};



//---------------------------------------------------------------------------
extern PACKAGE TfrmLabelEditor *frmLabelEditor;
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "ufrmLabelEditor.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmLabelEditor *frmLabelEditor;
//---------------------------------------------------------------------------
__fastcall TfrmLabelEditor::TfrmLabelEditor(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

namespace Labelproperty {

void __fastcall PACKAGE Register()
{
    TTypeInfo* typeInfo = new TTypeInfo();
    typeInfo->Name = "AnsiString";
    typeInfo->Kind = tkLString;

    Designintf::RegisterPropertyEditor(typeInfo,__classid(TfrmLabelEditor),"Caption",     __classid(TLabelProperty));

    TComponentClass classes[1] = {__classid(TfrmLabelEditor)};
    RegisterComponents(L"SGM", classes, 0);
}
}
//---------------------------------------------------------------------------
#包括
#布拉格语hdrstop
#包括“ufrmLabelEditor.h”
//---------------------------------------------------------------------------
#pragma包(智能初始化)
#pragma资源“*.dfm”
TfrmLabelEditor*frmLabelEditor;
//---------------------------------------------------------------------------
__fastcall TfrmLabelEditor::TfrmLabelEditor(TComponent*所有者)
:t表格(所有者)
{
}
//---------------------------------------------------------------------------
名称空间Labelproperty{
void uu fastcall包寄存器()
{
TTypeInfo*typeInfo=newttypeinfo();
typeInfo->Name=“AnsiString”;
typeInfo->Kind=tkLString;
Designintf::RegisterPropertyEditor(typeInfo、u classid(TfrmLabelEditor)、“Caption”、uu classid(TLabelProperty));
TComponentClass类[1]={{uu classid(TfrmLabelEditor)};
注册组件(L“SGM”,类,0);
}
}

两个文件都是设计时的一部分,仅C++包…< / P> 有什么帮助吗?如果不是,请告诉我一些C++的IDE真的是工作!谢谢….

您的
Register()
函数依赖于一个不必要的黑客来伪造
解析
RTTI。不仅如此,VCL还在XE6中使用Unicode字符串,因此除非您的
标题
属性实际声明为
AnsiString
,否则您的属性编辑器将无法正确注册

让属性本身为您提供正确的RTTI。事实甚至证明了这一点。此方法适用于C++Builder(和Delphi)的每个版本:

更新:也就是说,此注册将永远无法工作,因为您正在将
RegisterPropertyEditor()的第二个参数设置为错误的值

TfrmLabelEditor
本身是实现的,并且只存在于设计时包中。通过将第二个参数设置为
TfrmLabelEditor
,仅当
TfrmLabelEditor
的实例在表单设计器中处于活动状态且其
标题
属性在对象检查器中编辑时,对象检查器才会调用
TLabelProperty
。但是表单设计器永远不会在项目中看到
TfrmLabelEditor
的实例,因此对象检查器永远不会调用
TLabelProperty
编辑器。这就是为什么你看不到任何事情发生


更仔细一点。第二个参数指定具有指定属性类型的指定属性的特定运行时组件类型,或为所有组件类型指定
NULL
TfrmLabelEditor
不符合此条件。

对REMY解决方案进行了一些修改,但不确定原因:

void __fastcall PACKAGE Register()
{
    TComponentClass classes[1] = {__classid(TfrmLabelEditor)};

    //********* register my editors ******************
    PPropInfo PropInfo = GetPropInfo(__typeinfo(TForm), "Caption");
    Designintf::RegisterPropertyEditor(*(PropInfo->PropType),NULL,"Caption", __classid(TLabelProperty));
    //*************************************************

    RegisterComponents(L"SGM", classes, 0);
}

问题是…?为什么要为设计时编辑器的属性注册属性编辑器?您应该将其注册为运行时组件的属性。你的组件在哪里?马特:问题是什么都没有发生,代码运行没有错误,软件包安装正常,但没有标题编辑器。。。雷米:我不明白你的问题,编辑器是为TLabel和其他组件的标题属性而设计的。关于另一个IDE的建议,我不是开玩笑,我已经厌倦了与Embarcadero的斗争生活。如果有人有其他IDE的提示,我将不胜感激!嗨,雷米,谢谢你的评论,我已经尝试了你的确切代码,但仍然不工作!没有错误,编译正常,添加包正常,但仍然没有编辑器…它不起作用,因为您正在将
RegisterPropertyEdit()的第二个参数设置为错误的值。它“起作用”是因为您正在从已知的运行时组件检索本机
字符串
RTTI,然后将
registerPropertyEdit()的第二个参数设置为NULL,因此实际上是说“为所有组件的标题属性注册TLabelProperty,其中标题是字符串”。您的原始代码改为“注册TfrmLabelEditor的Caption属性,其中Caption是一个AnsiString”,这将不起作用。