如何在编译时测试接口是否存在?

mar*_*deg 9 delphi

Delphi 2010中不存在单元中的IDeveloperConsoleMessageReceiver接口MSHTML.pas,但(可能)存在于更新版本中,因为它是最近的功能.

我想手动声明此接口,但仅限于它尚不存在.

如何测试是否声明了此接口?

像"假"代码:

{$IFNDEF "IDeveloperConsoleMessageReceiver"}
type
  IDeveloperConsoleMessageReceiver = interface ...
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)

Ken*_*ssa 12

你在寻找什么

{$IF not DECLARED(IDeveloperConsoleMessageReceiver)}
  IDeveloperConsoleMessageReceiver = interface ...
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)

更多细节可以在这里找到

编辑:只是为了澄清,它将测试符号是否在$ IF发生的范围内声明.因此,即使在当前项目中声明了符号,如果声明它的单元不在您测试它的单元的用途中,它也不会计为声明.


LU *_* RD 5

您可以使用编译器定义来测试预定义常量{$IF}:

{$IFDEF CONDITIONALEXPRESSIONS}
  {$IF MSHTMLMajorVersion < 4}  // Implement interface
    type
      IDeveloperConsoleMessageReceiver = interface ...
  {$IFEND}
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)

MSHTMLMajorVersion是一个声明的常量MSHTML.PAS,它定义是否声明了特定的接口:

const
  // TypeLibrary Major and minor versions
  MSHTMLMajorVersion = 4;
  MSHTMLMinorVersion = 0;
Run Code Online (Sandbox Code Playgroud)

如果您的问题是如何测试编译时是否存在任何接口,那么除非您无法从常量派生它,否则可以强制编译器在未声明的情况下停止并显示错误:

type
  IMyTest = IDeveloperConsoleMessageReceiver;   
Run Code Online (Sandbox Code Playgroud)

这可能并不理想,具体取决于问题的范围.