在Delphi XE7中第二次在Android上打开表单时发生访问冲突
作者:互联网
当我第一次打开表单时,没有任何违反,但是当我第一次选择一个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然后关闭表单时才会出现违规,所以我认为它与虚拟键盘有关,但我不确定.我没有使用虚拟键盘本身的任何方法.
解决方法:
更新资料
尽管我的建议已记录在案,但Android和多种形式仍然存在问题.请参阅本文后面的内容.
根本不要调用DisposeOf()或Free. FormClose()和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;
更新资料
OP尝试了此解决方案,但无法正常工作.
调查质量控制时,有报告声称这在移动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中解决.这显然是不正确的.
标签:delphi-xe7,forms,firemonkey,android,delphi 来源: https://codeday.me/bug/20191028/1953789.html