03.02.2010, 22:07 | #1 |
Злыдни
|
Не отрабатывает 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 |
Участник
|
а после вызова mf.run()?
|
|
03.02.2010, 22:59 | #3 |
Участник
|
К сожалению нет под рукой 4-ки. В 3-ке все закрывается великолепно.
|
|
03.02.2010, 23:01 | #4 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: Yprit (1). |
03.02.2010, 23:31 | #5 |
Злыдни
|
|
|
04.02.2010, 00:04 | #6 |
Боец
|
Причина проста, а вот обойти её чуть сложнее.
Существует два способа запуска форм: 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 |
Злыдни
|
Цитата:
С setTimeOut мысль мне приходила, но в контексте задачи (она гораздо более обширна, чем я описал) применять его не хотелось - а, видимо, придется ... |
|
04.02.2010, 02:11 | #8 |
Участник
|
Цитата:
Сообщение от 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()); } Последний раз редактировалось Lemming; 04.02.2010 в 02:13. |
|
04.02.2010, 08:54 | #9 |
Злыдни
|
|
|
04.02.2010, 10:18 | #10 |
Боец
|
Цитата:
Сообщение от Yprit
DSPIC, спасибо за столь обстоятельный ответ в столь поздний час C prompPrim все как раз ясно. Но дело в том, что вызов element.close() я делаю ДО вызова menuFunction - как раз для того, чтобы не зависеть от wait()...
С setTimeOut мысль мне приходила, но в контексте задачи (она гораздо более обширна, чем я описал) применять его не хотелось - а, видимо, придется ... \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 |
Злыдни
|
|
|
04.02.2010, 10:32 | #12 |
Участник
|
Попробуйте сделать что-то подобное \Forms\tutorial_Thread.
Для этого нужно: - создать на классе дополнительный статический метод для вызова его в отдельном потоке. - кнопку на форме реализовать как CommandButton с командой закрытия окна и в перекрытом clicked() перед super() вызывать класс в отдельном потоке (вызовом статического метода для этого предназначенного) При этом, то что должно закрываться - закрывается, что должно работать - продолжает работать в отдельном потоке. |
|
04.02.2010, 12:14 | #13 |
Участник
|
Ну а как же иначе? Вы сперва форму закрываете, а потом хотите, чтобы код в ее методе продолжил выполнение???
Вызывайте по timeout, как показано выше, или закрывайте форму после вызове пункта меню |
|
04.02.2010, 12:22 | #14 |
Участник
|
Так проблема же не в том, что метод НЕ продолжает выполнение. Проблема в том что он продолжает, но при этом форма не закрывается.
|
|
04.02.2010, 13:11 | #15 |
Злыдни
|
|
|
04.02.2010, 13:25 | #16 |
Участник
|
Читаю и задаю себе вопрос. Почему "элементарная, в общем-то, задача" не имеет простого решения. Возможно потому что задача не является коррректной? Возможно и делать так не стоит? Зачем вообще нужна форма, которая сама себя должна закрывать?
Если данная форма является частью какой-то цепочки вызовов, то пусть этой цепочкой управляет некий внешний по отношению к этой цепочке объект. Если это диалог то вызывайте его из класса, в который вы хотите попасть по закрытию этой формы. |
|
Теги |
menufunction, баг, форма |
|
|