在Delphi XE7的Android上第2次打开表单时发生访问冲突
当我第一次打开我的表单时,我没有收到任何违规信息,但是当我首先选择一个TEdit字段,然后关闭表单,然后重新创建表单并打开表单时,我收到了违规信息 创建表单的代码:在Delphi XE7的Android上第2次打开表单时发生访问冲突,android,forms,delphi,firemonkey,delphi-xe7,Android,Forms,Delphi,Firemonkey,Delphi Xe7,当我第一次打开我的表单时,我没有收到任何违规信息,但是当我首先选择一个TEdit字段,然后关闭表单,然后重新创建表单并打开表单时,我收到了违规信息 创建表单的代码: procedure TfrmNocoreDKS.actConfigExecute(Sender: TObject); var confForm: TConfiguratie; begin confForm := TConfiguratie.Create(nil); confForm.ShowModal( proc
procedure TfrmNocoreDKS.actConfigExecute(Sender: TObject);
var
confForm: TConfiguratie;
begin
confForm := TConfiguratie.Create(nil);
confForm.ShowModal(
procedure(ModalResult: TModalResult)
begin
confForm.DisposeOf;//Also tried confForm.Free;
end);
end;
procedure TfrmNocoreDKS.actConfigExecute(Sender: TObject);
var
confForm: TConfiguratie;
begin
confForm := TConfiguratie.Create(nil);
try
confForm.ShowModal(
procedure(ModalResult: TModalResult)
begin
end);
finally
confForm.free;
end;
end;
procedure TConfiguratie.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := TCloseAction.caFree;
end;
我也尝试过创建表单:
procedure TfrmNocoreDKS.actConfigExecute(Sender: TObject);
var
confForm: TConfiguratie;
begin
confForm := TConfiguratie.Create(nil);
confForm.ShowModal(
procedure(ModalResult: TModalResult)
begin
confForm.DisposeOf;//Also tried confForm.Free;
end);
end;
procedure TfrmNocoreDKS.actConfigExecute(Sender: TObject);
var
confForm: TConfiguratie;
begin
confForm := TConfiguratie.Create(nil);
try
confForm.ShowModal(
procedure(ModalResult: TModalResult)
begin
end);
finally
confForm.free;
end;
end;
procedure TConfiguratie.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := TCloseAction.caFree;
end;
关闭表单的代码:
procedure TfrmNocoreDKS.actConfigExecute(Sender: TObject);
var
confForm: TConfiguratie;
begin
confForm := TConfiguratie.Create(nil);
confForm.ShowModal(
procedure(ModalResult: TModalResult)
begin
confForm.DisposeOf;//Also tried confForm.Free;
end);
end;
procedure TfrmNocoreDKS.actConfigExecute(Sender: TObject);
var
confForm: TConfiguratie;
begin
confForm := TConfiguratie.Create(nil);
try
confForm.ShowModal(
procedure(ModalResult: TModalResult)
begin
end);
finally
confForm.free;
end;
end;
procedure TConfiguratie.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := TCloseAction.caFree;
end;
因为只有当你点击任何TEdit,然后关闭表单时才会出现违规,我认为这与虚拟键盘有关,但我不确定。我没有任何使用虚拟键盘本身的方法。更新 虽然我的建议如文件所述,但Android和多种表单仍然存在问题。请参阅本文后面的内容
根本不要调用
DisposeOf()
或Free
。FormClose()
和caFree
调用是使其工作的关键
如何处理模式对话框的文档已更改:
FireMonkey架构师已经在几个版本中对此进行了努力,最终它成功了
文档中的示例如何创建模式对话框:
procedure MyCurrentForm.MyButtonClick(Sender: TObject);
var
dlg: TMyModalForm;
begin
// Create an instance of a form.
dlg := TMyModalForm.Create(nil);
// Configure the form. For example, give it a display name.
dlg.Caption := 'My Modal Dialog Box';
// Show your dialog box and provide an anonymous method that handles the closing of your dialog box.
dlg.ShowModal(
procedure(ModalResult: TModalResult)
begin
// Do something.
end
);
end;
procedure TMyModalForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := TCloseAction.caFree;
end;
要释放模态对话框,请执行以下操作:
procedure MyCurrentForm.MyButtonClick(Sender: TObject);
var
dlg: TMyModalForm;
begin
// Create an instance of a form.
dlg := TMyModalForm.Create(nil);
// Configure the form. For example, give it a display name.
dlg.Caption := 'My Modal Dialog Box';
// Show your dialog box and provide an anonymous method that handles the closing of your dialog box.
dlg.ShowModal(
procedure(ModalResult: TModalResult)
begin
// Do something.
end
);
end;
procedure TMyModalForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := TCloseAction.caFree;
end;
更新 OP已尝试此解决方案,但未按预期工作 调查QC时,有报道称,这在移动android平台上并没有达到预期效果: 及 (您必须登录才能访问它们) 后者解释了正在发生的事情。当模态形式被破坏时,FFocusedControl可能指向一个被破坏的控件。当ARC试图释放FFocusedControl时,这将导致分段故障。FFocusedControl必须声明为[弱]。有关更多详细信息,请参阅RSP-9665 也有报告相同的事情,并在XE7中解决。这显然不是真的。Embarcadero在谈到FMX ShowModal和移动平台时说
警告:Android应用程序不支持模式对话框。您不应该调用ShowModal,而应该调用Show,让表单返回并调用您的事件。我们建议您不要在任何移动平台(iOS和Android)上使用模态对话框,因为可能会导致意外行为。不使用模态对话框可以消除调试和支持移动应用程序时的潜在问题 这个问题似乎只在Delphi XE7中出现。我现在使用的是Delphi XE8,不再存在此问题。尝试完全删除FormClose。您已经发布了两次表单。@DalijaPrasnikar是的,谢谢。看来问题解决了!奇怪的是,在embarcadero网站上,它说你必须使用它。@DalijaPrasnikar,这种情况下,当
DisposeOf()
不能使用时。有关详细信息,请参阅。@LURD我还发现了Android上的showModal教程,但在本例中它是不正确的。您所观察到的任何行为是否可以算作在移动平台上使用showModal
时发出警告的“意外行为”,不支持模态对话框的地方?我也试过了,但还是出现了这样的错误。所以我想@DalijaPrasnikar方法是正确的方法。你确定你删除了DisposeOf()调用吗?它一定不在那里。是的,我把它拿走了。奇怪的是,我在其他表单上没有这个问题。而且别忘了将模式对话框OnClose
事件设置为FormClose
。关于TED的链接对我来说似乎是个问题。谢谢你的链接!似乎在XE7.showmodel调用中未解决此问题。因此,buttonclick方法中没有任何阻塞。showmodel调用之后的任何代码都将在匿名方法之前执行。