2017-02-12 11 views
9

Interfejs IDeveloperConsoleMessageReceiver w jednostce MSHTML.pas nie istnieje w Delphi 2010, ale (prawdopodobnie) istnieje w nowszych wersjach, ponieważ jest to ostatnia funkcja.Jak testować, czy interfejs istnieje w czasie kompilacji?

Chcę ręcznie zadeklarować ten interfejs, ale tylko wtedy, gdy jeszcze nie istnieje.

Jak mogę sprawdzić, czy ten interfejs jest zadeklarowany?

Coś jak "fałszywego" Kod:

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

Dlaczego nie zapytać, którą wersję wprowadzono, a następnie przetestować pod kątem numeru wersji? –

+0

Ten interfejs jest przykładem. –

+2

Plik MSHTML.pas jest generowany z biblioteki typów systemowych (mshtml.tlb). Istnieją narzędzia do generowania pliku pas z dowolnego typu urządzenia. –

Odpowiedz

12

Co szukasz jest

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

Więcej szczegółów można znaleźć here

EDIT: Just do wyjaśnienia, to sprawdzić, czy symbol jest zadeklarowana w zakresie, gdzie zachodzi $ IF. Nawet jeśli w bieżącym projekcie zostanie zadeklarowany symbol, jeśli jednostka, w której jest zadeklarowana, nie znajduje się w OBSZARZE jednostki, w której ją testujesz, nie będzie się liczyła jako zadeklarowana.

+0

Działa, dzięki. Ale kod ma mały błąd: {$ IFEND}, a nie {$ ENDIF}. –

5

można przetestować za predefined constants z {$IF} kompilatora określić:

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

MSHTMLMajorVersion jest zadeklarowana stała w MSHTML.PAS, który określa, czy dany Interfejs jest zadeklarowany lub nie:

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

Jeśli pytanie brzmi: jak sprawdzić, czy każdy interfejs istnieje w czasie kompilacji, to chyba nie można było wyprowadzić go ze stałym, można zmusić kompilator, aby zatrzymać się z powodu błędu, jeśli jest nierejestrowanej:

type 
    IMyTest = IDeveloperConsoleMessageReceiver; 

Być może nie jest to idealne rozwiązanie, w zależności od zakresu pytania.

Powiązane problemy