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

时间:2014-04-21 17:20:43

标签: forms vba winapi ms-access

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

我希望用户能够选择哪个表单最顶层 - 这意味着我不希望任何表单设置为Popup。此外,我希望在新的Child打开时基本上保留Z-Order。随着孩子的开放,父母失去了焦点;在那一点上,我希望家长能够回到原来的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的文档似乎是零碎和不连贯的。我想知道,我是否坚持使用该API?还有其他我可以使用的东西吗?我喜欢除了API之外的VBA解决方案,但我想这就是API的用途。不过,有没有一种我缺少的方法?

我可以更详细地发布我的变种尝试,但我觉得我一直在黑暗中拍摄,所以我会等你的反馈。

更新

我试过阅读The Manual。我尝试了“表单所有权”和NO/TOPMOST。对于儿童表单,我仍然需要选择:

  1. 能够在开场时设定位置
  2. 能够将“父母”表格带回“孩子”的“顶部”

2 个答案:

答案 0 :(得分:1)

对不起,迟到了!我在搜索相关问题时遇到了这个问题。

管理Z-order' Access-only'是使用Form.SetFocus。一般解决方案大纲:

  1. 保留表单名称及其Z-order
  2. 的数组或集合
  3. 当Z顺序发生变化时:
  4. 按照您的清单来反映新的Z顺序
  5. 关闭屏幕更新:Application.Echo False
  6. 以反向Z顺序遍历您的表单列表。对每个表单使用Form.SetFocus。这将把最高形式放在首位。
  7. 重新打开屏幕更新:Application.Echo True
  8. 只要您的所有表单都是非模态的,这都应该有效。

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

    这是'如何'回答,但我不能就这是否适合您的应用提供建议。

答案 1 :(得分:0)

我认为该解决方案不存在,或者不值得追求,因为它将依赖于几年内可能无法使用的Windows API库。 (这种悲观主义不是基于具体的见解;但总的来说,我看到Windows用户界面面临很大的压力,所以很容易想象事情会发生变化。)

我看到其他一些危害。用户将打开许多窗口;资源在某些时候会失败,可能在此之前,他们将从人类分析的角度失去任何优势。尽管如此,他们还是会继续超越收益递减的程度。此外,我可以期待找到一些陷阱,吞噬开发时间并最终导致投诉,无论我花多少时间来减轻它们。想想“多用户”,你就会明白我的意思。

相反,我需要重新思考这种方法。该应用程序提供复杂的,有时很多的信息。有办法做到这一点。不是这样的。

我可能会删除这个OP,但是它已经获得了三次投票,所以我会等着看你的想法。我总是可以向社区wiki倾斜。