2016-08-19 23 views
6

Bazı form sınıflarımın aynı işlevi gerçekleştirmesine ihtiyacım var.Bir TClass'tan oluşturulan bir nesneden bir arayüz nasıl alınır?

(benim formların çoğunda yararsız olacak bir işlev eklemek istemiyorum çünkü ortak bir anchestor formuna bu işlevi ekleyerek fikrini atılır ettik.)

Yani ... Arayüz kullanımı hakkında düşündüm. Bu gibi basit durumlarda

IMyInterface = interface 
    procedure ShowHello(); 
end; 

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

, bu hatasız çalışır, ancak başvurum dinamik paketlerini kullanır ve form sınıfları elde etmek amacıyla "getClass" işlevini kullanıyorum. Ben şöyle çalıştı:

It "Uyumsuz türleri: 'IMyInterface' ve 'TForm'" neden
var 
    MyForm : TForm; 
    MyInterface : IMyInterface; 
begin 
    MyForm := TForm(GetClass('TMyForm').Create()); 
    MyInterface := MyForm; 
end; 

hatası. Arayüzleri kullanarak hedefime ulaşmanın bir yolu var mı yoksa başka yollardan denemek daha mı iyi olurdu? Bir arabirimin uygulanıp uygulanmadığını denetlemek için Supports işlevini kullanın

cevap

7
.

Numune:

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

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

Sen arayüzleri GUID'lerini ilan etmek gerekir. Aksi halde Supports çalışmıyor. Bu nedenle, arabirim bildirimi şu şekilde görünmelidir:

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

Önerildiği gibi yaptım, ancak yanlış sonuçları destekler. TMyForm sınıfı "TMyForm = class (TForm, IMyInterface)" olarak bildirilmiştir. Eksik bir şey mi var? – ExDev

+2

Arabirim tipinin, bildiriminde benzersiz bir GUID olması gerekiyor. GUID var mı? – Wosi

+0

Evet, bir tane almak için Ctrl + ÜstKrkt + G tuşlarına bastım ve IMyInterface bildirimine ekledim. – ExDev

İlgili konular