对于在Access 2003下运行的项目,我有一个通常设置为无模式的表单,但在某些情况下是以acDialog和thusly模式打开的。
此表单现在需要检查其本身是否是Modal,或不修改其行为按钮-点击相应。
Me.Form.Modal只返回在设计模式中指定的属性值,而不是当前状态。
我为VB找到了一个类似的答案,建议使用GetWindowLong API-调用“用户”,但这并不能转化为VBA (Microsoft KnowledgeBase 77316),恐怕: Access2003找不到‘用户’文件。
简单地说,:是否有可靠的方法从表单内部判断表单本身是模态的还是非模态的?
蒂娅。
编辑:我似乎记得,Me.Form实际上就相当于我自己。据我所知,Form属性是默认属性,因此如果省略它,则假定为Form属性。不管怎么说,Me.Modal和Me.Form.Modal都会传递'false‘值,而不管打开表单的方式如何。
发布于 2009-09-10 20:15:40
弄明白了API (我想用一些黑客的方式来访问表单,做一些有趣的事情)
把这个放在一个模块里
Const GWL_EXSTYLE = (-20)
Const WS_EX_MDICHILD = &H40
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Function IsModal(ByVal lHwnd As Long) As Boolean
Dim lWinstyle As Long
lWinstyle = GetWindowLong(lHwnd, GWL_EXSTYLE)
If (lWinstyle And WS_EX_MDICHILD) Then
IsModal = False
Else
IsModal = True
End If
End Function然后在您的form_Load事件中(或任何地方)
MsgBox "Hi I'm " & IIf(IsModal(me.Hwnd), "Modal", "Not Modal")发布于 2012-11-17 01:49:35
我知道这是个老掉牙的回答。我只想指出,P 122的解决方案实际上并不是读取窗口的模态状态,而是弹出状态,这对我来说很好,因为这就是我想要的。
如果在模态非弹出窗口中打开表单,则P 122的IsModal函数返回false。如果在非模态弹出窗口中打开窗体,IsModal将返回true。因此,IsModal实际上是IsPopup。
发布于 2009-09-10 18:53:20
对于当前的问题,我不一定建议这样做(尽管这可能是一个解决方案),但在某些情况下,它可以派上用场,即用acDialog + acHidden打开一个表单,更改它的属性,然后设置.Visible = True。这会使表单在出现时变成模态,而不是在打开时变为模态。也就是说,代码一直运行到表单设置为.Visible并暂停为止,就像它只使用OpenForm命令中的acDialog参数一样:
DoCmd.OpenForm "dlgMyDialog", , , , , acDialog +acHidden
With Forms!dlgMyDialog
!cmbMyComboBox.Rowsource = ...
!cmdClose.Tag = "Modal"
.Visible = True ' <= code pauses here
End With当您需要从另一个用acDialog打开的表单(用acDialog打开)打开一个模态表单时,您可以使用它。也就是说,使用acDialog + acHidden打开新对话框,并在子窗体的OnOpen事件中设置.Visible = True和父(即调用)窗体的.Visible = False。若要将调用表单还原为对话框模式,请在子窗体的.Visible事件中设置调用窗体的OnClose = True。
在我看来,这种方法的缺点是,这两种形式必须相互了解太多。我更希望对话框表单可以从多个上下文中使用,这意味着没有对任何可能调用它的表单的硬连接引用(而且它可能是在一个只使用代码的上下文中调用的,而不是从另一个表单中调用)。但是当你需要做这样的事情时,这是一种完成它的方法。
https://stackoverflow.com/questions/1405364
复制相似问题