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的范畴,本文不赘述了。  |