如何在子窗体打开时冻结父窗体

2024-03-23

我遇到的情况是,在某些情况下,我需要打开另一个表单并保持该表单的焦点(modal = true),当它们不聚焦并且关闭时,父表单上的控件将使用可能已更改的可能数据进行刷新。

最初我有一个方法可以DoEvents虽然子表单已打开,但它导致多个子表单无法用于数据输入/编辑(它们未在表单级别进行数据绑定)。

ShowForm 方法 - 最初

Public Sub ShowForm(par As Form, nm As String, _
                    Optional whr As String = "", _
                    Optional args As String = "", _
                    Optional mode As AcFormOpenDataMode = acFormPropertySettings)
    DoCmd.OpenForm nm, acNormal, , whr, mode, , args
    
    While IsOpen(nm)
        DoEvents
    Wend
End Sub

为了让我的子表单始终可用,我必须注释掉While...Wend loop.

我是否可以在此方法或调用控件的 OnClick 内部使用另一种逻辑模式,这样当它们关闭子窗体时,我可以在子窗体关闭后执行代码?


最简单的方法是在对话框模式下打开表单。例如,

DoCmd.OpenForm nm, acNormal, , whr, mode, acDialog, args

这将暂停调用模块中代码的执行,直到表单关闭。它还将阻止用户与任何其他表单交互,直到“对话框”表单关闭。


我发现在对话框模式下打开绑定表单,更新数据,关闭表单,然后刷新调用表单上的对象(例如,组合框的行源)并不总是可靠的。

接下来是我编写的一个通用函数,用于“暂停”调用代码,而无需在对话框模式下打开表单,并且不会明显影响用户界面的性能。它适用于表单和报告。请注意,Sleep API 声明必须位于代码模块的顶部(在模块声明部分中)。

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

'-------------------------------------------------------------------------------
' Procedure : WaitTilObjClosed
' Author    : Mike
' Date      : 1/7/2009
' Purpose   : Halts program execution until user closes object.  User is 
'               generally unaffected by the loop.
' Requires  : Sleep API sub
' Notes - while Sleeping other programs can use processor but access cannot;
'       - during DoEvents, other parts of Access can use processor;
'       - without the Sleep call, processor usage stays at 100% for MSACCESS.EXE
'       - with a long Sleep call, Access becomes noticeably sluggish
'-------------------------------------------------------------------------------
'
Sub WaitTilObjClosed(ObjType As AcObjectType, ObjName As String)
    Do
        DoEvents
        Sleep 1
        If (SysCmd(acSysCmdGetObjectState, ObjType, ObjName) = 0) Then Exit Do
    Loop
End Sub

您可以按如下方式使用它:

DoCmd.OpenForm "MyForm"
WaitTilObjClosed acForm, "MyForm"
MsgBox "MyForm is now closed"

DoCmd.OpenReport "MyReport", acViewPreview
WaitTilObjClosed acReport, "MyReport"
MsgBox "MyReport is now closed"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在子窗体打开时冻结父窗体 的相关文章

  • 添加 NOT LIKE 条件后查询返回的结果太少

    我的 Access 2010 数据库在我稍微更改用户请求的查询时表现得很奇怪 我有一个非常大的表 不要问 查询在其上运 行 然后提供给用户输入表单 不管怎样 今天 一种特殊的形式开始返回的结果比我们预期的要少得多 它通常会返回大约 1200
  • OleDB INSERT 命令错误

    我有一个数据库 我使用 MS ACCESS 我有这个插入代码 我可以读取数据 但写入时出错 我按照说明操作 但它不起作用 这是我的代码 OleDbConnection con new OleDbConnection provider Mic
  • 如何在选择查询中创建新列

    在 MS Access 中 我想将新列插入到选择查询的返回结果中 新列的每一行都具有相同的值 例如 我的选择返回列 A B 我希望 C 成为选择查询创建的新列 A B C a1 b1 c a2 b2 c a3 b3 c select A B
  • 我如何调用下面的函数来填充我的访问表单列表控件

    我需要从访问表填充访问表单列表框 以下是我在按钮单击事件上复制粘贴的代码 Public Sub PopulateLBWithData DBPath As String TableName As String FieldName As Str
  • MS Access 2016 树视图错误:“此控制元素中没有对象。运行时错误 438”

    我在 MS Access 中打开树视图时遇到问题 我认为这是自上次 Windows 更新以来的情况 当我启动程序时收到一条错误消息 此控制元素中没有对象 运行时错误 438 对象 不支持此属性或方法 调试器将 vba 代码中的一行标记为黄色
  • 如何在access中查看宏代码?

    我有一个 Microsoft Access 数据库 里面有一个宏 如何查看宏的代码 打开Access数据库 您将看到表 查询 报告 模块和宏 其中包含可用于按顺序调用常见 MS Access 操作的宏 对于自定义 VBA 宏 请按 ALT
  • Access 2010中的TableDef对象需要什么参考

    我正在尝试在新的 Access 2010 Access 安装中使用在 Access 2003 中编写的宏 mdb 文件 打开我的文件时出现编译错误TableDef无法找到对象 当我检查 工具 gt 参考 菜单时 我看到 Microsoft
  • 如何从access中的表中获取选择性记录

    下面给出的是我的查询结果 但有很多冗余记录 因此 我想过滤掉这个查询的结果 我的目标是每个角度仅提取两个记录 第一个和最后一个 例如当角度为195 我想获得它的第一条记录日期 2 27 2017 时间 2 00 00 AM和 日期为的第二条
  • 如何在 MS Access 表单上动态保持控件居中(相对位置)?

    我正在使用 Access 2013 并且有许多控件 列表框 按钮等 当调整表单大小时 我希望它们作为一个组在表单上保持居中 锚定无法实现我正在寻找的目标 因为我不想将控件锁定到顶部 底部 左侧 右侧 我希望他们留在中心 只需使用这样的代码m
  • 在 MS-Access 中以编程方式隐藏列

    我想根据用户选择的变量数据隐藏或显示列 如何在 MS Access 2003 中将列设置为隐藏 例如 用户更改事件后 For Each ctl In Me FormNameHere Form Controls If TypeName ctl
  • 使用 UNION 进行分组

    我的代码未正确分组 它仍然没有将 Reden uitstroom2 和 Reden uitstroom3 与 Reden uitstroom1 分组 计数工作正常 但在 Reden Uitstroom1 中显示重复项 例如 雷登 伊斯特鲁姆
  • 如何将带有嵌套节点(父/子关系)的 XML 导入 Access?

    我正在尝试将 XML 文件导入 Access 但它创建了 3 个不相关的表 也就是说 子记录被导入到子表中 但无法知道哪些子记录属于哪个父记录 如何导入数据来维护父子节点 记录 之间的关系 以下是 XML 数据的示例
  • VBA 中的查找和查找下一个

    我正在研究 Excel 宏 当我从另一个 Excel 工作表获取数据时 我需要什么 代码应该首先检查是否有任何其他行具有相同的 FundName 如果找到 则条件适用 我只是给出要检查 FundId 的 Excel 工作表示例 S No F
  • 将数据从表单插入表中

    我已经有 3 年没有使用 VB 或 VBA 代码了 我正在开展一个工作项目 我需要获取表单上列出的信息并将其插入到表格中 我所坚持的是代码的最后一部分 即值部分 这是我到目前为止所拥有的 插入志愿者 姓名 电子邮件 电话号码 紧急联系人 紧
  • 如何使用循环自动填充表单上的文本框?

    所以我有一个表 其中包含我试图在表单上显示的总计列表 我需要从总计表中获取 10 个总计并显示在表单上的 10 个文本框中 这10个文本框分别是 A1 A2 A3 及其使用DLookup查找 ID 字段编号 这似乎是一个语法问题Me TEX
  • 如何获取Access数据库中已更改的记录详细信息

    我有一个 Access 数据库 其中有许多表和数千条记录 如果有人更改其中的任何数据 任何行 甚至只是一个单元格 有什么方法可以知道哪些特定行或单元格已更改Access 数据库 任何属性或者我应该使用任何触发器吗 几年前我在使用 MSSQL
  • 如何确定Access数据库中哪个表使用的空间最多?

    有没有简单的方法可以确定 Access 2007 数据库中每个表使用了多少空间 我有一个异常大的 Access 数据库 需要找出哪个表使用最多的空间 行计数没有提供有关已用空间的足够信息 我知道这是一篇旧文章 但我根据自己对同一问题的经验有
  • MS-Access:合并彼此“下方”的两个表

    我的 Access 数据库中有两个表 它们看起来像这样 Table1 Kabelnummer Column1 Column2 Column3 1 x x x 2 x x x
  • 查询不可更新

    我正在尝试使用 BE SQL Server 2012 Express 中的记录更新本地 Access 2007 表 我的步骤在这里 SQL Server中存在带有4个参数的存储过程来获取所需的记录 Access VBA中有调用SP并进行临时
  • 在 Microsoft Access 中编写查询,字段描述错误 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题是由拼写错误或无法再重现的问题引起的 虽然类似的问题可能是on topic help on topic在这里 这个问题的解决方式不

随机推荐