gpt4 book ai didi

forms - 防止模式窗体在退出时关闭所有无模式打开的窗体

转载 作者:行者123 更新时间:2023-12-04 19:49:25 25 4
gpt4 key购买 nike

我在 Excel 中使用 VBA 表单时遇到了一些奇怪的行为。我有一个调用无模式窗体的模块,它作为调用其他窗体的中心。其他形式被调用为模态。问题是,一旦子窗体被隐藏或卸载,父无模式窗体也会关闭。

我试图找到这个问题的答案,但尽管存在这些问题,但没有一个提供有效的答案。

经过一些测试,我确定任何数量的打开的无模式窗体都将以相同的方式关闭。此外,我无法在新工作簿中使用最小模型重现该问题。之后,我继续逐个添加原始Workbook的所有组件(有几个模块,10-20个类和几个窗体),看看什么时候出现问题。

当我发现即使我完全导入所有内容后问题也没有再次出现时,我既感到宽慰又感到恼火。我的结论是,这是一种侥幸,不会再打扰我了。但是,不久之后,当我添加另一个具有相同调用代码的子窗体时,新窗体又开始出现同样的情况,但旧窗体没有。

然后我继续导出行为不当的表单,将其从工作簿中删除,然后导入。瞧,它又起作用了。

有没有人遇到过这种行为?难道我做错了什么?或者我应该将其视为一个烦人但可以规避的错误?

请在下面找到问题的最小模型,排除所有内容:

调用主窗体的模块:

Sub testA()

Dim main1 As MainForm1

Set main1 = New MainForm1

main1.Show (vbModeless)

End Sub

主要形式:

Option Explicit

Dim formobject As frmPickInjection

Private Sub CommandButton1_Click()

Set formobject = New frmPickInjection


With formobject
.Show (vbModal)
Label1.Caption = CStr(.SelectedInjection)
End With

End Sub

子窗体:

Option Explicit

Public passvar As Boolean

Private Sub CheckBox1_Click()
passvar = CheckBox1.Value
End Sub

系统:Microsoft Windows 7 Enterprise 6.1.7601(Service Pack 1 Build 7601)

Excel版本:Office365 Excel 2016 (16.0.6729.1014), 64位

VBA 版本:7.1

最佳答案

我以前遇到过这个问题。不确定这是否已经解决,但对于希望解决此问题的 future 用户:

我发现解决这个烦人和间歇性问题的唯一方法是模态显示用户窗体,然后隐藏并重新显示用户窗体无模式。

Unload MyChildUserform
MyParentUserform.Show vbModal
MyParentUserform.Hide
MyParentUserform.Show vbModeless

它笨拙且烦人,但它似乎有效并且至少是一致的。

编辑:

恕我直言,一个更好的解决方案是自己控制表单的模态。

声明:

Public Declare Function EnableWindow lib "user32.dll" (ByVal hWnd as Long, ByVal fEnable as Long) as Long
Public Declare Function FindWindow lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName as String, ByVal lpWindowName as String) as Long

Public Enum MakeAsModal
Modal = 0
Modeless = 1
End Enum

Public ghWndParent as Long

公共(public)订阅:

Public Sub ChangeModality(ByRef hWnd as Long, ByVal isModal as MakeAsModal)
On Error Resume Next
Dim RetVal as Long
RetVal = EnableWindow(hWnd,isModal)
End Sub

家长表格:

Private Sub Userform_Initialize()
'Parent Form
ghWndParent = FindWindow(vbNullString, Me.Caption)
End Sub

Private Sub CallChild()
'Parent Form
ChildUserform.Show vbModeless
ChangeModality ghWndParent, Modal
End Sub

子表单:

Private Sub Userform_QueryClose(Cancel As Integer, CloseMode as Integer)
'Child Form
ChangeModality ghWndParent, Modeless
End Sub

关于forms - 防止模式窗体在退出时关闭所有无模式打开的窗体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37401393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com