由于某种原因,表单设计的AlwaysOnTop属性无法正常工作。
这是上下文:我们试图让一个表单在打开时保持在每个其他表单之上。简单没有?另外,我们不希望根据我的上司将WindowType设置为Popup由于其他原因(如果您有任何想法,请告诉我)。
所以我的问题是,是否有任何参数/安全功能在某处以某种方式限制表格在任何时候都在顶部?
即使WinApi的setForegroundWindow也会以表单的hWnd返回false。有什么想法吗?
哦,我们也在Dynamics AX 4.0上运行。
答案 0 :(得分:0)
我很久以前使用lostFocus事件和setFocus方法管理了这个案例。我没有找到一种正确的方法让表单保持在最顶层(我认为AX可以防止这种情况特别避免锁定终端)但它的工作方式很好:当表单失去焦点时,将焦点设置在表单上。
我没有像旧项目那样的代码。这是一个PDA项目,但我认为你不能避免用户使用Alt + Tab更改表单。
这是一个有趣的观点,请让我们更新。
修改强>:
Twitter中的Someome为模态表单提供了一个可爱的解决方案。我很确定它能帮到你。在表单的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
答案 1 :(得分: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));
}
答案 2 :(得分:0)
如果您希望表单包含modal behavior,请从表单本身调用wait
方法!
public void run()
{
super();
this.wait(true);
}
true
参数触发模态模式。这适用于所有版本的AX。
可以从调用者调用wait
,但由于大多数表单是通过菜单项调用的,因此不太有吸引力。
formRun.init();
formRun.run();
formRun.wait(true);