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中的错误吗?
这是 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)