窗体本身/综合应用
窗体属性 弹出方式、模式和代码acDialog模式的区别
2017-11-01 15:25:44

在Access中,我们可以设置打开窗体为最前端,且不关闭之前是不允许其他操作的。

这个打开的窗口我们称为“对话框”窗体:即打开后显示是程序最上端,在关闭它之前,会暂禁止用户对此程序内此窗体以外的其他对象的操作。按照微软的帮助信息里所述,创建一个对话框窗体需要对窗体作以下设置:

  1. 在“弹出方式”属性框中,单击“是”。

  2. 在“模式”属性框中,单击“是”选项。

  3. 在“边框样式”属性框中,单击“对话框边框”。

  4. 在“记录选择器”属性框中,单击“否”。

  5. 在“导航按钮”属性框中,单击“否”。

  6. 在“分隔线”属性框中,单击“否”。

注:关键是前3条,后3条只是对“对话框”窗体的美化。

围绕这几个窗体设置问题,我们来探讨一下在窗体的属性中有[弹出方式]、[模式]、[边框样式]几个属性,在打开窗体的VBA命令中有acDialog参数的作用。

一、[边框样式]

属性中[边框样式](BorderStyle)有以下选择:无/细边框/可调边框/对话框边框,其他几个与本主题无关,就说说这个“无边框边框”,如果设置了“无边框边框”则本窗体有个粗边框,并且只能包含一个标题栏、“关闭”按钮和“控制”菜单。窗体不能最大化、最小化或调整大小(“控制”菜单上的“最大化”、“最小化”和“大小”命令也不可用)。但这些,仅仅是实现一个对话框窗体的一部分,它只是设置了一个框架,要实现真正的对话框窗体还需要很多其他的设置。

二 、[弹出方式]

属性中的这个弹出方式(PopUp)有两个选择:是/否(True/False),把窗体的弹出方式设置为:是,将实现打开它后,它停留在其他所有窗口的上面。如果有两个弹出方式为“是”的窗体同时打开,则它俩会根据焦点的获得需相互覆盖。注:此属性在窗体运行状态与不可更改(可读不可写)。

三 、[模式]

属性中的这个模式(Modal)同样有两个选择:是/否(True/False),当窗体(或报表)的模式设为“是”后,打开它后,在焦点移到另一个对象之前,必须先关闭该窗口。注:此属性在窗体运行状态下可读写。

设置好上面3个属性,再加上所开头所述的美化,一个对话框窗体基本就设置好了。但是,对于上面设置出来的窗体,也只能称之为伪对话框(可能是我一面之辞),为什么这么说呢,因为即然是对话框,理论上说,就应该禁止用户对程序内本窗体外其他所有对象的操作。但实事上,这样设置好的窗体并没有做到这一步,到VBA窗体中测试一下,更改代码就知道了,一切还是畅通无阻。是的,问题就出在这里。

举个例子来讲,一个“窗体A”如上所设。我们来写一个代码:

DoCmd.OpenForm "窗体A"

DoCmd.Close acForm, "窗体B"

运行这两句代码,你不要指望在运行第一句后,直到“窗体A”关闭后,才运行第二句。事实上它会一气哈成的运行完。这就是我之所以称之为伪对话框的原因。

那么,如果程序需要,一定要运行第一句后,直到“窗体A”关闭后才运行第二句该怎么做呢?

四 、[DoCmd.OpenForm "xx",,,,,acDialog]

还好,微软在打开窗体时提供了一个参数"WindowMode",可选项有:

AcWindowMode 可以是下列 AcWindowMode 常量之一:
acDialog 窗体的 Modal 和 PopUp 属性设为“是”。
acHidden 窗体隐藏。
acIcon 打开窗体并在 Windows 工具栏中最小化。
acWindowNormal 默认值 窗体采用它的属性所设置的模式

现在我们只关心那个acDialog,上面的描述来自帮助信息,里面说了,acDialog 参数等于窗体的 Modal 和 PopUp 属性设为“是”。事实上它并非这么简单,它是真正实现了一个对话框窗体。在打开窗体的命令行上带上它,就可以实现我们上面的要求了。

代码更改如下:

DoCmd.OpenForm "窗体A",,,,,acDialog

DoCmd.Close acForm, "窗体B"

有什么不同看法,欢迎斧正。