Delphi 使用匿名方法完成代码失败

Delphi code completion fail with anonymous methods

请创建一个新的 FMX 应用程序,向 运行 这个例子添加一个按钮和一个备忘录。我有这个代码:

procedure TForm1.Button1Click(Sender: TObject);
begin
  TTask.Run(procedure
            var
              client: TIdHTTP;
              result: string;
            begin
              client := TIdHTTP.Create(nil);
              try
                try
                  client.ReadTimeout := 4000;
                  client.ConnectTimeout := 4000;
                  result := client.Get('a valid url here just as test');
                  TThread.Synchronize(nil, procedure
                                           begin
                                             Memo1.Lines.Add(result);
                                           end);
                except
                  on E: Exception do
                    begin
                      TThread.Synchronize(nil, procedure
                                           begin
                                             Memo1.Lines.Add(E.Message);
                                           end);
                    end
                end;
              finally
                client.Free;
              end;
            end);
end;

如我所料,但问题出在 IDE。如果我将光标放在匿名函数主体的某处,我会自动关闭 finally 语句。

我该如何解决这个问题?


我先来了

然后我按回车键,我就有了这个!

如果你把光标放在行首而不是行尾,你可以添加新的空格而不用补全。如何解决这个问题呢?好吧,我发现问题的发生是因为有这段代码:

TThread.Synchronize(nil, procedure
                         begin
                           Memo1.Lines.Add(result);
                         end);

如果删除此代码,问题就不会再发生。这是 IDE 中的错误吗?

Is this a bug in the IDE?

是的,这是 IDE 中的错误。您的代码在语法上是有效的。

How can I fix this?

避免这种情况的最佳方法是创建您的代码并用 try...except... 包围它以处理任何异常:

  try
    MyClass := TComponent.Create(Self);
    try

    finally
      MyClass.Free;
    end;
  except on E: Exception do
  end;

因此您的代码将是:

  TTask.Run(procedure
            var
              client: TIdHTTP;
              result: string;
            begin
              try
                Client := TIdHTTP.Create(nil);
                try
                  client.ReadTimeout := 4000;
                  client.ConnectTimeout := 4000;
                  result := client.Get('a valid url here just as test');
                  TThread.Synchronize(nil, procedure
                                           begin
                                             Memo1.Lines.Add(result);
                                           end);
                finally
                  Client.Free;
                end;
              except on E: Exception do
                begin
                  TThread.Synchronize(nil, procedure
                                           begin
                                             Memo1.Lines.Add(E.Message);
                                           end);
                  end;
              end;
            end;

Is this a bug in the IDE?

是的。这是一个缺陷。请向 Quality Portal 提交报告。