You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遍历OpenForms时排除ActiveMdiChild的实现问题及解决方案

遍历打开窗体并排除活动MDI子窗体的正确实现

问题背景

我需要实现一个遍历所有已打开窗体的循环,但要排除当前活动的MDI子窗体。一开始用ActiveForm.ActiveMdiChild.Name = FormRefresh.Name来判断排除,结果遇到同名窗体时,非活动的同名窗体也被误排除了。另外,我写的Public Shared Sub VerificaAlterações()里的判断语句一直报错,后来把Shared关键字删掉就正常了。

问题拆解与原因

  1. 同名窗体判断失效:靠Name属性判断窗体根本不靠谱——如果同一个窗体类实例化了多个窗口,它们的Name值都是一样的,根本区分不开不同的实例。得直接对比窗体的实例引用才行。
  2. Shared方法报错的坑:Shared方法属于类本身,不属于某个具体窗体实例,在这种方法里没法访问实例级的成员(比如ActiveMdiChild这种和具体实例绑定的对象),所以把Shared去掉改成实例方法,就能正常访问这些内容了。

可行的代码实现

Public Sub VerificaAlterações()
    ' 先拿到当前活动的MDI子窗体实例
    Dim activeChild As Form = Me.ActiveMdiChild
    
    ' 遍历所有已打开的窗体
    For Each openForm As Form In Application.OpenForms
        ' 用实例引用判断,排除活动子窗体
        If openForm IsNot activeChild Then
            ' 这里写你要对非活动窗体执行的操作
            ' 比如检查窗体内容是否有变更之类的
        End If
    Next
End Sub

关键注意点

  • 别再用窗体名称判断了,直接对比Is/IsNot实例引用,每个窗体实例都是唯一的,不会有同名混淆的问题。
  • 如果你的方法需要用到窗体实例的属性或方法(比如ActiveMdiChild),就别加Shared关键字,老老实实用实例方法。

内容的提问来源于stack exchange,提问作者Heitor Badotti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:45:34