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 提交报告。
请创建一个新的 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 提交报告。