Delphi 6.0中属性编辑器的解决方案

来源:互联网 发布:项目管理网络培训 编辑:程序博客网 时间:2024/04/28 22:27
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<A href="http://www.66of.com" target=_blank>Delphi</A> 6.0<A href="http://www.66of.com" target=_blank>中属性编辑器</A>的<A href="http://www.66of.com" target=_blank>解决方案</A>

Delphi 6.0中属性编辑器解决方案
    Delphi中用户可以自己声明属性编辑器在程序设计期间对第三方控件进行设计,对属性编辑器的声明可以在注册控件的时候通过RegisterComponentEditor过程进行定义,具体为:
    procedure RegisterComponentEditor(ComponentClass: TComponentClass; ComponentEditor: TComponentEditorClass);
    当然,用户在注册前要定义自己的属性编辑器,下面是一个例子:
    TOutlookBarEditor = class(TComponentEditor)
      function GetVerb(Index: Integer): string; override;
      function GetVerbCount: Integer; override ;
      procedure Edit; override;
      procedure ExecuteVerb(Index: Integer); override;
    end;

    其中最关键的部分在于对RegisterComponentEditor的引用。
    在Delphi5.0中,可以直接将$(Delphi)SourceToolsAPI目录下的DsgnIntf.pas文件拷贝到控件的设计目录下或者拷贝到$(Delphi)Lib目录即可。
    在Delphi6.0中,Delphi将文件分解成DesignIntf.pas和DesignEditors.pas两个文件,所以引用时要将$(Delphi)SourceToolsAPI目录下的DesignIntf.pas和DesignEditors.pas两个文件拷贝到控件的设计目录下或者拷贝到$(Delphi)Lib目录。
    当然,如果你的Delphi Package的搜索路径或者Delphi IDE的搜索路径可以搜索到$(Delphi)SourceToolsAPI目录就省去此麻烦。

    但是,在Delphi 6.0中,如果就此编译,会出现找不到Proxies.dcu文件的问题。因为Proxies被编译了,在Delphi的目录中根本就找不到此相关文件,它已经被编译到designide.dcp文件中,解决方案很简单,就是在你的Package中引用designide.dcp文件即可,具体作法是:
    Project->View Source->在requires部分加入对designide的引用即可。

    由于此部分文件只是在设计期间才有效,所以你的Package在设计时就要注意:
    不要在运行期间将在进行期间使用的文件加入对DesignIntf.pas和DesignEditors.pas两个文件的引用,否则依然会出现找不到Proxies.dcu文件的问题,要将文件脱离!

    当然,如果你的Package要在Delphi 5.0及Delphi6.0下同时能运行,那就要下点功夫通过编辑器的版本进行控制,Delphi 6.0的编辑器版本是VER140,Delphi 5.0的编辑器版本是VER130,下面是本人的一个真实的引用文件:
    uses
      Classes, {$IFDEF VER140}DesignIntf, DesignEditors{$ELSE}DsgnIntf{$ENDIF};

    Package部分由于版本不同而对不同的版本要进行不同的设计,再此就不叙述了!


    其它补记:由于Delphi 5.0和Delphi 6.0对过程及参数的定义区域不同而出现错误,所以在编写两个版本的Package时一定要注意引用虚函数时出现的问题。例如对TControl控件的SetAutoSize(Value: Boolean)过程的引用:
    在Delphi 5.0中定义为:
    private
      procedure SetAutoSize(Value: Boolean);
    而在Delphi 6.0中定义为:
    protected
      procedure SetAutoSize(Value: Boolean); virtual;
    此时的定义要根据自己的实际情况定义了,可不能随便定义了!



    Starfarm--->Docn Hank(starfarm@263.net)

    2001.11.13
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>