CnPack Forum


 
Subject: 如何在CnWizards中编写及移植属性编辑器
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6774
Posts 3562
点点分 6774
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2008-2-19 21:17  Profile | Blog | P.M. 
如何在CnWizards中编写及移植属性编辑器

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




All times are GMT++8, the time now is 2024-5-29 07:16

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.007667 second(s), 7 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP