29.07.2009, 11:11 | #1 |
Участник
|
Вызывающая и вызываемая формы
Уважаемые посетители форума! Подскажите, пожалуйста ответ на мой вопрос.
Есть две формы: вызывающая и вызываемая. По нажатию кнопки в вызывающей форме запускается, Display MenuItem и вызывает вызываемую форму. Задача: не дать закрыть вызывающую форму, пока открыта вызываемая. Как это сделать?
__________________
AX 3.0, Build #9.3 |
|
29.07.2009, 11:27 | #3 |
Боец
|
Нужно вызывать вызываемую форму не через menuItem, а програмно. Т.е. Вместо menuItemButton на вызывающей форме сделать просто кнопку (Button), и в её методе clicked() написать примерно следующий код:
X++: FormRun formRun; ; formRun = classfactory.formRunClass(new Args(formstr(ConfigIdDialog))); formRun.init(); formRun.run(); formRun.wait(); |
|
|
За это сообщение автора поблагодарили: chanchala (1). |
29.07.2009, 11:32 | #4 |
Участник
|
__________________
AX 3.0, Build #9.3 |
|
29.07.2009, 11:40 | #5 |
Участник
|
Цитата:
Сообщение от DSPIC
Нужно вызывать вызываемую форму не через menuItem, а програмно. Т.е. Вместо menuItemButton на вызывающей форме сделать просто кнопку (Button), и в её методе clicked() написать примерно следующий код:
X++: FormRun formRun; ; formRun = classfactory.formRunClass(new Args(formstr(ConfigIdDialog))); formRun.init(); formRun.run(); formRun.wait();
__________________
AX 3.0, Build #9.3 |
|
29.07.2009, 11:45 | #6 |
NavAx
|
тогда проще сделать вызываемую форму модальной.
в run() формы добавьте X++: void run() { WinApi::setFormModal(this.hWnd(), true); } X++: static HWND setFormModal(hWND _thisHWND, boolean _bModal, HWND _parentHWND = 0) { DLL _winApiDLL; DLLFunction _EnabledWindow; DLLFunction _getTop; DLLFunction _getNext; DLLFunction _getParent; void local_enableWHND(HWND _lHWND, HWND _pHWND = 0) { int lnextWnd; if (!_pHWND) _pHWND = _getParent.call(_lHWND); lnextWnd = _getTop.call(_getParent.call(_lHWND)); while (lnextWnd) { if (lnextWnd != _lHWND && WinApi::getWindowText(lnextWnd) != "@SYS25246") _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); if (!_parentHWND) _parentHWND = _getParent.call(_thisHWND); local_enableWHND(_getParent.call(_thisHWND)); return _parentHWND; } |
|
29.07.2009, 12:02 | #7 |
Боец
|
Цитата:
тогда проще сделать вызываемую форму модальной.
2. Потестил ваш пример: 2.1 Первое что бросается в глаза - отсутствие super() в методе run(). Описка? 2.2. Т.к. окно модальное - переключиться на любое окно - без шансов. 2.3. По нажатию на Ctrl+Q модальная форма закрывается, при этом модальность остается Т,е. кроме как закрыть аксапту ничего больше сделать нельзя. 3. Помните что использование нештатных методов в бизнес-логике черевато затрудненной читабельностью кода другими людьми и совметимостью в будущих версиях\апдейтах P.S. Кстати, эффект модальности можно достичь таким способом: X++: public void run() { super(); this.wait(true); } Последний раз редактировалось DSPIC; 29.07.2009 в 12:11. |
|
29.07.2009, 12:30 | #8 |
Участник
|
Не надо так делать, поскольку так полностью отключается контроль прав.
|
|
29.07.2009, 12:37 | #9 |
Боец
|
|
|
29.07.2009, 13:07 | #10 |
Участник
|
У меня вопрос к тем, кто использует модальные окна в аксапте. А как в таком случае выдавать информацию об ошибках. Ведь стандартный подход с инфологом уже не подойдёт.
Цитата:
2.2. Т.к. окно модальное - переключиться на любое окно - без шансов.
И возможно ли сделать не абсолютную модальность, а только относительно родительского окна? |
|
29.07.2009, 13:29 | #11 |
Боец
|
1. Приведите примеры модальных окон в аксапте. Я, например знаю только редактор меток (SysLabelSearch), и то, при вызове кернелом, ну и различные диалоги-подтверждения. Оним словом - модальное окно это редкость в аксе.
2. Цитата:
И возможно ли сделать не абсолютную модальность, а только относительно родительского окна?
|
|
29.07.2009, 14:17 | #12 |
Участник
|
Мне кажется что было бы удобно иметь возможность запрещать не только закрытие родительского окна, но и вообще переход к нему (что бы не было соблазна каким-либо способом изменить исходные данные). Но в тоже время осталяя возможность переключатся на другие окна, такие как инфолог например.
|
|
29.07.2009, 14:26 | #13 |
Участник
|
Цитата:
Помнить о правах доступа действительно нужно
__________________
AX 3.0, Build #9.3 |
|
29.07.2009, 14:32 | #14 |
Участник
|
Цитата:
Сообщение от S.Kuskov
Мне кажется что было бы удобно иметь возможность запрещать не только закрытие родительского окна, но и вообще переход к нему (что бы не было соблазна каким-либо способом изменить исходные данные). Но в тоже время осталяя возможность переключатся на другие окна, такие как инфолог например.
А вообще опыт подсказывает, что у пользователей редко бывают соблазны. Мы думаем, стараемся, а они пользуются процентов на 40, тем что можно освоить без прочтения инструкции, и периодически поругиваются, что им чего-то не хватает. А попросишь почитать инструкцию - и тишина на месяц-другой.
__________________
AX 3.0, Build #9.3 |
|