CnWizards中组件编辑器的架构
CnDesignEditor.pas单元中有一全局对象CnDesignEditorMgr,负责管理CnWizards中的所有属性编辑器。对于属性编辑器开发者来说,它
的最重要的方法是RegisterPropEditor。
procedure RegisterPropEditor(AEditor: TPropertyEditorClass;
AEditorInfoProc: TCnGetEditorInfoProc; ARegEditorProc: TCnObjectProc;
ACustomRegister: TCnCustomRegisterProc = nil; AConfigProc: TCnObjectProc = nil);
如果我们自己写了个属性编辑器,欲让它集成入CnWizards中,则需要调用CnDesignEditorMgr.RegisterPropEditor来将它注册到
CnWizards的属性编辑器管理器中,而不是直接注册给IDE。
要了解RegisterPropEditor这些传入的参数,我们先回忆一下一个基本的属性编辑器是如何工作的。
光棍IDE中属性编辑器的基本写作方式
一般写个属性编辑器需要新建一Package并从DsgnIntf单元的TPropertyEditor基类(或其子类)继承一自己的子类并实现编辑功能,然后
写个全局的Register过程让IDE调用,Register过程中我们调用RegisterPropertyEditor过程来替某些属性注册上属性编辑器。然后安装此
Package。此Package加载后其中的Register过程会被IDE调用,从而使我们的属性编辑器真正挂在Object Inspector中来发挥作用。
CnWizards中属性编辑器的写作方式
在CnWizards中我们写的组件编辑器也同样要写一个TPropertyEditor的子类,并让其调用RegisterPropertyEditor以注册到IDE中,只是
这个注册过程不是通过自己书写全局Register过程来完成,而是通过上面的CnDesignEditorMgr.RegisterPropEditor里头传入的函数指针
来完成。
AEditor: TPropertyEditorClass;
这是我们要传入的组件编辑器的子类类名,比如我们替某属性写了个属性编辑器叫TCnTestPropertyEditor,那么这个参数就应该传入
TCnTestPropertyEditor。
AEditorInfoProc: TCnGetEditorInfoProc;
其中:TCnGetEditorInfoProc = procedure (var Name, Author, Email, Comment: string) of object;
这是一个方法指针,用来被CnWizards回调,以获得此属性编辑器的额外信息。这个机制和IDE无关。
如果我们替某属性写了个属性编辑器叫TCnTestPropertyEditor,则此处一般要在TCnTestPropertyEditor中实现一public的方法:
class procedure GetInfo(var Name, Author, Email, Comment: string);
然后在GetInfo的实现中给这几个变量赋值,这些值将显示在CnWizards的设置对话框中。
写好GetInfo的实现后,此参数便可传入TCnTestPropertyEditor.GetInfo
ARegEditorProc: TCnObjectProc;
其中:TCnObjectProc = procedure of object;
这也是一个方法指针,用来声明具体的注册,也就是原全局Register过程中应该实现的部分。
如果我们替某属性写了个属性编辑器叫TCnTestPropertyEditor,则此处又要在TCnTestPropertyEditor中实现一public的方法:
class procedure Register;
然后在它的Register方法(不是全局Register过程!)中调用IDE提供的RegisterPropertyEditor过程来完成真正的针对某些属性的编辑
器注册。
如
RegisterPropertyEditor(TypeInfo(TTestProperty), TComponent, '', TCnTestPropertyEditor);
基本上也就是将以前的全局Register过程的内容移植来即可。
写好Register方法后,此参数便可传入TCnTestPropertyEditor.Register
其余两个参数是设置与高级注册的回调函数指针,用法与上面也类似,默认为空。简单的属性编辑器可不关注此两项内容。
总结
综上所述,在CnWizards中移植入属性编辑器,最重要的就是替此属性编辑器类声明两个public方法:
class procedure GetInfo(var Name, Author, Email, Comment: String);
class procedure Register;
并在属性编辑器实现单元的initialization部分调用CnDesignEditorMgr.RegisterPropEditor进行注册即可。
而属性编辑器本身的编写属于IDE的OpenToolsAPI的范畴,本文不赘述了。 |