【问题标题】:Show second form on button click in delphi android在delphi android中单击按钮时显示第二种形式
【发布时间】:2017-02-08 14:59:12
【问题描述】:

当我触摸按钮和调试器调用 form.show 时引发错误。

Project AVA.apk 引发异常类 EJNIException,并带有消息“android.view.ViewRootImpl$CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图。”。

单元2:

var  
   frmSettings: TfrmSettings;

Unit1 Button onClick 事件:

procedure TfrmMain.btnSettingsClick(Sender: TObject);
begin
  frmSettings:=TfrmSettings.Create(Application);
  frmSettings.Show;
end;

【问题讨论】:

  • 这里不足以重现您的问题。你能给我们提供一个 MCVE 吗?
  • @JerryDodge 请仔细阅读我的代码^^^。
  • 我确实非常仔细地阅读了您的代码,并且我看到了我一直使用的两行代码,它们应该可以工作。这个表格里有什么?这种其他形式是否调用了其他东西?您是否在使用设备视图?您是否能够开始一个没有任何内容的新项目并重现问题?
  • 只是为了试用,通过nil 而不是Application。从理论上讲,这应该按照您的方式工作,但值得一试。这是我能看到的唯一建议。
  • 请确认您收到以下设置的错误消息:两种形式:1) TfrmMain 与您显示的 TButton 和 OnClick 事件。 2) TfrmSettings,空表单。

标签: android delphi


【解决方案1】:

您提供的代码本身不会导致错误。但是,在创建和/或显示表单期间执行的代码可能会。

您似乎正在使用/调用需要在 Android UI 线程上下文中运行的原生 Android API。由于 Delphi 主线程和 Android UI 线程是不同的线程,因此您会触发错误。

为了避免它使用:

procedure TfrmMain.btnSettingsClick(Sender: TObject);
begin
  CallInUiThread(procedure
    begin
      frmSettings:=TfrmSettings.Create(Application);
      frmSettings.Show;  
    end);  
end; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 2021-04-07
    • 2011-05-23
    • 1970-01-01
    相关资源
    最近更新 更多