Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Почему не работает DoModal()?  (Прочитано 15343 раз)
0 Пользователей и 1 Гость смотрят эту тему.
CTAPOBEP
Постоялец

ru
Offline Offline
Пол: Мужской

« : 11-07-2008 10:53 » 

Однажды в июльскую жаркую пору я вышел из лесу, в руках - диалог.

Здравствуйте, люди добрые (злые нелюди - болейте).

Который божий день (который уже?) бьюсь аки зверь мух об стекло и все без пользы. Ибо согрешил я от слабости моей, каюсь, использовал MFC - библиотеку адскую, продукт непотребный. Намедни сотворил я программу, поразить видом своим Заказчика способную. И унаследовал я класс от CDialog, и назвал его CBaseDialog, и расписал его в лучшем виде и увидел, что это хорошо. И унаследовал я все другие окна от CBaseDialog и возрадовался. И решил я добавить окно сообщения в общей стилистике. Тут-то и настигло меня наказанье за грехи мои, ибо функция DoModal() вернула -1 и надсмеялась надо мной многажды. И страшный зверь Начальник когти свои уже...

Короче, кто виноват, я знаю. Что делать ?

Код:
class CBaseDialog: public CDialog
{
...

class CMessageDialog: public CBaseDialog
{
...

CMessageDialog dlg;
if (dlg.DoModal() == -1) AfxMessageBox("Секирбашка");
« Последнее редактирование: 11-07-2008 12:14 от Вад » Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 11-07-2008 11:17 » 

CTAPOBEP, тебе-то хорошо. Времени дофига, чтобы всяким словоблудием заниматься. Покороче сформулируй, без теологических художественных эпитетов. Если конечно ты преследуешь цель получить помощь, а не рисануться своим умением витиевато изъясняться. DoModal работает.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 11-07-2008 11:50 » 

Да возьмет Старовер в  руки, свои "кривые руки" и да расскажет Старовер, нам, умеющим читать, но не могущим понять какой бес мучает его да обернет он свой код в теги [code][/code], чтобы нам презренным мира сего было удобно читать.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 11-07-2008 12:13 » 

И открыл я MSDN, и познал, что
Цитата: MSDN
The return value is –1 if the function could not create the dialog box
И просветлённый знанием этим, направил стопы свои в исходный код CDialog::DoModal. И прозрел, ибо -1 возвращает сие детище рук человеческих по двум причинам. Первая:
Код: (C++) dlgcore.cpp
        // return -1 in case of failure to load the dialog template resource
        if (lpDialogTemplate == NULL)
                return -1;
и вторая
Код: (C++) dlgcore.cpp
        TRY
        {
                // ...
        }
        CATCH_ALL(e)
        {
                DELETE_EXCEPTION(e);
                m_nModalResult = -1;
        }

        // ...

        return m_nModalResult;
Правда, сие есть в реализации VS 2005, а как-то в других, не ведаю.

Sla, а обращения кода в теги модератор да не погнушается Ага
« Последнее редактирование: 11-07-2008 12:15 от Вад » Записан
CTAPOBEP
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 11-07-2008 13:29 » 

Речь, собственно, вот о чем - http://slil.ru/25972997
Записан
CTAPOBEP
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 11-07-2008 13:34 » 

Вад, то, что not create the dialog box, я вижу собственными глазами. Меня интересует - почему?
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 11-07-2008 14:02 » 

Ну, конкретно у меня твоё приложение, во-первых, не компилируется из-за несуществующего файла
Цитата: CTestDialog.rc
#include "l.rus\afxres.rc"
во-вторых, когда я это закомментировал, произошла ошибка номер раз - не смогло открыть ресурсы для твоего диалога. Вывод - с ними-то, с ресурсами, что-то и накосячено. Детально разбираться уже некогда, рабочий день заканчивается Улыбаюсь Копать надо, видимо, в том направлении.
Записан
CTAPOBEP
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 11-07-2008 14:53 » 

Вижу, русификатор есть не у всех Ага Вариант с английскими ресурсами - http://slil.ru/25973215
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 11-07-2008 15:05 » 

CTAPOBEP, да покажу я тебе пример работающего DoModal, да заменишь ты в файле CTestDialog.cpp строку
   CMessageDialog dlg;
на строку
   CCTestDialogDlg dlg;
.

И да объяснишь ты, что за мусор в классе  CMessageDialog :

Код:
	// Generated OLE dispatch map functions
//{{AFX_DISPATCH(CMessageDialog)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_DISPATCH
DECLARE_DISPATCH_MAP()
DECLARE_INTERFACE_MAP()

Код:
BEGIN_DISPATCH_MAP(CMessageDialog, CBaseDialog)
//{{AFX_DISPATCH_MAP(CMessageDialog)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_DISPATCH_MAP
END_DISPATCH_MAP()

// Note: we add support for IID_IMessageDialog to support typesafe binding
//  from VBA.  This IID must match the GUID that is attached to the
//  dispinterface in the .ODL file.

// {77BB4C0F-B72C-4163-A817-078C6D35E4A2}
static const IID IID_IMessageDialog =
{ 0x77bb4c0f, 0xb72c, 0x4163, { 0xa8, 0x17, 0x7, 0x8c, 0x6d, 0x35, 0xe4, 0xa2 } };

BEGIN_INTERFACE_MAP(CMessageDialog, CBaseDialog)
INTERFACE_PART(CMessageDialog, IID_IMessageDialog, Dispatch)
END_INTERFACE_MAP()


компонент какой то от лукавого ?

Записан

CTAPOBEP
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 11-07-2008 16:45 » 

"Мусор" ClassWizard напихал и его присутствие или отсутствие ни на что не влияет.

Я понимаю, что замена CMessageDialog на CCTestDialogDlg покажет мне окно Быть такого не может) Но! Мне-то нужно модальное окно на основе IDD_DIALOG_MESSAGE и чтобы класс этого окна был унаследован от CBaseDialog, потому что в этом классе до черта кода, который приводит все окна (16 штук) к общему виду.

Возможно, я не совсем точно сформулировал вопрос. Речь идет не о функции DoModal() вообще, а о ее категорическом отказе работать в данном конкретном случае.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #10 : 11-07-2008 21:52 » 

ага... загляни в файл BaseDialog.cpp

там строку
   : CDialog(CBaseDialog::IDD, pParent)

замени на
   : CDialog(nIDTemplate, pParent)



а то передаёшь неинициализированную переменную IDD в конструктор CDialog
Записан

CTAPOBEP
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 12-07-2008 06:11 » 

Ай, молодец! Ай, хороший человек! Ай, спас дедушку! Здоровья - и тебе, и жене твоей, и детям твоим! И пусть удача сопутствует всем начинаниям твоим!
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 12-07-2008 08:58 » 

нипадлизывайся ))
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines