如何从TClass创建的对象获取接口?

时间:2016-08-19 14:21:18

标签: delphi interface

我需要一些表单类实现相同的功能。

(我已经放弃了将这个功能添加到一个共同的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'"错误。 有没有办法使用接口实现我的目标,或者尝试其他方式会更好?

1 个答案:

答案 0 :(得分: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;