3

出于某种原因,表单设计的 AlwaysOnTop 属性无法正常工作。

这是上下文:我们试图让一个表单在打开时保持在其他所有表单之上。简单不?另外,出于其他原因,我们不想根据我的上级将 WindowType 设置为 Popup(如果您知道原因,请告诉我)。

所以我的问题是,是否有任何参数/安全功能以某种方式限制表单随时处于顶部?

甚至 WinApi 的 setForegroundWindow 也使用表单的 hWnd 返回 false。有任何想法吗?

哦,我们也在 Dynamics AX 4.0 上运行。

4

3 回答 3

1

我很久以前用 lostFocus 事件和 setFocus 方法处理过这个案例。我没有找到使表单保持在顶部的正确方法(我认为 AX 专门阻止了这种情况以避免锁定终端)但它以这种方式工作得很好:当表单失去焦点时,将焦点设置在表单上。

我没有旧项目中的代码。这是一个 PDA 项目,但我认为您永远无法避免用户使用 Alt+Tab 更改表单。

这是一个有趣的观点,请随时更新。

编辑

twitter 上的某个人为模态表单提供了一个可爱的解决方案。我很确定它会为你解决问题。在表单的 init 方法中:

public void run()
{
    super();
    element.wait(true);
    // Execution will resume at this point, only after
    // the user has closed the form.
} 

来源: http: //gotdax.blogspot.com.es/2013/08/modal-forms-in-dynamics-ax.html

于 2013-03-27T08:52:46.470 回答
1

如果您希望您的表单具有模态行为wait,请从表单本身调用该方法!

public void run()
{
    super();
    this.wait(true);
}

true参数触发模态模式。这适用于所有版本的 AX。

wait可以改为从调用者调用,但这不太有吸引力,因为大多数表单都是通过菜单项调用的。

formRun.init();
formRun.run();
formRun.wait(true);
于 2013-08-09T08:38:21.647 回答
0

我解决这个问题的方法是通过 WinAPI 使表单成为模态。下面的代码是保存文本的副本,因此可能需要一些修饰。(还请记住,它可能无法从 AX2009 开始工作。)

void setFormModal(int _thisHWND, boolean _bModal)
{
DLL _winApiDLL;
DLLFunction _EnabledWindow;
DLLFunction _getTop;
DLLFunction _getNext;
DLLFunction _getParent;

void local_enableWHND(int _lHWND)
{
int lnextWnd;

lnextWnd = _getTop.call(_getParent.call(_lHWND));

while (lnextWnd)
{
if (lnextWnd != _lHWND)
_enabledWindow.call(lnextWnd, (!_bModal));

lnextWnd = _getNext.call(lnextWnd, 2);
}
}
;
_winApiDLL = new DLL('user32');
_getNext = new DLLFunction(_winApiDLL, "GetWindow");
_EnabledWindow = new DLLFunction(_winApiDLL, "EnableWindow");
_getTop = new DLLFunction(_winApiDLL, "GetTopWindow");
_getParent = new DLLFunction(_winApiDLL, "GetParent");

_getParent.returns(ExtTypes:: DWORD);
_getParent.arg(ExtTypes:: DWORD);

_EnabledWindow.returns(ExtTypes:: DWORD);
_EnabledWindow.arg(ExtTypes:: DWORD, ExtTypes:: DWORD);

_getTop.returns(ExtTypes:: DWORD);
_getTop.arg(ExtTypes:: DWORD);

_getNext.returns(ExtTypes:: DWORD);
_getNext.arg(ExtTypes:: DWORD, ExtTypes:: DWORD);

local_enableWHND(_thisHWND);

local_enableWHND(_getParent.call(_thisHWND));
}
于 2013-03-29T07:13:34.350 回答