delphi - 匿名方法作为函数结果

标签 delphi delphi-2009 anonymous-methods

我想要做的是将作为函数结果获得的匿名方法分配给相同类型的变量。 Delphi 提示无法完成任务。显然,Delphi 的事情我想分配“GetListener”函数而不是同一函数的结果。非常感谢任何对此的帮助。

type
      TPropertyChangedListener = reference to procedure (Sender: TStimulus);

      TMyClass = class
        function GetListener:TPropertyChangedListener
      end;


    ....

    var MyClass: TMyClass;
        Listener: TPropertyChangedListener;
    begin
      MyClass:= TMyClass.create;
      Listener:= MyClass.GetListener;   //  Delphi compile error: E2010 Incompatible types:  TPropertyChangedListener' and 'Procedure of object' 

    end; 

最佳答案

使用以下语法:

  Listener:= MyClass.GetListener();
<小时/>

我编写了以下示例来明确 MyClass.GetListener() 和 MyClass.GetListener 分配之间的区别:

type
  TProcRef = reference to procedure(Sender: TObject);
  TFunc = function: TProcRef of object;

  TMyClass = class
    function GetListener: TProcRef;
  end;

function TMyClass.GetListener: TProcRef;
begin
  Result:= procedure(Sender: TObject)
  begin
    Sender.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyClass: TMyClass;
  ProcRef: TProcRef;
  Func: TFunc;

begin
  MyClass:= TMyClass.Create;
// standard syntax
  ProcRef:= MyClass.GetListener();

// also possible syntax
//  Func:= MyClass.GetListener;
//  ProcRef:= Func();

  ProcRef(MyClass);
end;

关于delphi - 匿名方法作为函数结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2788424/

相关文章:

database - 如何正确访问在后台线程中创建的查询结果?

multithreading - TMonitor 同步/Application.ProcessMessages

delphi - 如何将 Ctrl+R 设置为 Delphi 中 "Rename"重构的快捷方式?

c# - 将匿名表达式写成 lambda 表达式

delphi - Delphi 的匿名方法中引用的变量如何以及何时被捕获?

delphi - 将文件包含在ridl中

delphi - 将 PNG 加载到 TImage

delphi - 为什么在明显的 "safe"代码中使用异常处理?

c# - 为什么我不能在匿名方法中的while循环中使用break?

delphi - 如何保持多个项目的使用列表相同