Почему Microsoft Word не может закрыться, если открыто диалоговое окно?

28

Иногда я получаю сообщение об ошибке, которое выдает Word, когда пытается закрыть документ с другим открытым диалоговым окном, но я так и не смог понять, почему это происходит.

Джон
источник
6
Общая проблема заключается в том, что содержимое диалогового окна может стать действительным, недействительным или даже неприменимым в зависимости от того, что вы делаете в главном окне, и зачастую нет четкого способа решить эту проблему с помощью изменений, которые пользователь мог внести в диалоговое окно в промежуточный. (Я предполагаю , что это просто еще одно проявление более общего принципа «петли обратной связи может вызвать проблемы в системе».)
Мердад
Они могут, если вы запустите диспетчер задач и скажете ему, чтобы остановить процесс. =) Но это может иметь неожиданные побочные эффекты. ( Могут быть редкие случаи, когда файл может оказаться поврежденным, но я уверен, что они будут крайне редки. В любом случае, он должен быть рассчитан на непредвиденные сбои и перебои в подаче электроэнергии.)
jpmc26

Ответы:

61

Поскольку большинство диалоговых окон считаются « модальными », это означает, что управление не передается обратно основной программе или вызывающему контейнеру, пока само диалоговое окно не будет закрыто. Это сделано специально, и у программиста есть возможность сделать окно модальным или немодальным. Обычно окно определяется как модальное, если основная программа не может или не должна продолжать работу, пока открытое диалоговое окно не будет обработано либо с помощью выделения (Ok), либо с помощью прерывания (Cancel).

Билл Хайлман
источник
4
Но если диалоговое окно было модальным, как OP приказал программе закрыться? Может ли здесь что-то еще происходить?
Легкость гонок с Моникой
7
@LightnessRacesinOrbit Есть много способов закрыть программу, не все из которых требуют кликов в главном окне. Например, вы можете щелкнуть правой кнопкой мыши на панели задач и выбрать «Закрыть», или потянуть Диспетчер задач вверх с помощью Ctrl-Shift-Esc и попытаться закрыть оттуда. Завершение работы Windows также вначале будет пытаться корректно закрыть приложения, хотя может затем «убить» их после истечения времени ожидания. Они посылают сигнал программе на закрытие, не имея фокуса, поэтому на скриншоте Боба написано «Нажмите OK, переключитесь на Word» в этом порядке.
IMSoP
@IMSoP: я знаю, что есть больше «инженерных» способов попросить приложение закрыться, но я мысленно нарисовал линию, где я думаю, что «общее использование» заканчивается, потому что я ожидал, что ОП точно определит, что именно они делали, если бы это было за пределами «общего пользования».
Легкость гонок с Моникой
11
@LightnessRacesinOrbit Я предоставляю вам Диспетчер задач, это более «экспертный» способ, но я бы не удивился, если бы люди думали, что закрытие чего-либо с панели задач было совершенно нормально. На самом деле, теперь я понимаю, что вам даже не нужно щелкать правой кнопкой мыши, там есть красная кнопка [x], если вы наводите курсор на группу или просматриваете маленький эскиз. Разные вещи кажутся очевидными для разных людей.
IMSoP
@IMSoP: это правда.
Легкость гонок с Моникой
20

Диалоговое окно может говорить что-то вроде:

Вы внесли изменения в свой документ, хотите ли вы сохранить их? (Да нет)

Здесь нет очевидного правильного ответа. Возможно, вы случайно испортили ваш документ (например, кошка прошла по клавиатуре), и в этом случае ответ «Нет», или вы могли часами вводить изменения, и в этом случае ответ был «Да».

Самое безопасное для Word - это отказаться от закрытия, пока вы не ответите на вопрос.

Ник Гаммон
источник
8
Я почти уверен, что вопрос именно об этой ошибке.
Боб
12
ОК, но в вопросе не упоминалось какое-либо конкретное диалоговое окно. Я программист, я понимаю, что такое модальное диалоговое окно, однако я попытался ответить на вопрос, почему это происходит.
Ник Гаммон
ИМХО, имейте в виду, что люди, которые не являются программистами, используют программы.
LawrenceC
1

Поскольку программа разработана таким образом, чтобы избежать действий, которые пользователь может не захотеть.

Обычно диалоговое окно отображается, когда программе необходимо, чтобы пользователь провел какое-то действие. Отличным примером является закрытие несохраненного документа: диалоговое окно предлагает сохранить изменения, отменить изменения или отменить закрытие и вернуться к редактированию. Программа намеренно отказывается закрываться, не отвечая на этот вопрос, потому что закрытие заставит НЕКОТОРЫЕ действия предпринять. Программа не может решить самостоятельно, например. отменить недавнее редактирование или, наоборот, перезаписать правильную версию с помощью ввода с клавиатуры.

Даже если мы рассматриваем диалог, который не связан с закрытием, это обычно означает, что какой-то процесс находится в процессе, он еще не завершен, и пользователь должен решить, каким путем идти. Его нельзя «просто прервать», потому что прерывание - это также действие, которое пользователь не может иметь в виду.

Это также упрощает дизайн программы, поскольку ее создатели не должны создавать «безопасный выход» из каждой функции.

Сегодня большинство диалогов не являются модальными в техническом смысле (программа остается ответственной), но все же проще сделать их модальными в более широком смысле логического потока программы.

Agent_L
источник
0

Я могу ошибаться, но я подозреваю, что это восходит к старому общему поведению управления диалогом.

Некоторые из тех, кто был внезапно убит без возврата, имели неприятные побочные эффекты, иногда даже за пределами уже мертвой программы, и во всех случаях не было способа вежливо убежать от них, если они делали что-то на системном уровне, что требовало ввода данных пользователем.

Относительно того, почему это все еще так, люди привыкли к этому, разработчики запрограммировали это предположение на десятилетия, и, что более важно, непрограммисты использовали эти диалоги в своих сценариях автоматизации делопроизводства, и Microsoft - ничто иное, как строгая приверженность целям обратной совместимости. ,

Билл
источник
0

За кулисами программа (в нашем случае это MS Word) создает «обработчик события нажатия кнопки X» при создании окна. Когда есть диалоговое окно, Word записывает это. Затем, в обработчике кнопки X, когда кнопка X нажимается, она проверяет записанные открытые диалоговые окна. Если они есть, обработчик прерывает операцию закрытия. Если нет, это завершает программу, и ОС очищает память, занятую программой. Вот как это работает.

Владислав Тончаров
источник