CnPack 开源软件项目 - 如何在CnWizards中编写及移植属性编辑器
  网站首页 下载中心 每日构建 文档中心 捐助我们 开发论坛 关于我们 致谢名单 English


 Google 搜索

内容: 
 最新下载


 
CnWizards 1.5.1.1219
[2024-11-03]

 
CnVCL 组件包 20241103
[2024-11-03]

 
CnPack 密码算法库 20241103
[2024-11-03]
  每日构建版下载
  专家包时间线
 项目相关链接


 
CnPack GitHub 首页
GIT 使用说明
申请加入 CnPack
CnPack 成员名单
 网站访问量

今日首页访问: 207
今日页面流量: 1113
全部首页访问: 5317051
全部页面流量: 21461385
建站日期: 2003-09-01

 
如何在CnWizards中编写及移植属性编辑器
 
CnPack 开源软件项目 2008-02-19 21:19:10

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


本文已阅读 12070 次
来自: CnPack 开源软件项目

上一主题 | 返回上级下一主题

相关主题:


版权所有(C) 2001-2024 CnPack 开发组 网站编写:Zhou Jinyu