Почему использование окно владельца в MessageBox. Показать?

Забудьте о том, что вы пытаетесь использовать для этого. Мы будем рассматривать это только с точки зрения языка.

Объявление

public <T extends Number> T getSomeValue (boolean tf) {

определяет новый тип T, который ограничен Number. Это означает, что вызывающий может связывать Number или любой подтип Number с T при вызове метода. Внутри метода вы не знаете, что это за тип.

Поэтому вы не можете делать

T number = new Double(1.0);

, потому что вы не знаете, что T является Double. Если я вызвал метод как

Float f = genOp.getSomeValue(true);

T, он должен был Float. Компилятор не может гарантировать безопасность типа и, следовательно, отклоняет его (присваивание внутри метода, если оно было разрешено, ClassCastException было бы выброшено во время выполнения). Если вы используете бросок, вы сообщаете компилятору, что вы уверены в том, что делаете. Он предупредит вас, но он вам будет доверять.

Аналогично, объявление

public <T> T getSomeValue(boolean tf)

определяет новый тип T, который не ограничен. Это означает, что вы можете привязать любой тип к T, что еще больше увеличивает проблему. Теперь я могу сделать

String f = genOp.getSomeValue(true);
19
задан Matt Hamilton 17 October 2008 в 00:31
поделиться

6 ответов

Окно сообщения является модальной формой, что означает, что ее родительское окно отключено, пока окно сообщения не отклонено.

, Если Шоу () перегрузку называют, который не берет идентификатор владельца, затем родительская форма обычно выбирается автоматически. Я ничего не могу найти в документации, которая описывает, как та форма выбрана, но мой опыт состоит в том что, если окно сообщения отображено в потоке GUI (т.е. основном потоке или потоке насоса сообщения), то активное окно для того потока выбрано в качестве родителя.

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

<час>

ДОБАВИЛ: я думал об этом, и теперь я не так уверен. Отрывок от отражателя, который Вы дали ниже, заставляет меня думать, что, возможно, поток не имеет значения. (Я сказал, что ничего не мог найти в документации!)

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

Извините за беспорядок.

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

22
ответ дан 30 November 2019 в 04:12
поделиться

Установка владельца заставляет владельца быть отключенным, в то время как окно сообщения открыто.

, Если Вы не устанавливаете владельца затем, пользователь может нажать что-то еще или даже закрыть владельца, в то время как окно сообщения открыто, затем когда окно сообщения закрывается и код после вызова к MessageBox. Шоу запускает Вашу программу, может быть в неизвестном состоянии - или если владелец был закрыт, Вы теперь выполняете код в окне, которое больше не существует и никакие вызовы к методам WinForms, или WPF (или в этом отношении также WinAPI и любая другая платформа), вероятно, вызовут катастрофический отказ.

3
ответ дан 30 November 2019 в 04:12
поделиться

Оказывается, что владение окна не является переходным. В случае, где у Вас есть форма, порождая форму, порождая MessageBox, MessageBox. Покажите потребности использовать ownerWindow параметр. Исходная форма должна быть установлена как окно владельца MessageBox.

1
ответ дан 30 November 2019 в 04:12
поделиться

если я не ошибаюсь, что это предотвращает к окну владельца, чтобы Сфокусироваться (), пока messagebox не закрывается.

0
ответ дан 30 November 2019 в 04:12
поделиться

Используя Сетевой Отражатель, я просто нашел этот код в Messagebox. Покажите:

else if (owner == IntPtr.Zero)
    owner = UnsafeNativeMethods.GetActiveWindow();

Поэтому, если Вы не делаете вложенного владения (окно - (владеет)->, окно - (владеет)-> messageBox), не учитывание ownerWindow устанавливает владельца, которого Вы обычно выбирали бы.

0
ответ дан 30 November 2019 в 04:12
поделиться

В документации, похоже, подразумевается, что единственное назначение параметра owner - если вы укажете MB_HELP, окно сообщений будет знать, в какое окно ему следует послать сообщение WM_HELP.

http://msdn.microsoft.com/en-us/library/ms645505%28VS.85%29.aspx


О, только что понял, что ОП был о .net - я дал ответ о winapi - извините!

0
ответ дан 30 November 2019 в 04:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: