VB6.0 父窗体事件show子窗体后等待子窗体关闭,并在关闭后由子窗体事件返回指定的值
时间: 2024-10-23 16:17:59 浏览: 63
在VB6.0中,如果你希望在父窗体上调用子窗体后等待子窗体关闭,并从子窗体的某个事件中获取结果,你可以采用下面这种设计:
首先,在子窗体的代码中,当子窗体关闭时(比如关闭按钮点击或`Unload`事件),设置一个变量来存储你需要传递的值。然后在这个事件里触发一个消息(如通过`PostMessage`函数)告诉父窗体关闭完成并附带结果。
在父窗体的`Show`事件中,创建子窗体并设置回调处理函数。例如,你可以创建一个全局变量来接收子窗体的关闭消息和结果,如下所示:
```vb
Public varResult As Variant ' 全局变量用于存放子窗体的结果
Private Sub ShowSubForm()
Dim subForm As New SubFormClass ' 假设子窗体类名为SubFormClass
Set subForm = Me.Controls.Add("FormClass.SubFormClass", "SubForm", True)
' 在子窗体上添加一个“Close”按钮事件处理
Private Sub subForm_ButtonClose_Click()
varResult = ' 子窗体在这里设置返回值,例如:varResult = 42
PostMessage Parent.hWnd, WM_SUBFORM_CLOSE, VarPtr(Me), 0 ' 发送消息给父窗体
Unload Me ' 关闭子窗体
End Sub
' 显示子窗体
subForm.Show
End Sub
Private Sub UserForm_Resize()
' 当窗体大小改变时,如果子窗体隐藏则不再监听消息
If Not IsObjectVisible(SubForm) Then Exit Sub
' 听取子窗体关闭的消息
Private Declare Function PostMessage Lib "user32" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Const WM_SUBFORM_CLOSE = &H1234 ' 自定义消息代码
On Error Resume Next ' 防止捕获无效的消息
If PostMessage(Parent.hWnd, WM_SUBFORM_CLOSE, 0, VarPtr(Me)) <> 0 Then
On Error GoTo 0 ' 恢复错误处理
' 子窗体已关闭,处理返回值
If VarType(varResult) = vbVariant Or IsNull(varResult) Then
MsgBox "子窗体未提供结果"
Else
' 这里处理varResult
MsgBox "子窗体关闭后返回的值:" & varResult
End If
End If
End Sub
```
在这个例子中,`WM_SUBFORM_CLOSE` 是一个自定义消息,当你在子窗体关闭后发送这个消息,父窗体会监听并获取返回值。记得在`UserForm_Resize`事件中检查子窗体是否可见,因为关闭后子窗体会被隐藏。
**相关问题--:**
1. 如何防止子窗体在Parent窗体关闭时意外关闭?
2. 如果子窗体有多个关闭条件,如何分别处理不同情况下的返回值?
3. 如何改进这个设计,使其更易于维护和测试?
阅读全文