2011-08-05 22 views
0

我有一个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,但是会抛出相同的异常)

+0

发布导致异常的代码可能会有帮助。在您的应用程序中使用定时器组件听起来...非传统。 – LarsTech

+1

如果检查Form.Visible会抛出一个异常,表明您的表单没有可能已被处置的句柄。 – Jodrell

+0

@Jodrell,表单绝对没有处理,但认为你有一个有趣的想法来检查IsHandleCreated = True。这将返回true,但如果我尝试设置MdiParent = Nothing,仍然会与StackOverflowException一起崩溃。 – Denis

回答

-1

检查出Activated事件。

+0

如果这些表格在数以万计的地方被调用,我将如何及早订阅此事件。 – Denis

-1

re:有一个定时器每隔xx秒唤醒一次并检查应用程序是否以TABBED或WINDOWED模式运行。

为什么在编辑模式值而不是使用定时器后运行代码?

re:什么是Sub()设置MDIParent = Nothing以确定表单是否已经引发其“显示”事件的方式?

您可以创建一个默认值为false并且在form_show事件中设置为true的表单级属性。

+0

重新#1,形式总是与一个的MdiParent组示出(见上文MenuItem_Click代码)。如果用户处于TABBED模式,则需要定时器来纠正该问题。重新#2:我有一个十亿个形式 – Denis

0

除删除的MdiParent父母财产,使形式的副本,并删除原:

  1. 创建子窗体的新实例(不MDI父)
  2. 将它添加到tabcontrol
  3. 复制标签中新子窗体中MDI Child的所有内容。
  4. 删除MDI子窗体。
相关问题