代码之家  ›  专栏  ›  技术社区  ›  iamjoosy

作为函数结果的匿名方法

  •  3
  • iamjoosy  · 技术社区  · 16 年前

    我要做的是将作为函数结果得到的匿名方法分配给同一类型的变量。德尔菲抱怨说他无法完成任务。显然,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; 
    
    2 回复  |  直到 16 年前
        1
  •  12
  •   kludg    16 年前

    使用以下语法:

      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;
    
        2
  •  0
  •   Ken Bourassa    16 年前

    我发现解决这个问题的唯一方法是这样声明getListener:

    procedure GetListener(var a: TPropertyChangedListener);
    

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

    推荐文章