相关疑难解决方法(0)

如何以及何时在Delphi的匿名方法中引用变量?

这是由如何比较TFunc/TProc包含对象的功能/过程?,特别是大卫对巴里问题的评论.由于我没有博客发布这个问题,我将在这里提出这个问题并回答.

问题:Delphi的匿名方法中何时以及如何引用变量?

例:

procedure ProcedureThatUsesAnonymousMethods;
var V: string;
    F1: TFunc<string>;
    F2: TFunc<string>;
begin
  F1 := function: string
        begin
          Result := V; // references local variable
        end
  V := '1';
  F2 := function: string
        begin
          Result := V;
        end
 V := '2';
 ShowMessage(F1);
 ShowMessage(F2);
end;
Run Code Online (Sandbox Code Playgroud)

两者ShowMessage都将展示2.为什么?如何V捕获以及何时捕获?

delphi anonymous-methods delphi-2010

22
推荐指数
1
解决办法
1865
查看次数

如何检查两个方法引用是否引用相同的方法?

我正在尝试制作事件处理程序列表,其中handler是方法引用.要删除特定的处理程序,我需要在列表中找到它.但是我如何比较两个方法引用的代码地址?

type
  TEventHandler = reference to procedure;

procedure TestProc;
begin
end;

procedure TForm26.FormCreate(Sender: TObject);
var
  Handlers: TList<TEventHandler>;
begin
  Handlers := TList<TEventHandler>.create;
  try
    Handlers.Add(TestProc);
    Handlers.Remove(TestProc); { doesn't work }
    Assert(Handlers.Count=0);  { fails }
    Assert(Handlers.IndexOf(TestProc)>=0); { fails }
  finally
    FreeAndNil(Handlers);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

TList <>的默认比较器不能正确比较方法引用.我该如何比较它们?是否存在类似于TMethod的结构,但是方法参考?

delphi anonymous-methods method-reference

17
推荐指数
1
解决办法
521
查看次数