0

像往常一样,每个新版本的 c++ builder 都需要几天的更改......我在修复属性编辑器时遇到了麻烦,代码是:

***************** 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

************** CPP 文件*************************

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

#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);
}
}

这两个文件都是仅设计时 c++ 包的一部分....

有什么帮助吗?如果没有,请告诉我一些真正有效的 c++ ide!!!!!!!谢谢.....

4

2 回答 2

0

REMY SOLUTION 的一点改编已经奏效,不知道为什么:

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);
}
于 2014-07-17T12:11:22.903 回答
0

您的Register()功能依赖于不必要的黑客来伪造AnsiStringRTTI。不仅如此,VCL 在 XE6 中使用 Unicode 字符串,因此除非您的Caption属性实际声明为,否则您AnsiString的属性编辑器将无法正确注册。

让酒店本身为您提供正确的 RTTI。RegisterPropertyEditor() 文档甚至演示了这一点。这种方法适用于每个版本的 C++Builder(和 Delphi):

void __fastcall PACKAGE Register()
{
    PPropInfo pProp = GetPropInfo(__typeinfo(TfrmLabelEditor), "Caption");
    RegisterPropertyEditor(*(pProp->PropType), __classid(TfrmLabelEditor), "Caption", __classid(TLabelProperty));

    TComponentClass classes[1] = {__classid(TfrmLabelEditor)};
    RegisterComponents(L"SGM", classes, 0);
}

更新:话虽如此,这种注册永远不会起作用,因为您将第二个参数设置RegisterPropertyEditor()为错误的值。

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

更仔细地阅读文档。第二个参数指定特定的运行时组件类型,或者NULL为所有组件类型指定具有指定属性类型的指定属性。 TfrmLabelEditor没有资格。

于 2014-07-17T08:43:38.673 回答