2016-08-19 9 views
6

Potrzebuję, aby niektóre z moich klas formularzy realizowały tę samą funkcję.Jak uzyskać interfejs z obiektu utworzonego z TClass?

(ja odrzuca ideę dodając tę ​​funkcję do wspólnej postaci anchestor ponieważ nie chcę, aby dodać funkcję, która byłaby bezużyteczna na większość moich postaciach.)

Więc ... myślałem o używaniu interfejsów.

IMyInterface = interface 
    procedure ShowHello(); 
end; 

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

W prostych przypadkach takich jak ten, to działa bez błędów, ale moja aplikacja korzysta z pakietów dynamicznych i używam funkcji „getClass” w celu uzyskania klasy formularza. Starałem się następująco:

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

To powoduje "niezgodne typy: 'IMyInterface' oraz 'TForm'" błędzie. Czy istnieje sposób osiągnięcia mojego celu za pomocą interfejsów, czy lepiej wypróbować inne sposoby?

Odpowiedz

7

Użyj funkcji Supports, aby sprawdzić, czy interfejs został zaimplementowany, czy nie.

Próbka:

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

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

Musisz zadeklarować GUID dla interfejsów. W przeciwnym razie Supports nie działa. Dlatego deklaracja interfejsu powinna wyglądać następująco:

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

Zrobiłem zgodnie z sugestią, ale obsługuje wyniki fałszywe. Klasa TMyForm jest deklarowana jako "TMyForm = klasa (TForm, IMyInterface)". Czy czegoś brakuje? – ExDev

+2

Typ interfejsu wymaga unikatowego identyfikatora GUID w deklaracji. Czy ma GUID? – Wosi

+0

Tak, przycisnąłem Ctrl + Shift + G w celu uzyskania jednego i dodałem go do deklaracji IMyInterface. – ExDev

Powiązane problemy