Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Баг /небаг с модольностью 
V
    Опции темы
xTr1m
Дата 10.1.2013, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



День добрый, есть у меня программа, в которой, время от времени, терялась модальность диалогов. Долго копался и нашел такое:

Пусть есть три класса диалога CDialog1, CDialog2, CDialog3. У CDialog1 есть кнопка, код ее примерно такой:
Код

CDialog2 dlg;
dlg.DoModal();

В классе CDialog2 есть обычный метод:
Код

BOOL CDialog2::OnInitDialog()
{
    __super::OnInitDialog();

    CDialog3 dlg;
    dlg.DoModal();

    return TRUE;
}

То есть в еще не показавшемся CDialog2 мы модально вызываем CDialog3. Штука в том, что после закрытия CDialog3 модальность CDialog2 пропадает!!
Код утрированный, но наглядно показывает проблему. А может это не баг вовсе, а фича? Хотя я не верю, что я первый столкнулся с такой ситуацией.
Кто, что думает?
PM MAIL WWW ICQ   Вверх
xTr1m
Дата 11.1.2013, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



Оказывается можно еще проще воспроизвести. Создаем новый проект на основе диалога. На диалоге делаем кнопку, в которой вызываем окно About.
А в OnInitDialog CAboutDlg делаем AfxMessageBox. Все, модальность диалога About пропадает.
PM MAIL WWW ICQ   Вверх
Earnest
Дата 15.1.2013, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Пропадает не модальность, а недоступность главного окна. Там все просто - в MFC при входе в модальный цикл окну-родителю делается enable (false), а при выходе, соответственно, Enable (true). На самом деле немного сложнее, учитывается состояние окна. Но OnInitDialog вызывается еще вне модального цикла, вот и разгадка. А не надо вызывать другие диалоги из OnInit, вот и все. Или, соответственно, подкрутить enable, если невтерпеж.


--------------------
...
PM   Вверх
xTr1m
Дата 16.1.2013, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



Спасибо. Про то, что модальность есть "просто" disable родительского окна я уже понял (когда пытался разобраться). Однако, ведь если просто сделать недоступным родительское, то модальное тоже блокируется. Может там просто нужно по-глубже копнуть, посмотрим, может и полезу. Вообще проблема следующая.  Как мне удалось выяснить, если в OnInitDialog вызвать не модальное окно, а обычное (причем явно указать парент, без этого не работает), то все хорошо. Реальная ситуация такая: я вызываю диалог, в OnInit'е которого делаю загрузку из БД. В этот момент может появиться диалог ожидания (с кнопкой отмены. Так вот этот диалог все и портит. Его переделали на немодальный, но как указать ему парента, который еще не создан. Можно конечно пропихивать указатель, но таких мест много, да и костыль это.
PM MAIL WWW ICQ   Вверх
volatile
Дата 16.1.2013, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 4
Всего: 85



xTr1m, в онините пошлите постмессидж wm_user , этому-же диалогу
в обработчике wm_user загружайте бд и выводите любой диалог.

PM MAIL   Вверх
xTr1m
Дата 17.1.2013, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



Вот это интересный вариант решения, спасибо. Хотя опять же для всех существующих диалогов переделывать на это сложновато, но все равно идея красивая.
И все-таки я склонен называть это скорее багом MFC, нежели фичей =)
PM MAIL WWW ICQ   Вверх
Albor
Дата 18.1.2013, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(xTr1m @  17.1.2013,  09:31 Найти цитируемый пост)
И все-таки я склонен называть это скорее багом MFC, нежели фичей =) 

Баг обеспечиваете вы, прерывая процесс инициализации. Система послав WM_INITDIALOG, ждёт результата его обработки, а тут AfxMessageBox  с ручным тормозом... Зачем вмешательство пользователя на данном этапе? Для этого существует очередь, вот и отправляйте пользователя туда smile.
PM MAIL ICQ   Вверх
Earnest
Дата 23.1.2013, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(xTr1m @  16.1.2013,  22:26 Найти цитируемый пост)
Про то, что модальность есть "просто" disable родительского окна я уже понял

Неправильно ты понял. Модальность == собственный цикл обработки сообщений. А деактивация родительского окна (и других) - это опция, причем необязательная. И никак это модальности не мешает. Другое дело, что пользователь может потыкать в другие окна, перекрыть текущий диалог и т.д. Поэтому обычно и дизэблят.


--------------------
...
PM   Вверх
xTr1m
Дата 28.1.2013, 07:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 692
Регистрация: 9.2.2005
Где: Москва

Репутация: нет
Всего: 1



Про собственный цикл не знал, обязательно почитаю. Спасибо.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1059 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.