gpt4 book ai didi

forms - 使用 Z 顺序和位置在 MS Access 中组织打开的表单

转载 作者:行者123 更新时间:2023-12-01 16:47:08 26 4
gpt4 key购买 nike

对于 MS Access 2010,我需要一种方法来在打开十几个窗体时灵活地维护位置和 Z 顺序。 Parent 表单可以有多个实例,每个实例都可以导致 Child 表单的多个实例(一些 background here )。

我希望用户能够选择最顶层的表单——这意味着我不想将任何表单设置为 Popup。此外,我希望在打开新子项时基本保留 Z-Order。随着 Child 打开,Parent 失去焦点;在这一点上,我希望 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(和“Modal”)正是使 API 发挥最佳作用的原因,因为在显示“必须回答”对话框时,控制基本上恢复为Windows。确认?)

我最大的挫败感是 API 的文档似乎支离 splinter 且不连贯。我想知道,我是否坚持使用该 API?我可以使用其他东西吗? 除了 API 之外,我还喜欢 VBA 解决方案,但我想这就是 API 的用途。不过,我是否缺少一种方法?

我可以更详细地发布我的变体尝试,但我觉得我一直在摸索,所以我会等待您的反馈。

更新

我试过阅读 The Manual .我试着摆弄“表单所有权”和 NO/TOPMOST。对于 Child 表单,我仍然必须在以下之间进行选择:

  1. 能够在开仓时设置仓位
  2. 能够将 Parent 表单带回 Child 的“顶部”

最佳答案

抱歉回复晚了!我在搜索相关问题时遇到了这个问题。

管理 Z 顺序“仅 Access ”的一种方法是使用 Form.SetFocus。总体解决方案大纲:

  1. 保存表单名称及其 Z 顺序的数组或集合
  2. 当 Z 顺序改变时:
  3. 对列表进行排序以反射(reflect)新的 Z 顺序
  4. 关闭屏幕更新:Application.Echo False
  5. 以反向 Z 顺序遍历您的表单列表。对每个表单使用 Form.SetFocus。这会将最高形式放在最上面。
  6. 重新打开屏幕更新:Application.Echo True

只要您的所有表单都是非模态的,这就应该有效。

如果您需要模态窗体,请注意它们默认位于顶部,并且您一次只能打开一个模态窗体。您仍然可以使用上述逻辑,只需确保为每个不在顶部的表单设置 Form.Modal = False。

这是“如何”的答案,但我无法就这是否适合您的应用提供建议。

关于forms - 使用 Z 顺序和位置在 MS Access 中组织打开的表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23202271/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com