mraaf Ответов: 2

Использование функции в Родительском диалоге для отправки строки


Привет Эксперты,

Я использую VC++ 6.0 с MFC для создания диалогового приложения. У меня есть проблемы с использованием функции в Родительском диалоге для отправки строки из любого дочернего диалога и отображения ее в Родительском. Мои дочерние диалоги создаются внутри CTabCtrl в Родительском диалоге.

Однако он возвращает эту ошибку:

Отладочное Утверждение Не Удалось!

Program:D\:..\..\Debug\MyDialog.exe
Файл: winocc.cpp
Строка: 259

Пожалуйста, посоветуйте. Спасибо.
мрааф

Что я уже пробовал:

Это функция, которую мне нужно вызвать из дочернего диалога - используя ее для отправки строки из дочернего и отображения ее в поле редактирования в Родительском окне.:

void CParentDlg::GetEvent(LPCTSTR pEvent)
{
	m_editEvent.SetWindowText(pEvent);
}



Затем я вызвал вышеуказанную функцию из одного из дочерних диалоговых окон с вкладками:

void CChildDlg1::OnCheckPower24v() 
{
        CParentDlg parent;
        parent.GetEvent("ACTIVATE 24V");
}

2 Ответов

Рейтинг:
18

Jochen Arndt

Вы используете неназначенную переменную parent.
Попробовать это:

void CChildDlg1::OnCheckPower24v() 
{
    CParentDlg *parent = (CParentDlg*)GetParent();
    // Check if parent is not NULL with debug builds
    ASSERT(parent);
    // Check if proper class
    // Requires that CParentDlg has been declared as DECLARE_DYNAMIC
    //  or DECLARE_DYNCREATE
    ASSERT(parent->IsKindOf(RUNTIME_CLASS(CParentDlg)));
    parent->GetEvent("ACTIVATE 24V");
}

Обратите внимание, что вышеизложенное требует, чтобы дочерний диалог был создан путем передачи указателя на родительский диалог (например, путем передачи this при звонке Create в CParentDlg класс).

Обратите внимание на комментарии ко второму ASSERT вызов. VC 6 действительно старый (18 лет, Последнее обновление 13 лет назад), и я не знаю, работает ли это с VC 6.


mraaf

Привет Йохен,
Я добавил DECLARE_DYNAMIC и IMPLEMENT_DYNAMIC, но у меня возникла ошибка со вторым утверждением.

Пожалуйста, посоветуйте.

Спасибо

Jochen Arndt

Второе утверждение предназначено для того, чтобы убедиться, что диалог был создан CParentDlg. Если вы это знаете, это можно опустить.

Как уже отмечалось, я не уверен, что IsKindOf() и обработка классов времени выполнения поддерживаются VC6. Вы должны прочитать документацию VC6 об этом и динамической реализации. У меня его больше нет.

mraaf

Хорошо, ценю вашу помощь. Спасибо.
Думая о том, чтобы сделать это по-другому с тем же результатом. Это будет около 90 различных строк событий, которые будут распределены из 5 дочерних диалогов и регистрировать их все в Родительском.

Опять же, ценю любые предложения.

Спасибо
мрааф

Рейтинг:
1

mraaf

Это исправляется путем выбора правильного родителя.

С момента моего окна ребенка ребенок CTabCtrl:

CTabFTE *pTab = (CTabFTE*)GetParent();


и CTabCtrl-это Ребенок главный диалог:

CParentDlg *parent = (CParentDlg*)GetParent()