【发布时间】:2018-05-01 15:31:59
【问题描述】:
简介:
我知道 - 显示用户表单 - 最好的做法是
- 在用户表单代码中处理
QueryClose(If CloseMode = vbFormControlMenu ...) - 在其中不做
Unload Me,只是一个胆小的Me.Hide指令 (在通过Cancel = True防止 [x]-itting 和最终自毁之后) - 在 [class] 代码中设置相关变量/[property](例如
.IsCancelled=True) - 为了能够通过调用代码卸载UF。
有用的链接
一个出色的概述“UserForm1.Show?”可以在https://rubberduckvba.wordpress.com/2017/10/25/userform1-show/找到 以及许多示例性 SO 答案(感谢 Mathieu Guindon aka Mat's Mug 和 RubberDuck)。
更多选择(►编辑自 2019 年 5 月 1 日起)
- Disadvantages in putting code into userforms instead of modules
- Passing variable from form to module
- Apply logic for userform dialog (Rubberduck)
- The perfect userform (Vitosh academy)
1) 模态用户表单的工作示例
据我了解 - 并且我确实尝试学习 - 以下代码对于 modal UF 应该是可以的:
案例 1a) .. 为 UF 实例使用 局部变量,如常见的那样:
Public Sub ShowFormA
Dim ufA As UserForm1
Set ufA = New UserForm1
' show userform
ufA.Show ' equivalent to: ufA.Show vbModal
' handle data after user okay
If Not ufA.IsCancelled Then
' do something ...
End If
' >> object reference destroyed expressly (as seen in some examples)
unload ufA
End Sub
案例 1b) .. 没有局部变量,但使用 With New 代码块:
' ----------------------------------------------------------
' >> no need to destruct object reference expressly,
' as it will be destroyed whenever exiting the with block
' ----------------------------------------------------------
With New UserForm1
.Show ' equivalent to: ufA.Show vbModal
' handle data after user okay
If Not .IsCancelled Then
' do something ...
End If
End With
2) 问题
使用 MODELESS UserForm 实例会出现问题。
好的,with 块方法(参见 1b)应该足以在 x-iting 之后销毁任何对象引用:
With New UserForm1
.Show vbModeless ' << show modeless uf
End With
如果我尝试,但是
- a) 获取有关可能的用户取消的信息以及
- b) 到
Unload的一个表格,如果在Show指令之后使用局部变量(例如“ufA”)受洗,
由于表单是 MODELESS,所有代码行都将立即执行:
- 代码显示表单,下一刻..
- 代码发现没有用户取消,因为没有时间进行任何用户操作,下一刻..
- [如果对用户表单使用局部变量,代码将卸载表单]
3) 问题
我该如何处理 a) 通过 MODELESS 表单的调用代码正确报告的 UserForm 取消以及 b) 如果使用局部变量则(必要?)卸载?
【问题讨论】:
-
@Mat's Mug ad) 编辑:当然在 1a) 中必须有一个
If Not**Ufa**.IsCancelled- 人们应该避免在下面的一些行中复制一个明显相似的代码(参见 1b):-)。尽管如此,我希望至少为学习程序员提供了一个有用的问题。 -
@Mat's Mug,感谢您通过评论澄清了一些背景,从而证实了我探索 VBA 的 OOP 能力并尝试 MVP 解决方案的决心。如果仅是由于不同的哲学而导致的(无法解释的)投票,那就更不公平了。顺便说一句,橡胶可以是一种非常坚固的材料:-;
-
我什至会说SOLID!