delphi - 如何将 "of object"程序分配给 "reference to"程序?

标签 delphi

我有:

  TMyProc = reference to procedure(const adata: String);

  TMyObject = Class(Tobject)
  private
    FMyProc: TMyProc ;
  public
    Property MyProc: TMyProc read FMyProc write FMyProc;
  end;

  TAnObject = Class(Tobject)
  public
    procedure MyProcImpl(const adata: integer); overload;
    procedure MyProcImpl(const adata: String); overload;
  end;

我想做类似的事情

   MyObject.MyProc := AnObject.MyProcImpl;

但我得到了Incompatible types: 'TMyProc' and 'Procedure of object'。我该怎么办?

最佳答案

问题是重载引入的歧义。如果没有重载,您的代码将可以正常工作。

您可以使用一个临时变量来消除重载的歧义,该变量的类型与您要选择的重载相匹配:

program SO70183946;

type
  TMyProc = reference to procedure(const adata: string);
  TMyProcOfObject = procedure(const adata: string) of object;

  TMyObject = class
  private
    FMyProc: TMyProc;
  public
    property MyProc: TMyProc read FMyProc write FMyProc;
  end;

  TAnObject = class
  public
    procedure MyProcImpl(const adata: integer); overload;
    procedure MyProcImpl(const adata: string); overload;
  end;

procedure TAnObject.MyProcImpl(const adata: integer);
begin
end;

procedure TAnObject.MyProcImpl(const adata: string);
begin
end;

var
  MyObject: TMyObject;
  AnObject: TAnObject;
  MyProcOfObject: TMyProcOfObject;

begin
  MyProcOfObject := AnObject.MyProcImpl;
  MyObject.MyProc := MyProcOfObject;
end.

解决这个问题的另一种方法是显式写出匿名方法,而不是依赖编译器在幕后生成它:

MyObject.MyProc :=
  procedure(const adata: string)
  begin
    AnObject.MyProcImpl(adata);
  end;

关于delphi - 如何将 "of object"程序分配给 "reference to"程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70183946/

相关文章:

mysql - 如何在 Delphi 中接收 MySQL 数据库通知?

delphi - Delphi 内置组件中的滚动条有问题

sql - 如何使用 FireDac 组件在 ms sql server 上获取最后插入的 id?

delphi - 使用Indy TidHttp组件通过sendgrid发送电子邮件文件附件

delphi - 如何通过新的 RTTI 设置事件处理程序? [D2010]

delphi - 在Delphi中处理任意位长度的数据?

delphi - 让 Delphi 7 与源代码管理配合得很好?

delphi - 用DELPHI获取网页内容

windows - 如何有效地检索目录中的文件数?

delphi - TComboBox - 如何在下拉列表下拉时调整其高度?