德尔福错误:“无法关注禁用或不可见的窗口”

时间:2013-03-06 01:21:10

标签: delphi delphi-xe2

运行我编译的程序时出错了。我已经采取了一切我能想到的预防措施来防止错误,例如在隐藏或聚焦之前启用表单。该应用程序在叠加层顶部显示DimmerForm(灰色渐变叠加),然后显示NewFileFormNewFileForm执行其操作并确定要创建的文件,并在tabsheet的页面控件中创建新的MainForm,并显示新创建的选项卡表。所有这些工作到目前为止(我可以在NewFileForm关闭之前中断,并且发生任何错误并看到标签页已经创建并成功显示)。然后NewFileForm关闭,再次正常工作。

当任何事情尝试将焦点设置回MainForm时,会发生错误。隐藏DimmerForm,或点击MainForm,或将焦点设置为MainForm代码都会导致出现错误消息。将代码放在{tryexceptend}中也不会阻止错误消息。我已经搜索了代码中的所有其他方法,这些方法可能由MainForm的聚焦触发,并且在错误发生之前没有输入任何方法(因此无法导致它)。

我在我的应用程序的先前版本中写了几乎完全相同的代码,然后决定从头开始重构它。该应用程序的先前版本在表格聚焦方面毫无障碍地工作。

以下是打开NewFileForm的代码:

procedure TMainForm.NewFilesToolButtonClick(Sender: TObject);
begin

  ShowDimmer;
  NewFileForm.ShowModal;
  HideDimmer;

end;

以下是显示调光器形式的代码:

procedure ShowDimmer;
begin

  // Enable to prevent errors
  DimmerForm.Enabled := true;

  // Hide dimmer form and show mainform
  DimmerForm.Show;

end;

以下是隐藏调光器形式的代码:

procedure HideDimmer;
begin

  // Enable to prevent errors
  DimmerForm.Enabled := true;
  MainForm.Enabled := true;

  // Hide dimmer form and show mainform
  DimmerForm.Hide;
  MainForm.SetFocus;

end;

3 个答案:

答案 0 :(得分:5)

通常,您将焦点调用到尚未创建的内容(在您正在创建的表单上),尝试将一些onCreate代码移动到onShow。有了更多的细节,很难说出发生了什么,但试试这个。

答案 1 :(得分:0)

有时此错误是由于Post事件期间数据库组件的某种活动引起的... 如果您尝试其他方法,可以尝试以下快速解决方案:将连接到数据集的数据源设置为NIL,然后在完成Post事件后将其重新设置。

类似这样的东西:

Try
    Datasource1.DataSet := NIL;

    Try
        Query1.Post;
    Except
        On E: Exception Do
        Begin
            ShowMessage('Post error!' + #13#10 + #13#10 + E.Message);
            Exit;
        End;
    End;

Finally
    Datasource1.DataSet := Query1;
End;

答案 2 :(得分:-1)

Arioch 'The发表的评论中给出的解决方案

  

您还可以启用“使用调试DCU” [...]