2013-03-26 63 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);