我有一个MDI应用程序,可以以TABBED或WINDOWED模式运行。当用户从菜单中选择一些内容时,会显示一个表格。所有菜单项点击几乎看起来是一样的:如何确定表单是否提升了其显示事件
Dim frm As New <SomeForm>
frm.MdiParent = MDIParentForm
frm.Show()
时如果应用程序在选项卡式或窗口模式下运行时唤醒每XX秒,并检查计时。如果应用程序以TABBED模式运行,它将通过所有MDIChildren并将它们添加到制表符(将其跟踪在列表中)。我发现在向tabcontrol中的页面添加表单时存在一个错误 - 它不能正确清除MDIParent,并且在PropertyStore中存在对该表单的引用(由.NET MDI系统使用),因此大内存泄漏。为了解决这个问题,我试图在添加到tabpage之前将表单的MDIParent设置为Nothing/Null,但是由.NET框架抛出StackOverflowException。我怀疑StackOverflowException是由于我正在尝试更改MDIParent而我仍在加载窗体时引起的。我发现(通过1表单上的测试),如果我能够捕捉“显示”事件,我可以毫无问题地更改MDIParent。问题是这些menuItemClick事件处理程序中有数十亿个元素,并且更改每个元素都是不可行的,因此我无法及早为每个表单订阅“已显示”事件。
假设我有从这个MDI应用程序显示的无限数量的这些表单,并且更改这些表单中的每一个都不实际,所以我需要从MDI应用程序中执行某些操作。 Sub()设置MDIParent = Nothing来确定表单是否已经引发了其“显示”事件? (我尝试检查frm.Visible = True,但是会抛出相同的异常)
发布导致异常的代码可能会有帮助。在您的应用程序中使用定时器组件听起来...非传统。 – LarsTech
如果检查Form.Visible会抛出一个异常,表明您的表单没有可能已被处置的句柄。 – Jodrell
@Jodrell,表单绝对没有处理,但认为你有一个有趣的想法来检查IsHandleCreated = True。这将返回true,但如果我尝试设置MdiParent = Nothing,仍然会与StackOverflowException一起崩溃。 – Denis