2017-02-12 7 views
9

MSHTML.pasユニットのIDeveloperConsoleMessageReceiverインターフェイスはDelphi 2010には存在しませんが、最近の機能であるため、(おそらく)より新しいバージョンに存在します。インターフェイスがコンパイル時に存在するかどうかをテストしますか?

私はこのインタフェースを手動で宣言したいが、それが存在しない場合にのみ、このインタフェースを宣言したい。

このインターフェイスが宣言されているかどうかをテストするにはどうすればよいですか? "偽" のコードのような

何か:

{$IFNDEF "IDeveloperConsoleMessageReceiver"} 
type 
    IDeveloperConsoleMessageReceiver = interface ... 
{$ENDIF} 
+0

導入されたバージョンを尋ねて、バージョン番号をテストしてみませんか? –

+0

このインターフェイスは一例です。 –

+2

MSHTML.pasは、システムタイプライブラリ(mshtml.tlb)から生成されます。任意のタイプライブラリからpasファイルを生成するツールがあります。 –

答えて

12

{$IF not DECLARED(IDeveloperConsoleMessageReceiver)} 
    IDeveloperConsoleMessageReceiver = interface ... 
{$ENDIF} 

詳細は

EDIT hereを見つけることができます。したがって、あなたの現在のプロジェクトでシンボルが宣言されていても、宣言されたユニットが、それをテストするユニットのUSESにない場合、それは宣言されたものとみなされません。

+0

ありがとう、ありがとう。しかし、コードには少し間違いがあります。{$ IFEND}ではなく、{$ ENDIF}ではありません。 –

5

あなたは{$IF}コンパイラでpredefined constantsをテストすることができますが、定義:

{$IFDEF CONDITIONALEXPRESSIONS} 
    {$IF MSHTMLMajorVersion < 4} // Implement interface 
    type 
     IDeveloperConsoleMessageReceiver = interface ... 
    {$IFEND} 
{$ENDIF} 

MSHTMLMajorVersionは、特定の場合には定義されている、MSHTML.PASに定数宣言されていますインターフェイスが宣言されているかどうか:

const 
    // TypeLibrary Major and minor versions 
    MSHTMLMajorVersion = 4; 
    MSHTMLMinorVersion = 0; 

あなたの質問には、任意のインターフェースがコンパイル時に存在している場合は、定数からそれを引き出すことができなかった場合を除き、それが宣言されていないされている場合は、エラーで停止するようにコンパイラに強制することができ、そして、テストする方法である場合:

type 
    IMyTest = IDeveloperConsoleMessageReceiver; 

問題の範囲によっては、これはおそらく理想的ではありません。ただ、シンボルが$ IFが発生したスコープで宣言されている場合、それはテストする、明確にする:あなたが探しているものを

関連する問題