2013-03-26 142 views
2

由于某种原因,表单设计的AlwaysOnTop属性工作不正常。AlwaysOnTop属性的行为不正确

下面是上下文:我们正试图在打开时使用一种形式保持每隔一个。简单没有?此外,我们不希望根据我的上级出于某种其他原因将WindowType设置为Popup(如果您有任何想法,请告诉我)。

所以我的问题是,是否有任何参数/安全功能的某处,以某种方式限制窗体在任何时候顶部?

即使WinApi的setForegroundWindow返回false与窗体的hWnd。有任何想法吗?

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

+0

你有更多的信息,为什么你的上司不想使用Popup的WindowType?我用了几种形式,所以我很想知道潜在的问题。 – Pierre 2013-03-27 10:16:09

回答

0

我很久以前用lostFocus事件和setFocus方法管理了这个案例。我没有找到合适的方法来让表单停留在顶部(我认为AX专门避免锁定终端),但它可以很好地工作:当表单失去焦点时,将焦点放在表单上。

我没有代码,因为它是在一个旧的项目。这是一个PDA项目,但我认为你永远不能避免用户使用Alt + Tab更改表单。

这是一个有趣的观点,请让我们更新。

编辑

Someome在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

+0

您在哪个项目上设置了lostFocus事件?根据网上的不同来源和AX本身,你只能在组上覆盖这种行为,而不是形式本身。到目前为止,我一直试图在网格上设置事件,但调试证明,当我失去焦点时,事件不会触发(我忽略了leave和lostFocus事件,并且我没有入口点与断点)。有没有办法为每个表单实体触发这个事件?我想通过SysSetupFormRun将AlwaysOnTop设置为true的每个表单概括为行为。 – 2013-03-27 13:27:44

+0

我真的不建议你修改SysSetupFormRun这种修改。我非常肯定它会在某个地方引起问题......当我开发这个PDA解决方案时,我创建了一个FormManagement类来调用这些表单,并在类中心化所有这些东西。这是一个耻辱,我不能去这个类,因为它是从一个老客户... – 2013-08-18 11:13:37

+0

用一种新方法编辑我的答案。希望能帮助到你。 – 2013-08-18 11:15:23

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)); 
} 
0

如果你希望你的形式有modal behavior,然后调用从窗体本身wait方法!

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

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

wait可能是由调用者调用的,但这样做并不吸引人,因为大多数表单都是通过菜单项调用的。

formRun.init(); 
formRun.run(); 
formRun.wait(true);