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

Ros*_*san 7 delphi delphi-10.2-tokyo

请创建一个新的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;
Run Code Online (Sandbox Code Playgroud)

它按预期工作,但问题出在IDE中.如果我将光标放在匿名函数体内的某处,我会自动关闭finally语句.

我怎样才能解决这个问题?


首先我在这里

在此输入图像描述

然后我按回车,我有这个!

在此输入图像描述

如果将光标放在行的开头而不是行的末尾,则可以添加新的空格而不完成.如何解决这个问题呢?好吧,我发现问题发生是因为有这样的代码:

TThread.Synchronize(nil, procedure
                         begin
                           Memo1.Lines.Add(result);
                         end);
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*nan 7

这是IDE中的错误吗?

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


Sam*_*ami 3

这是 IDE 中的错误吗?

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

我怎样才能解决这个问题?

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

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

    finally
      MyClass.Free;
    end;
  except on E: Exception do
  end;
Run Code Online (Sandbox Code Playgroud)

所以你的代码将是:

  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;
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,它仍然感觉像是一个 IDE bug。OP 的原始代码在语法上完全有效。 (7认同)
  • @Andreas:对我来说也是。这是一个 IDE 错误。也是一个非常烦人的错误。 (3认同)