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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 03.02.2010, 22:07   #1  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Не отрабатывает element.close()
Стоит элементарная, в общем-то, задача: при нажатии на кнопку на форме запустить ну, скажем, класс-наследник RunBaseBatch. Программно. Т.е. у нас есть MenuItem и при нажатии на кнопку мы должны:
1) Закрыть исходную форму
2) Запустить MenuItem

Так вот, не закрывается исходная форма. Ни в какую... Как бы вы решили такую задачу в рамках предложенных условий?

DAX 4.0

X++:
void clicked()
{
    MenuFunction    mf;
    Args            args = new Args();

    super();
    

    element.close(); // безрезультатно.....

    mf = new MenuFunction(menuItemActionStr(tutorial_RunBaseForm),MenuItemType::Action);
    mf.run(args);
   
}
Старый 03.02.2010, 22:51   #2  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,738 / 404 (17) +++++++
Регистрация: 23.03.2006
а после вызова mf.run()?
Старый 03.02.2010, 22:59   #3  
greench is offline
greench
Участник
Oracle
 
425 / 74 (3) ++++
Регистрация: 12.07.2007
Адрес: Киев
К сожалению нет под рукой 4-ки. В 3-ке все закрывается великолепно.
Старый 03.02.2010, 23:01   #4  
greench is offline
greench
Участник
Oracle
 
425 / 74 (3) ++++
Регистрация: 12.07.2007
Адрес: Киев
Цитата:
Сообщение от ice Посмотреть сообщение
а после вызова mf.run()?
теоретически после не должно работать, т.к. активна уже другая форма.
За это сообщение автора поблагодарили: Yprit (1).
Старый 03.02.2010, 23:31   #5  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Цитата:
Сообщение от ice Посмотреть сообщение
а после вызова mf.run()?
После вызова - сработает, но только после того, как закончит работать класс, вызванный через MenuFunction (да и то не всегда, но закономерности я пока не смог уловить).
Старый 04.02.2010, 00:04   #6  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Причина проста, а вот обойти её чуть сложнее.
Существует два способа запуска форм:

formRun.wait() и formRun.detach(). Отличаются они тем, что в первом случае метод wait() вернет управление только по закрытию формы. Второй метод запускает форму и тут же возвращает управление. В случае в RunBaseForm, как раз происходит первый способ вызова (\Classes\RunBase\promptPrim) и форма-родитель ждет закрытия конечной формы. В общем, нужно либо запустить форму в отдельном потоке (например, используя Infolog и setTimeOut, или ещё как-то), либо:
1) Если это RunBase - докапываться до метода promptPrim и вызывать detach вместо wait
2) Если это просто форма - получить объект FormRun и сделать detach():
Приблизительно так:
X++:
formRun = mf.create();
formRun.detach()
За это сообщение автора поблагодарили: Yprit (2).
Старый 04.02.2010, 00:21   #7  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Причина проста, а вот обойти её чуть сложнее.
Существует два способа запуска форм:
formRun.wait() и formRun.detach().
DSPIC, спасибо за столь обстоятельный ответ в столь поздний час C prompPrim все как раз ясно. Но дело в том, что вызов element.close() я делаю ДО вызова menuFunction - как раз для того, чтобы не зависеть от wait()...
С setTimeOut мысль мне приходила, но в контексте задачи (она гораздо более обширна, чем я описал) применять его не хотелось - а, видимо, придется ...
Старый 04.02.2010, 02:11   #8  
Lemming is offline
Lemming
Участник
Аватар для Lemming
 
1,144 / 343 (14) ++++++
Регистрация: 20.04.2004
Адрес: Москва, Чайнатаун в Люблино
Записей в блоге: 10
Цитата:
Сообщение от Yprit Посмотреть сообщение
Стоит элементарная, в общем-то, задача: при нажатии на кнопку на форме запустить ну, скажем, класс-наследник RunBaseBatch. Программно. Т.е. у нас есть MenuItem и при нажатии на кнопку мы должны:
1) Закрыть исходную форму
2) Запустить MenuItem

Так вот, не закрывается исходная форма. Ни в какую... Как бы вы решили такую задачу в рамках предложенных условий?

DAX 4.0

X++:
void clicked()
{
    MenuFunction    mf;
    Args            args = new Args();

    super();
    

    element.close(); // безрезультатно.....

    mf = new MenuFunction(menuItemActionStr(tutorial_RunBaseForm),MenuItemType::Action);
    mf.run(args);
   
}

X++:
void clicked()
{
    MenuFunction mf = this.menufunction();
    ;


    element.close();

    mf.run(new Args());
}
Или я что не понял, или... В общем, пример во вложении(DAX3, но вроде смысл общий)
Вложения
Тип файла: rar HowToCloseCallerForm.rar (1.7 Кб, 61 просмотров)

