![]() |
#1 |
Участник
|
Можно ли программно завершить работу MS Navision изнутри?
Если кто сталкивался с этим, подскажите. |
|
![]() |
#2 |
Moderator
|
4-ку можно. Может быть можно и более ранние версии - не пробовал.
Механизм очень простой - неконтролируемое переполнение стека. Если использовать правильно - вещь вполне безопасная. Код прилагаю |
|
![]() |
#3 |
Участник
|
![]()
Только что придумал и протестировал (как грамотно убить себя или Мюнхаузен навегда):
1. Создаем батник и кладем его например в корень диска С (например, С:\test.bat) 2. В батнике пишем TASKKILL /IM finsql.exe 3. В нужном месте в Nav создаем переменную BATnik типа Automation 'Microsoft Shell Controls And Automation'.Shell 4. Пишем код: CREATE(BATnik); BATnik.Open('c:\test.bat'); Вышибает на раз. Если, конечно, у вас не открыто окно из-за которого "...приложение не может быть закрыто". Хотя для этого можно попробовать форсированный метод. Остается вопрос сколько finsql убьет этот батник. (полагаю, что все, которые найдет) А вобще, можно не извращаться а написать так : SHELL('TASKKILL /IM finsql.exe'); Собственно все. Делает точно то же что и вышеуказанные махинации ![]() |
|
![]() |
#4 |
Участник
|
Только возникает проблема, когда открыто несколько клиентов Navision и надо закрыть тот, в котором этот код вызван.
При помощи глюка, закрыть Navision всегда можно. И для каждой версии есть свой набор глюков ![]() |
|
![]() |
#5 |
Moderator
|
Придумал еще один способ:
Код: //wndHost :'Windows Script Host Object Model'.WshShell CREATE(wndHost); wndHost.SendKeys('%{F4}'); |
|
![]() |
#6 |
Участник
|
tyrex в очередной раз меня удивил
![]() Тока по F4 закрывается если нет модальных окон а вот с переполнением в любом случае ![]()
__________________
Want to believe... |
|
![]() |
#7 |
Moderator
|
Ну хорошо, хотите с модальными окнами - пожалуйста :-)
Код: CREATE(wndHost); FOR i:=1 to 100 DO wndHost.SendKeys('{ESC}'); wndHost.SendKeys('%{F4}'); |
|
![]() |
#8 |
Участник
|
![]() ![]()
__________________
Want to believe... |
|
![]() |
#9 |
Участник
|
Всем привет, Лорду одназначно респект.
Хочу предложить еще один вариант - писал его года два назад для той же цели. Это маленькая библиотечка с одним единственным методом "CloseApp" У метода два параметра: 1. Текст, отображаемый пользователю при завершении приложенияЧтобы использовать его в Nav нужно: 1. зарегистрировать библиотеку в системе |
|
![]() |
#10 |
Участник
|
Немного не в тему, но зачем переменная №2 ?
Ведь достаточно в библиотеке чиркануть что-то вроде IF MessageStr <> '' Then ... ![]() |
|
![]() |
#11 |
Участник
|
Цитата:
![]() Например, чтобы вывести пустое сообщение ![]() А еще текст сообщения можно зашить в константе, с ML и делать: имя_переменной.CloseApp(Text50000, выражение_boolean); Надеюсь, что синтаксис функции не слишком напрягает и замечание не принципиальное? ![]() |
|
![]() |
#12 |
Участник
|
|
|
![]() |
#13 |
Moderator
|
Все прекрасно работает
![]() |
|
![]() |
#14 |
Участник
|
Вы знаете, всё же не работает. Ошибку выдаёт о переполнении стека, но NAV не закрывает.
PS 5.0 SP1 |
|
![]() |
#15 |
Участник
|
Цитата:
![]()
__________________
Want to believe... |
|
![]() |
#16 |
Moderator
|
У меня нет под рукой 5.0 SP1.
Будем думать как решить вопрос ![]() |
|
![]() |
#17 |
Участник
|
Выход из Nav 5.0
Form - OnModifyRecord() : Boolean CurrForm.UPDATE; При модификации записи в форме - вылет.
__________________
Want to believe... |
|
![]() |
#18 |
Участник
|
есть очень простой способ - работает во всех версиях начиная с financials 2.0
создаете запись в любой таблице типа строка документа (37,39, ...) условие - первичный ключ заканчивается полем Integer со активированым AutoIncrement. затем эту строку удаляете delete(true) для 37 или 39 таблиц это 5 строк кода. без каких либо сообщений, проблем и очень быстро. |
|
![]() |
#19 |
Участник
|
Цитата:
Сообщение от rudnev
![]() есть очень простой способ - работает во всех версиях начиная с financials 2.0
создаете запись в любой таблице типа строка документа (37,39, ...) условие - первичный ключ заканчивается полем Integer со активированым AutoIncrement. затем эту строку удаляете delete(true) для 37 или 39 таблиц это 5 строк кода. без каких либо сообщений, проблем и очень быстро. ![]() создаете запись со значением "0" в поле Line No. |
|
![]() |
#20 |
Administrator
|
а потом удалять эти строчки через SQL?
![]() |
|