在 MS Access 中使用 Z 顺序和位置来组织打开的表单
Posted
技术标签:
【中文标题】在 MS Access 中使用 Z 顺序和位置来组织打开的表单【英文标题】:Use Z-order and position to organize open forms in MS Access 【发布时间】:2014-04-21 17:20:42 【问题描述】:对于 MS Access 2010,我需要一种在打开十几个表单时灵活维护位置和 Z 顺序的方法。 Parent 表单可以有多个实例,每个实例都可以导致 Child 表单的多个实例(一些 background here)。
我希望用户能够选择最顶层的表单——这意味着我不希望将任何表单设置为Popup
。另外,我希望在打开新子项时基本上保留 Z 顺序。当 Child 打开时,Parent 失去焦点;在那一点上,我希望父级回到它在 Z 顺序中的先前位置。我可以沿着这条线添加要求,但你明白了......我想象默认行为可能会做我想要的,但如果我必须从数组或类似的东西中分配 Z 顺序位置,我可以接受。
我还想控制子表单在屏幕上的位置(我的意思是仅当它们第一次打开时;它们可以重新定位)。如果它们以相同的X,Y
坐标打开,它们将看起来堆叠在一起,用户必须重新定位顶部实例才能看到其他实例。这很不方便,而且我认为更重要的是,让人迷失方向。
到目前为止,我无法拥有这一切。通过指定X,Y
位置,我可以得到一个不错的级联结果,但是当我使用标志戳 Z 顺序时它停止工作。
我一直在使用 API...
Declare Sub SetWindowPos Lib "user32" ( _
ByVal Hwnd&, _
ByVal hWndInsertAfter&, _
ByVal X&, ByVal Y&, ByVal cX&, _
ByVal cY&, ByVal wFlags&)
Global Const HWND_TOP = 0
Global Const HWND_TOPMOST = -1
SetWindowPos Hwnd, HWND_TOP, lngPosX, lngPosX, 0, 0, SWP_NOSIZE
当我尝试hWndInsertAfter&
和wFlags&
的选项时,我得到了不同的结果。此外,当我将表单设置为Popup
时(结果更好,但如前所述,我希望用户将任何表单置于顶部;因此没有Popup
)。
(嗯...我敢打赌Popup
(和“模态”)正是使 API 得到最佳使用的原因,因为当显示“必须回答”对话框时,控制基本上恢复到 Windows。确认?)
我最大的挫败感是 API 的文档似乎零散且不连贯。我想知道,我是否坚持使用该 API?还有什么我可以使用的吗? 除了 API 之外,我还喜欢 VBA 解决方案,但我想这就是 API 的用途。不过,有没有我错过的方法?
我可以更详细地发布我的变体尝试,但我觉得我一直在黑暗中拍摄,所以我会等待你的反馈。
更新
我尝试阅读The Manual。我试着玩弄“表单所有权”和NO/TOPMOST
。对于 Child 表单,我仍然需要在以下选项中做出选择:
-
能够在打开时设置位置
能够将父窗体重新置于子窗体的“顶部”
【问题讨论】:
【参考方案1】:抱歉回复晚了!我在搜索相关问题时遇到了这个问题。
管理 Z 顺序“仅限访问”的一种方法是使用 Form.SetFocus。一般解决方案大纲:
-
保留表单名称及其 Z 顺序的数组或集合
当 Z 顺序发生变化时:
重新排列您的列表以反映新的 Z 顺序
关闭屏幕更新:Application.Echo False
以反向 Z 顺序遍历表单列表。对每个表单使用 Form.SetFocus。这会将最高的表格放在最上面。
重新开启屏幕更新:Application.Echo True
只要您的所有表单都是非模态的,这应该可以工作。
如果您需要模态表单,请注意默认情况下它们位于顶部,并且您一次只能打开一个模态表单。您仍然可以使用上述逻辑,只需确保为每个不在顶部的表单设置 Form.Modal = False。
这是“如何”的答案,但我无法就这是否适合您的应用程序提供建议。
【讨论】:
【参考方案2】:我认为该解决方案不存在,或者不值得追求,因为它依赖于几年后可能无法使用的 Windows API 库。 (这种悲观情绪并非基于具体的见解;但总的来说,我看到 Windows 用户界面面临巨大压力,因此很容易想象事情会发生变化。)
我看到了其他一些危险。用户将打开许多窗口;资源会在某个时候失效,并且可能在此之前,从人类分析的角度来看,它们会失去任何优势。尽管如此,它们将继续超过收益递减点。此外,我可以预期会发现一些陷阱,这些陷阱会占用开发时间并最终导致投诉,无论我花了多少时间来缓解它们。想想“多用户”,你就会明白我的意思。
相反,我需要重新考虑这种方法。该应用程序提供复杂且有时大量的信息。有办法做到这一点。不是这样。
我可能会删除此 OP,但它获得了三票赞成,所以我会等着看你的想法。我可以随时关注社区 wiki。
【讨论】:
以上是关于在 MS Access 中使用 Z 顺序和位置来组织打开的表单的主要内容,如果未能解决你的问题,请参考以下文章
MS Access 2007:查找使用表单/查询/报告的位置
MS Access 2003 - 排序列表框的字符串值不是按字母顺序