2013-03-26 3 views
2

По какой-то причине атрибут AlwaysOnTop для дизайна формы работает неправильно.Свойство AlwaysOnTop не ведет себя правильно

Вот контекст: мы пытаемся иметь форму, которая остается на вершине каждого другого при открытии. Просто нет? Кроме того, мы не хотим, чтобы WindowType отображался в Popup в соответствии с моим начальником по какой-то другой причине (если вы знаете, почему, пожалуйста, дайте мне знать).

Итак, мой вопрос: есть ли какой-либо параметр/функция безопасности где-то, что каким-то образом ограничивает формы на вершине в любое время?

Даже набор WinApiForegroundWindow возвращает false с формой hWnd формы. Есть идеи?

О, также мы работаем на Dynamics AX 4.0.

+0

У вас есть дополнительная информация, почему ваш начальник не хочет использовать всплывающее окно WindowType? Я использовал его в нескольких формах, поэтому мне интересно узнать о потенциальных проблемах. – Pierre

ответ

0

Этой ситуацией я давно справился с событием lostFocus и методом setFocus. Я не нашел подходящего способа, чтобы форма оставалась на вершине (я думаю, что AX предотвращает это, чтобы избежать блокировки терминала), но он отлично справился с этим: когда форма потеряла фокус, задайте фокус на форме.

У меня нет кода, как в старом проекте. Это было для проекта PDA, но я думаю, что вы никогда не сможете избежать изменения пользователем формы с помощью Alt + Tab.

Это интересный момент, пожалуйста, держите нас в курсе.

EDIT:

Someome в твиттере получил симпатичное решение для модальных форм. Я почти уверен, что это сделает трюк для вас. В методе инициализации формы:

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. –

+0

Я действительно не рекомендую вам изменять SysSetupFormRun с такой модификацией haard. Я уверен, что это вызовет проблемы где-то ... Когда я разработал это решение для КПК, я создал класс FormManagement, который будет призывать к каждой из этих форм, а в классе централизованно все это. Жаль, что я не могу добраться до этого класса, так как это от старого клиента ... –

+0

Отредактировал свой ответ с новым подходом. Надеюсь, поможет. –

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); 
Смежные вопросы