【发布时间】:2013-02-20 15:36:27
【问题描述】:
运行我的编译程序时出现错误。我已经采取了我能想到的所有预防措施来防止出现错误,例如在隐藏或集中它们之前启用表单。该应用程序显示DimmerForm(灰色渐变覆盖),然后在覆盖顶部显示NewFileForm。 NewFileForm 完成它的工作并确定要制作的文件并在MainForm 的页面控件中创建一个新的tabsheet 并显示新创建的选项卡表。到目前为止所有这些工作(我可以在NewFileForm 关闭之前中断并且发生任何错误并看到标签表已创建并成功显示)。 NewFileForm 然后关闭,它再次正常工作。
当任何东西试图将焦点设置回MainForm 时,就会发生错误。隐藏DimmerForm,或单击MainForm,或通过代码将焦点设置到MainForm,都会导致出现错误消息。将代码放在 {try, except, end} 中也不会阻止错误消息。我已经搜索了代码中可能由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;
【问题讨论】:
-
尝试将您的
HideDimmer更改为DimmerForm.Hide; MainForm.Show;,别无其他。我很确定MainForm.SetFocus是问题所在,但是您已经脱离上下文发布了三块代码,因此很难确定。 (代码不好,顺便说一句;两个独立的程序操作可见控件通常不是一个好主意。但是很难告诉你如何做得更好;同样,没有上下文。) -
我猜你的问题与新创建的标签页无法获得焦点有关。隔离问题并编写一个可调试的简单可重现测试。
-
是的,显然您正试图聚焦一个禁用或不可见的窗口。错误信息很清楚。但我们可能需要一个复制品来帮助解决它。
-
在您按下 Break on exception 查看调用堆栈面板后,您可能会看到一些事件处理程序,其中包含任何试图最后可视化控件的代码。 stackoverflow.com/search?q=exception+stack+trace+%5Bdelphi%5D 您还可以启用“使用调试 DCU”并在 VCL 内部拦截异常,在那里您可以
Evaluate或Inspect尝试显示哪个对象:Self.ClassName和TComponent(Self).Name。 -
添加了 HideDimmer 和 ShowDimmer 方法用于调试,以尝试在显示和隐藏 DimmerForm 的各种场合中测试一些东西,一旦问题解决,我将摆脱它们。我确实尝试过 DimmerForm.Hide; MainForm.显示;没有喜悦。我相信问题出在新创建的标签页上。删除创建代码会停止发生错误。 TTabSheet 是在错误发生之前完全创建的,但这让我感到困惑。错误肯定会发生在创作中吗?在错误发生之前,它的任何过程都不会被调用(除了创建)。
标签: delphi delphi-xe2