被重命名的 DsgnIntf 及其相关变化在你的工程中对 DsgnIntf 的引用应该被改变为新的 Delphi 6 名称,DesignIntf。你也许也会需要添加DesignEditors,VCLEditors 和 RTLConsts 到你的 uses 子句。你也将需要添加 designide 到你的包的requires 列表。对 dsnide50 的引用可能也应该变为 designide,如果那没有被 Delphi 自动改变的话。任何使用 IDesigner 的运行时包需要使用 IDesignerHook 来避免运行时需要 designide。在运行时代码里,IDesignerHook 应该足够。设计时代码可以使用 IDesigner,但是应该使用类似下面的代码来从 IDesignerHook 的一个实例获得实际 IDesigner 接口。var
  RealDesigner: IDesigner;
...
SomeDesignerHook.QueryInterface(IDesigner,RealDesigner);
...
IDesignerHook 仅要求 Classes 和 Forms 单元可用。IDesigner 需要 DesignIntf,后者包含了许多其它包,而其中一些可能不是可重新分发的。组件编辑器的变化类 TComponentEditor 在 Delphi 6 里有不同的祖先系。在 Delphi 5 里,它从 TInterfacedObject 继承;现在它从一个新的类 TBaseComponentEditor 继承。类 TComponentEditorClass 现在也是 TBaseComponentEditor 而不是 TComponentEditor 的一个类。这些层次体系上的变化会要求你修改你的旧的 Delphi 工程。TDesignWindow 的变化关于类 TDesignWindow,存在大量变化。它已经被移动到 DesignWindows 单元,并且它的 FormClosed 方法已经被 DesignerClosed 替代。过去,你可以通过使用 AForm 参数在 FormClosed 里获得对表单的访问。现在,在 DesignerClosed 里,你必须使用 Designer 的 Root 属性来访问表单。在 FormClosed 里,你可以通过调用 TDesignerSelectionList.Create 或 TComponentList.Create 创建选择列表。为在 DesignerClosed 里创建选择列表,你必须使用一个 IDesignerSelections 接口。你可以使用CreateSelectionList 函数创建一个。SelectionClosed 方法的参数也和 Delphi 5 里不一样。 

解决方案 »

  1.   

    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)\Source\ToolsAPI目录下的DsgnIntf.pas文件拷贝到控件的设计目录下或者拷贝到$(DELPHI)\Lib目录即可。
        在Delphi6.0中,Delphi将文件分解成DesignIntf.pas和DesignEditors.pas两个文件,所以引用时要将$(DELPHI)\Source\ToolsAPI目录下的DesignIntf.pas和DesignEditors.pas两个文件拷贝到控件的设计目录下或者拷贝到$(DELPHI)\Lib目录。
        当然,如果你的Delphi Package的搜索路径或者Delphi IDE的搜索路径可以搜索到$(DELPHI)\Source\ToolsAPI目录就省去此麻烦。    但是,在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;
        此时的定义要根据自己的实际情况定义了,可不能随便定义了!
      

  2.   

    我在DELPHI5下写了一个控件,用到DsgnIntf但到DELPHI6下无法编译,
    我把DsgnIntf改为:DesignIntf 还是出错,信息:找不到什么*。DCU
    再改,在USES里去掉哪个找DCU的单元,屏蔽点出错的代码就可以了,
    你不妨试一试