在Delphi XE7的Android上第2次打开表单时发生访问冲突

在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

当我第一次打开我的表单时,我没有收到任何违规信息,但是当我首先选择一个TEdit字段,然后关闭表单,然后重新创建表单并打开表单时,我收到了违规信息

创建表单的代码:

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调用之后的任何代码都将在匿名方法之前执行。