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

时间:2015-02-27 14:08:03

标签: android forms delphi firemonkey delphi-xe7

当我第一次打开表单时,我没有违规,但是当我第一次选择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;

因为违规只会在您点击任何TEdit然后关闭表单时出现,我认为它与虚拟键盘有关,但我不确定。我没有任何方法可以使用虚拟键盘本身。

3 个答案:

答案 0 :(得分:4)

<强>更新

虽然我的建议在此处有记录,但仍有Android和多种形式的问题。请参阅本文后面的内容。


根本不要致电DisposeOf()FreeFormClose()caFree来电是让它发挥作用的关键。

如何处理模态对话框的文档已更改:Using FireMonkey Modal Dialog Boxes

FireMonkey架构师现在几个版本都在努力解决这个问题,最后它可以正常工作

doc如何创建模式对话框的示例:

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;

enter image description here


<强>更新

OP尝试过此解决方案,但无法正常工作。

关注QC,有报道声称这在移动Android平台上无法正常工作:

RSP-9692 Runtime creation of forms in Android

RSP-9665 Access Violation in FMX.Platform.Android SendCMGestureMessage

(您必须登录才能访问它们)。

后者解释了发生了什么。当模态形式被破坏时,FFocusedControl可能指向被破坏的控件。当ARC尝试释放FFocusedControl时,这将导致分段错误。必须声明FFocusedControl [弱]。有关详细信息,请参阅RSP-9665。

还有QC-126524 [Android] Open/Close/Free sub form multiple times may cause crash on Android Platform when removing Focus from TEdit报告了相同的事情,并在XE7中解决了已解决的问题。这显然不正确。

答案 1 :(得分:0)

Embarcadero documentation关于FMX ShowModal和移动平台说

注意:Android应用中不支持模态对话框。您应该调用Show,并让表单返回并调用您的事件,而不是调用ShowModal。我们建议您不要在任何一个移动平台(iOS和Android)上使用模态对话框,因为可能会导致意外行为。不使用模态对话框可消除调试和支持移动应用程序中的潜在问题。

答案 2 :(得分:0)

这个问题似乎只适用于Delphi XE7。我现在正在使用Delphi XE8,不再有这个问题了。