AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.07.2009, 11:11   #1  
chanchala is offline
chanchala
Участник
Аватар для chanchala
 
113 / 10 (1) +
Регистрация: 14.05.2008
Адрес: СПб
? Вызывающая и вызываемая формы
Уважаемые посетители форума! Подскажите, пожалуйста ответ на мой вопрос.
Есть две формы: вызывающая и вызываемая. По нажатию кнопки в вызывающей форме запускается, Display MenuItem и вызывает вызываемую форму.
Задача: не дать закрыть вызывающую форму, пока открыта вызываемая. Как это сделать?
__________________
AX 3.0, Build #9.3
Старый 29.07.2009, 11:27   #3  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Нужно вызывать вызываемую форму не через menuItem, а програмно. Т.е. Вместо menuItemButton на вызывающей форме сделать просто кнопку (Button), и в её методе clicked() написать примерно следующий код:

X++:
    FormRun     formRun;
    ;
    
    formRun = classfactory.formRunClass(new Args(formstr(ConfigIdDialog)));
    formRun.init();
    formRun.run();
    formRun.wait();
, где ConfigIdDialog - имя вызываемой формы
За это сообщение автора поблагодарили: chanchala (1).
Старый 29.07.2009, 11:32   #4  
chanchala is offline
chanchala
Участник
Аватар для chanchala
 
113 / 10 (1) +
Регистрация: 14.05.2008
Адрес: СПб
Цитата:
Читала. У меня другой случай.
__________________
AX 3.0, Build #9.3
Старый 29.07.2009, 11:40   #5  
chanchala is offline
chanchala
Участник
Аватар для chanchala
 
113 / 10 (1) +
Регистрация: 14.05.2008
Адрес: СПб
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Нужно вызывать вызываемую форму не через menuItem, а програмно. Т.е. Вместо menuItemButton на вызывающей форме сделать просто кнопку (Button), и в её методе clicked() написать примерно следующий код:

X++:
    FormRun     formRun;
    ;
    
    formRun = classfactory.formRunClass(new Args(formstr(ConfigIdDialog)));
    formRun.init();
    formRun.run();
    formRun.wait();
, где ConfigIdDialog - имя вызываемой формы
Ага. Уже заработало. Спасибо
__________________
AX 3.0, Build #9.3
Старый 29.07.2009, 11:45   #6  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
тогда проще сделать вызываемую форму модальной.

в run() формы добавьте

X++:
void run()
{
    WinApi::setFormModal(this.hWnd(), true);
}
в класс WinApi добавьте
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  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
тогда проще сделать вызываемую форму модальной.
1. Форма не должна быть модальной. Модальное окно - это совсем не то что нужно автору
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  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Нужно вызывать вызываемую форму не через menuItem, а програмно.
Не надо так делать, поскольку так полностью отключается контроль прав.
__________________
полезное на axForum, github, vk, coub.
Старый 29.07.2009, 12:37   #9  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от mazzy Посмотреть сообщение
Не надо так делать, поскольку так полностью отключается контроль прав.
Но почему же? На обычную кнопку никто не мешает повесить security\configuration ключи ровно как и на MenuItem.
Но по большому счету да, о правах доступа нужно всегда помнить.
Старый 29.07.2009, 13:07   #10  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
У меня вопрос к тем, кто использует модальные окна в аксапте. А как в таком случае выдавать информацию об ошибках. Ведь стандартный подход с инфологом уже не подойдёт.
Цитата:
2.2. Т.к. окно модальное - переключиться на любое окно - без шансов.
В том числе и на окно инфолога.
И возможно ли сделать не абсолютную модальность, а только относительно родительского окна?
Старый 29.07.2009, 13:29   #11  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
1. Приведите примеры модальных окон в аксапте. Я, например знаю только редактор меток (SysLabelSearch), и то, при вызове кернелом, ну и различные диалоги-подтверждения. Оним словом - модальное окно это редкость в аксе.
2.
Цитата:
И возможно ли сделать не абсолютную модальность, а только относительно родительского окна?
Это как? Есть окна модальные, есть не модальные. Относительно модальное окно не могу себе представить. Если в вашем понимании "Относительно модальное окно" - это невозможность закрыть родительское окно, пока не закрыто ребёночное, то ответ дан в этой ветке.
Старый 29.07.2009, 14:17   #12  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,437 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Если в вашем понимании "Относительно модальное окно" - это невозможность закрыть родительское окно, пока не закрыто ребёночное, то ответ дан в этой ветке.
Мне кажется что было бы удобно иметь возможность запрещать не только закрытие родительского окна, но и вообще переход к нему (что бы не было соблазна каким-либо способом изменить исходные данные). Но в тоже время осталяя возможность переключатся на другие окна, такие как инфолог например.
Старый 29.07.2009, 14:26   #13  
chanchala is offline
chanchala
Участник
Аватар для chanchala
 
113 / 10 (1) +
Регистрация: 14.05.2008
Адрес: СПб
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Но почему же? На обычную кнопку никто не мешает повесить security\configuration ключи ровно как и на MenuItem.
Но по большому счету да, о правах доступа нужно всегда помнить.
Именно так я и сделала, повесила SequrityKey на кнопку.
Помнить о правах доступа действительно нужно
__________________
AX 3.0, Build #9.3
Старый 29.07.2009, 14:32   #14  
chanchala is offline
chanchala
Участник
Аватар для chanchala
 
113 / 10 (1) +
Регистрация: 14.05.2008
Адрес: СПб
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Мне кажется что было бы удобно иметь возможность запрещать не только закрытие родительского окна, но и вообще переход к нему (что бы не было соблазна каким-либо способом изменить исходные данные). Но в тоже время осталяя возможность переключатся на другие окна, такие как инфолог например.
Это смотря в каком случае
А вообще опыт подсказывает, что у пользователей редко бывают соблазны. Мы думаем, стараемся, а они пользуются процентов на 40, тем что можно освоить без прочтения инструкции, и периодически поругиваются, что им чего-то не хватает. А попросишь почитать инструкцию - и тишина на месяц-другой.
__________________
AX 3.0, Build #9.3
Теги
закрытие, программно, форма, запрет

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Самостоятельные формы и формы открывающиеся из другой формы. Dima_Dima DAX: Программирование 6 19.12.2008 18:27
Зачем 2 формы транспортировки паллет и 2 формы маршрутов комплектации? twilight DAX: Функционал 2 15.02.2008 11:24
Создание Lookup формы Maxim Gorbunov DAX: База знаний и проекты 9 26.06.2007 16:44
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38
Динамические Lookup формы. Андрей Василюк DAX: База знаний и проекты 0 07.12.2001 07:07

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:54.