首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查Access 2003表单、Modal或Modeless的状态?

如何检查Access 2003表单、Modal或Modeless的状态?
EN

Stack Overflow用户
提问于 2009-09-10 13:37:14
回答 4查看 3.9K关注 0票数 3

对于在Access 2003下运行的项目,我有一个通常设置为无模式的表单,但在某些情况下是以acDialog和thusly模式打开的。

此表单现在需要检查其本身是否是Modal,或不修改其行为按钮-点击相应。

代码语言:javascript
复制
Me.Form.Modal

只返回在设计模式中指定的属性值,而不是当前状态。

我为VB找到了一个类似的答案,建议使用GetWindowLong API-调用“用户”,但这并不能转化为VBA (Microsoft KnowledgeBase 77316),恐怕: Access2003找不到‘用户’文件。

简单地说,是否有可靠的方法从表单内部判断表单本身是模态的还是非模态的?

蒂娅。

编辑:我似乎记得,Me.Form实际上就相当于我自己。据我所知,Form属性是默认属性,因此如果省略它,则假定为Form属性。不管怎么说,Me.Modal和Me.Form.Modal都会传递'false‘值,而不管打开表单的方式如何。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-10 20:15:40

弄明白了API (我想用一些黑客的方式来访问表单,做一些有趣的事情)

把这个放在一个模块里

代码语言:javascript
复制
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事件中(或任何地方)

代码语言:javascript
复制
  MsgBox "Hi I'm " & IIf(IsModal(me.Hwnd), "Modal", "Not Modal")
票数 3
EN

Stack Overflow用户

发布于 2012-11-17 01:49:35

我知道这是个老掉牙的回答。我只想指出,P 122的解决方案实际上并不是读取窗口的模态状态,而是弹出状态,这对我来说很好,因为这就是我想要的。

如果在模态非弹出窗口中打开表单,则P 122的IsModal函数返回false。如果在非模态弹出窗口中打开窗体,IsModal将返回true。因此,IsModal实际上是IsPopup。

票数 4
EN

Stack Overflow用户

发布于 2009-09-10 18:53:20

对于当前的问题,我不一定建议这样做(尽管这可能是一个解决方案),但在某些情况下,它可以派上用场,即用acDialog + acHidden打开一个表单,更改它的属性,然后设置.Visible = True。这会使表单在出现时变成模态,而不是在打开时变为模态。也就是说,代码一直运行到表单设置为.Visible并暂停为止,就像它只使用OpenForm命令中的acDialog参数一样:

代码语言:javascript
复制
  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。

在我看来,这种方法的缺点是,这两种形式必须相互了解太多。我更希望对话框表单可以从多个上下文中使用,这意味着没有对任何可能调用它的表单的硬连接引用(而且它可能是在一个只使用代码的上下文中调用的,而不是从另一个表单中调用)。但是当你需要做这样的事情时,这是一种完成它的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1405364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档