首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用匿名方法的Delphi代码完成失败

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

Stack Overflow用户
提问于 2018-09-24 16:01:53
回答 2查看 497关注 0票数 8

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

代码语言:javascript
代码运行次数:0
运行
复制
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语句的结尾。

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

首先我在这里

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

如果将光标放在行首而不是行尾,则可以在不完成的情况下添加新的空格。如何解决这个问题?嗯,我发现这个问题的发生是因为有这样的代码:

代码语言:javascript
代码运行次数:0
运行
复制
TThread.Synchronize(nil, procedure
                         begin
                           Memo1.Lines.Add(result);
                         end);

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-24 17:06:15

这是IDE中的一个bug吗?

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

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

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

代码语言:javascript
代码运行次数:0
运行
复制
  try
    MyClass := TComponent.Create(Self);
    try

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

所以你的代码是:

代码语言:javascript
代码运行次数:0
运行
复制
  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;
票数 3
EN

Stack Overflow用户

发布于 2018-09-25 12:28:09

这是IDE中的一个bug吗?

是。这是个缺陷。请向质量门户提交一份报告。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52483218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档