【问题标题】:Anonymous method as function result匿名方法作为函数结果
【发布时间】:2010-05-07 12:15:16
【问题描述】:

我想要做的是将我作为函数结果获得的匿名方法分配给相同类型的变量。 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; 

【问题讨论】:

    标签: delphi delphi-2009 anonymous-methods


    【解决方案1】:

    使用以下语法:

      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;
    

    【讨论】:

    • 谢谢军士。我正在寻找的正是这两个()。有时候事情就是这么简单……如果你知道的话。
    • 这就是为什么我总是使用 C 的调用语法(又名 () 括号)来明确何时是调用。
    【解决方案2】:

    我发现解决此问题的唯一方法是像这样声明您的 GetListener:

    procedure GetListener(var a: TPropertyChangedListener);
    

    可能有一些语法强制编译器考虑函数的结果而不是函数本身,但我找不到任何语法。

    【讨论】:

    • 嗯,是的,我自己考虑过这个解决方案。缺点是,它使代码有点脏——尤其是因为在我的真实代码中,我想将 GetListener 结果添加到 TList 中。在这种情况下,我需要声明一个额外的变量,按照您的建议获取监听器,然后将变量添加到列表而不是 MyList.Add(GetListener)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2015-03-30
    • 2018-08-16
    相关资源
    最近更新 更多