Последний раз редактировалось Lemming; 04.02.2010 в 02:13.
Старый 04.02.2010, 08:54   #9  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Цитата:
Сообщение от Lemming Посмотреть сообщение
Или я что не понял, или...
Прицепите какой-нибудь менюАйтем с классом или отчетом...
Старый 04.02.2010, 10:18   #10  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1243 (44) ++++++++
Регистрация: 11.04.2008
Цитата:
Сообщение от Yprit Посмотреть сообщение
DSPIC, спасибо за столь обстоятельный ответ в столь поздний час C prompPrim все как раз ясно. Но дело в том, что вызов element.close() я делаю ДО вызова menuFunction - как раз для того, чтобы не зависеть от wait()...
С setTimeOut мысль мне приходила, но в контексте задачи (она гораздо более обширна, чем я описал) применять его не хотелось - а, видимо, придется ...
Ну вот, например, пишем метод в классе infolog:

\Classes\Info\runForm
X++:
void runForm()
{
    MenuFunction    mf;
    Args            args = new Args();

    mf = new MenuFunction(menuItemActionStr(tutorial_RunBaseForm),MenuItemType::Action);
    mf.run(args);
}
И вызываем его из нашей формы:

X++:
void clicked()
{
    super();

    infolog.setTimeOut(identifierstr(runForm), 0);

    element.close();
}
Не красота, но пока нового ничего не придумается, можно юзать.
Нет, ну должно быть более красивое решение, но что-то пока в голову не приходит
Старый 04.02.2010, 10:23   #11  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Цитата:
Сообщение от DSPIC Посмотреть сообщение
Не красота, но пока нового ничего не придумается, можно юзать.
Да обходной-то путь я уже сделал, через infolog.addTimeOut на управляющем классе. Но вот такие танцы с бубнами меня очень напрягли сегодня ночью
Старый 04.02.2010, 10:32   #12  
AlGol is offline
AlGol
Участник
 
277 / 93 (4) ++++
Регистрация: 24.12.2001
Адрес: Тверь.
Попробуйте сделать что-то подобное \Forms\tutorial_Thread.

Для этого нужно:
- создать на классе дополнительный статический метод для вызова его в отдельном потоке.
- кнопку на форме реализовать как CommandButton с командой закрытия окна и в перекрытом clicked() перед super() вызывать класс в отдельном потоке (вызовом статического метода для этого предназначенного)

При этом, то что должно закрываться - закрывается, что должно работать - продолжает работать в отдельном потоке.
Старый 04.02.2010, 12:14   #13  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Ну а как же иначе? Вы сперва форму закрываете, а потом хотите, чтобы код в ее методе продолжил выполнение???

Вызывайте по timeout, как показано выше, или закрывайте форму после вызове пункта меню
Старый 04.02.2010, 12:22   #14  
greench is offline
greench
Участник
Oracle
 
425 / 74 (3) ++++
Регистрация: 12.07.2007
Адрес: Киев
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Ну а как же иначе? Вы сперва форму закрываете, а потом хотите, чтобы код в ее методе продолжил выполнение???

Вызывайте по timeout, как показано выше, или закрывайте форму после вызове пункта меню
Так проблема же не в том, что метод НЕ продолжает выполнение. Проблема в том что он продолжает, но при этом форма не закрывается.
Старый 04.02.2010, 13:11   #15  
Yprit is offline
Yprit
Злыдни
Аватар для Yprit
Злыдни
 
419 / 93 (4) ++++
Регистрация: 22.02.2004
Адрес: СПб
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Ну а как же иначе? Вы сперва форму закрываете, а потом хотите, чтобы код в ее методе продолжил выполнение???
Ну в общем так и происходит Но я хочу не этого, а чтобы форма закрывалась.
Старый 04.02.2010, 13:25   #16  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Читаю и задаю себе вопрос. Почему "элементарная, в общем-то, задача" не имеет простого решения. Возможно потому что задача не является коррректной? Возможно и делать так не стоит? Зачем вообще нужна форма, которая сама себя должна закрывать?
Если данная форма является частью какой-то цепочки вызовов, то пусть этой цепочкой управляет некий внешний по отношению к этой цепочке объект. Если это диалог то вызывайте его из класса, в который вы хотите попасть по закрытию этой формы.
Теги
menufunction, баг, форма

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Fred Shen: Use ScriptManager to close the EP page window Blog bot DAX Blogs 0 10.12.2009 15:05
Вызов метода element.args().caller().setOfficialsParams(.... Poleax DAX: Программирование 6 04.09.2008 19:49
mfp: Solving the element ID problem Blog bot DAX Blogs 0 22.05.2008 03:09
ExcelDocument.Close() после эксепшена всегда страшивает куда сохранять belugin DAX: Программирование 2 13.03.2007 16:36
не отрабатывает запрос к View LedgerBalances loka DAX: Программирование 4 31.05.2006 16:01

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

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

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