|
![]() |
#1 |
Участник
|
Как убрать кнопку закрытия окна у диалога?
Использую класс Dialog, чтобы выводить модальные диалоги (по поводу оправданности модальности диалогов в Axapta все знаю, в большинстве случаев она конечно не нужна, но, нам действительно нужен модальный диалог, очень прошу это не обсуждать).
Происходит следующее Код: // создать диалог создания операции на основе формы fm = new Form("OperationCreateDialog"); dialog = new dialog("", element, "", fm); dialog.doInit(); // сделать модальным setFormModal(dialog.dialogForm().formRun().hWnd(), true); dialog.run(); // выключить модальность setFormModal(dialog.dialogForm().formRun().hWnd(), false); Выхода два: Либо научиться обрабатывать нажатие этой кнопки (а там проблема в том, что если форма в диалоге создается динамически, то динамически нужно этот метод и обрабатывать, либо если форма диалогу подсунута, то все равно динамически создавать и обрабатывать у нее метод close()) Либо не показывать ее, предоставляя пользователю только возможность нажатия на обычные кнопки. (тут проблема в том, что надо использовать WinApi - по другому решение не видится). Пожалуйста, подскажите что-нибудь. Спасибо. |
|
![]() |
#2 |
NavAx
|
А в форме не пробовали включать/выключать модальность?
PHP код:
Последний раз редактировалось raz; 14.02.2006 в 09:02. |
|
![]() |
#3 |
Administrator
|
Независимо от того, подкладываете ли вы форму - или создаете контролы динамически - форма есть. Это либа Ваша форма - либо форма Dialog. Что мешает ввести некий параметр типа parmShowModal() ? Вводить нужно очевидно на классе RunBase. Соответственно - на форме Dialog и на своей форме - перекрываете метод close() (и не нужно его создавать динамически) - и делаете проверку в нем аналогично как показал raz:
X++: if (element.runbase().parmShowModal()) { setFormModal(element.hWnd(), false); } super();
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 14.02.2006 в 09:29. |
|
![]() |
#4 |
Участник
|
Спасибо за комментарии. Но...
Модальность я могу включать/отключать у диалога - в этом нет проблемы. Проблема как раз в том, что я не могу выключить модальность именно при закрытии формы диалога этим самым крестиком. В этом случае вызывается метод close у _формы_, но не в коем случае не dialog.close(). У каждой формы в close() отключать модальность неправильно - это функция диалога. Поэтому, я хочу сделать так, чтобы Dialog умел перехватывать close() формы. В обычном сценарии dialog сам же вызывает form.close() по нажатию диалоговой кнопки. Крестик же он обрабатывать не умеет... Если идти по пути перехватывания метода формы, то встает вопрос, можно ли по аналогии с переопределением обработчиков методов контролов (formRun.controlMethodOverload(true)) переопределять обработку методов самой формы... Чтобы было понятно добавлю, что я хочу сделать так, чтобы именно сам dialog (а не форма, которую я ему подсовываю) мог по нажатию крестика отключать модальность у своей формы. Т.е. я хочу сделать чтобы это работало вообще для всех форм, которые использует диалог, без принудительного отключения модальности непосредственно в close() формы. Последний раз редактировалось Romb; 14.02.2006 в 10:44. |
|
![]() |
#5 |
Участник
|
Добавьте в класс WinApi следующий метод
X++: static int setWindowLong(HWND _HWND, int _nIndex, int _dwNewLong) { DLL DLL; DLLFunction DLLFunction; ; DLL = new DLL(#UserDLL); DLLFunction = new DLLFunction(DLL,'SetWindowLongA'); DLLFunction.arg(ExtTypes::DWord, ExtTypes::DWord, ExtTypes::DWord); DLLFunction.returns(ExtTypes::DWord); return DLLFunction.call(_HWND, _nIndex, _dwNewLong); } X++: #define.GWL_STYLE (0xFFFFFFF0) #define.WS_SYSMENU(0x00080000) X++: style = winapi::getWindowLong(dialog.dialogForm().formRun().hWnd(), #GWL_STYLE); style = style & ~(#WS_SYSMENU); winapi::setWindowLong(dialog.dialogForm().formRun().hWnd(), #GWL_STYLE, style);
__________________
Axapta v.3.0 sp5 kr2 |
|
|
За это сообщение автора поблагодарили: Romb (3), SANTAN (1). |
![]() |
#6 |
Участник
|
AndyD, большое спасибо!
Вставил код по убиранию кнопки закрытия в DialogForm.doInit(). Кнопка действительно пропадает, но горячие клавиши (Ctrl+F4) работают. В принципе не так страшно, все же немногие пользователи их знают. Еще раз спасибо всем. Последний раз редактировалось Romb; 16.02.2006 в 05:12. |
|