2016-08-19 13 views
6

私のフォームクラスのいくつかは同じ機能を実装する必要があります。TClassから作成されたオブジェクトからインターフェイスを取得するには?

(私は私のフォームの最も上の役に立たない機能を追加したくないので、私は、共通のanchestorフォームにこの機能を追加するという考えを捨てました。)

だから... ...私は、インターフェイスの使用について考えました。このような単純なケースでは

IMyInterface = interface 
    procedure ShowHello(); 
end; 

var 
    MyForm : TMyForm; 
    MyInterface : IMyInterface; 
begin 
    MyForm := TMyForm.Create(Self); 
    MyInterface := MyForm; 
    //... 
end; 

、それはエラーなしで動作しますが、私のアプリケーションは、動的なパッケージを使用しますと、私はフォームクラスを得るために、「のGetClass」機能を使用しています。 次のように私が試した:

var 
    MyForm : TForm; 
    MyInterface : IMyInterface; 
begin 
    MyForm := TForm(GetClass('TMyForm').Create()); 
    MyInterface := MyForm; 
end; 

それは、 "互換性のないタイプ: 'IMyInterfaceという' と 'TFormは'" 原因となるエラーを。 インターフェイスを使用して目標を達成する方法はありますか、他の方法を試す方がよいでしょうか?

答えて

7

Supports機能を使用して、インターフェイスが実装されているかどうかを確認します。

サンプル

var 
    MyForm : TForm; 
    MyInterface : IMyInterface; 
begin 
    MyForm := TFormClass(GetClass('TMyForm')).Create(...); 

    if Supports(MyForm, IMyInterface, MyInterface) then 
    begin 
    MyInterface.ShowHello; 
    end; 
end; 

あなたはあなたのインターフェイスのGUIDを宣言する必要があります。それ以外の場合はSupportsは機能しません。したがって、インターフェイス宣言は次のようになります。

IMyInterface = interface 
    ['{052E7D55-B633-4256-9084-37D797B01BB4}'] 
    procedure ShowHello(); 
end; 
+0

私は示唆したとおりですが、結果は偽です。 TMyFormクラスは "TMyForm = class(TForm、IMyInterface)"として宣言されています。何か不足していますか? – ExDev

+2

インターフェイスタイプには、宣言に一意のGUIDが必要です。それはGUIDを持っていますか? – Wosi

+0

はい、Ctrl + Shift + Gキーを押して取得し、IMyInterface宣言に追加しました。 – ExDev

関連する問題