Проблема с размещением страниц на CTabCtrl внутри другого CTabCtrl
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 15.06.18 12:21
Оценка:
На диалоговом окне есть компонент TAB_CTRL1 типа CTabCtrl, на котором расположены несколько страниц--pPage1, pPage2, pOrbitDefinition, pPage5, pPage6 (потомки класса CDialog). И на одной из этих страниц (pOrbitDefinition) расположен другой компонент TAB_CTRL типа CTabCtrl, на которой помещены две страницы pPage3, pPage4 (также потомки класса CDialog).

И возникла проблема с размещением этих двух страниц pPage3 и pPage4 на компоненте TAB_CTRL, расположенном на странице pOrbitDefinition--отладчик бьётся на строке, в которой вызывается функция Create для pPage3.\

В чём причина этого? Как исправить ошибку?

Код:

BOOL  CFlightToMoonDlg::OnInitDialog()
{
    CPage1 *pPage1;
    CPage2 *pPage2;
    CPage3* pPage3;
    CPage4* pPage4;
    CPage5 *pPage5;
    CPage6 *pPage6;
    COrbitDefinition *pOrbitDefinition;

    CDialog::OnInitDialog();
    //
    TCITEM  TabItem;
    TabItem.mask = TCIF_TEXT;
    TabItem.pszText = L"Исходные НУ";
    m_IDC_TAB1.InsertItem(0,&TabItem);
    TabItem.pszText = L"Модель движения";
    m_IDC_TAB1.InsertItem(1,&TabItem);
    TabItem.pszText = L"Определение орбиты";
    m_IDC_TAB1.InsertItem(2,&TabItem);
    TabItem.pszText = L"Расчёт эфемерид";
    m_IDC_TAB1.InsertItem(3,&TabItem);
    TabItem.pszText = L"Прогноз подлёта";
    m_IDC_TAB1.InsertItem(4,&TabItem); 
    CSize  csize;
    csize.SetSize(100,28);
    m_IDC_TAB1.SetItemSize(csize);
    LOGFONT  lf;
    CFont  *pfont;
    memset(&lf,0,sizeof(lf));
    lf.lfHeight = 16;
    lf.lfWidth = 8;
    lf.lfWeight = FW_NORMAL;
    //lf.lfWeight = FW_BOLD;
    lf.lfCharSet = ANSI_CHARSET;
    lf.lfOutPrecision = OUT_DEFAULT_PRECIS;
    lf.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    lf.lfQuality = PROOF_QUALITY;
    lf.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN;
    wcscpy(lf.lfFaceName,L"MS Sans Serif");
    pfont = new CFont();
    pfont->CreateFontIndirectW(&lf);
    m_IDC_TAB1.SetFont(pfont);
    //
    pPage1 = new CPage1(this);
    pPage2 = new CPage2(this);
    pPage5 = new CPage5(this);
    pPage6 = new CPage6(this);
    pOrbitDefinition = new COrbitDefinition(this);
    //
    TabItem.mask = TCIF_PARAM;
    TabItem.lParam = (LPARAM)pPage2;
    m_IDC_TAB1.SetItem(0,&TabItem);
    VERIFY(pPage2->Create(CPage2::IDD,&m_IDC_TAB1));
    pPage2->SetWindowPos(NULL,10,30,0,0,SWP_NOSIZE|SWP_NOZORDER);
    pPage2->ShowWindow(SW_SHOW);
    //
    TabItem.mask = TCIF_PARAM;
    TabItem.lParam = (LPARAM)pPage1;
    m_IDC_TAB1.SetItem(1,&TabItem);
    VERIFY(pPage1->Create(CPage1::IDD,&m_IDC_TAB1));
    pPage1->SetWindowPos(NULL,10,30,0,0,SWP_NOSIZE|SWP_NOZORDER);
    pPage1->ShowWindow(SW_HIDE);
    //
    TabItem.mask = TCIF_PARAM;
    TabItem.lParam = (LPARAM)pOrbitDefinition;
    m_IDC_TAB1.SetItem(2,&TabItem);
    VERIFY(pOrbitDefinition->Create(COrbitDefinition::IDD,&m_IDC_TAB1));
    pOrbitDefinition->SetWindowPos(NULL,10,30,0,0,SWP_NOSIZE|SWP_NOZORDER);
    pPage3 = new CPage3(this);
    pPage4 = new CPage4(this);
    pOrbitDefinition->pPage3 = pPage3;
    pOrbitDefinition->pPage4 = pPage4;
    TCITEM  TabItem2;
    TabItem2.mask = TCIF_TEXT;
    TabItem2.pszText = L"Измерения";
    pOrbitDefinition->m_IDC_TAB1.InsertItem(0,&TabItem2);
    TabItem2.pszText = L"Краевая задача";
    pOrbitDefinition->m_IDC_TAB1.InsertItem(1,&TabItem2);
    CSize  csize2;
    csize2.SetSize(100,28);
    pOrbitDefinition->m_IDC_TAB1.SetItemSize(csize2);
    LOGFONT  lf2;
    CFont  *pfont2;
    memset(&lf2,0,sizeof(lf2));
    lf2.lfHeight = 16;
    lf2.lfWidth = 8;
    lf2.lfWeight = FW_NORMAL;
    lf2.lfCharSet = ANSI_CHARSET;
    lf2.lfOutPrecision = OUT_DEFAULT_PRECIS;
    lf2.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    lf2.lfQuality = PROOF_QUALITY;
    lf2.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN;
    wcscpy(lf2.lfFaceName,L"MS Sans Serif");
    pfont2 = new CFont();
    pfont2->CreateFontIndirectW(&lf2);
    pOrbitDefinition->m_IDC_TAB1.SetFont(pfont2);
    //
    pOrbitDefinition->ShowWindow(SW_HIDE);
    //
    TabItem.mask = TCIF_PARAM;
    TabItem.lParam = (LPARAM)pPage5;
    m_IDC_TAB1.SetItem(3,&TabItem);
    VERIFY(pPage5->Create(CPage5::IDD,&m_IDC_TAB1));
    pPage5->SetWindowPos(NULL,10,30,0,0,SWP_NOSIZE|SWP_NOZORDER);
    pPage5->ShowWindow(SW_HIDE);
    //
    TabItem.mask = TCIF_PARAM;
    TabItem.lParam = (LPARAM)pPage6;
    m_IDC_TAB1.SetItem(4,&TabItem);
    VERIFY(pPage6->Create(CPage6::IDD,&m_IDC_TAB1));
    pPage6->SetWindowPos(NULL,10,30,0,0,SWP_NOSIZE|SWP_NOZORDER);
    pPage6->ShowWindow(SW_HIDE);
    //
    TabItem2.mask = TCIF_PARAM;
    TabItem.lParam = (LPARAM)pPage3;
    m_IDC_TAB1.SetItem(0,&TabItem2);
    VERIFY(pOrbitDefinition->pPage3->Create(CPage3::IDD,&(pOrbitDefinition->m_IDC_TAB1))); // здесь бьётся программа
    pOrbitDefinition->pPage3->SetWindowPos(NULL,10,30,0,0,SWP_NOSIZE|SWP_NOZORDER);
    pOrbitDefinition->pPage3->ShowWindow(SW_SHOW);
    //
    TabItem2.mask = TCIF_PARAM;
    TabItem2.lParam = (LPARAM)pPage4;
    m_IDC_TAB1.SetItem(1,&TabItem2);
    VERIFY(pOrbitDefinition->pPage4->Create(CPage4::IDD,&(pOrbitDefinition->m_IDC_TAB1)));
    pOrbitDefinition->pPage4->SetWindowPos(NULL,10,30,0,0,SWP_NOSIZE|SWP_NOZORDER);
    pOrbitDefinition->pPage4->ShowWindow(SW_HIDE);
    return  TRUE;
}
1613 г. = 2024 г.
Re: Проблема с размещением страниц на CTabCtrl внутри другого CTabCtrl
От: pilgrim_ Россия  
Дата: 15.06.18 23:29
Оценка: 1 (1)
Здравствуйте, RussianFellow, Вы писали:

RF>Код:


RF>
RF>    TabItem.pszText = L"Прогноз подлёта";
RF>


off: Искренне надеюсь, что твое профессиональное творчество никогда не выйдет в продакшн и не попадет в МО

RF>И возникла проблема с размещением этих двух страниц pPage3 и pPage4 на компоненте TAB_CTRL, расположенном на странице pOrbitDefinition--отладчик бьётся на строке, в которой вызывается функция Create для pPage3.\


RF>В чём причина этого? Как исправить ошибку?


поставь брекпойнт там где "бьется" и посмотри причину, для этого будет достаточно нажать ссотв. кнопку в диалоге отладчика
Re[2]: Проблема с размещением страниц на CTabCtrl внутри другого CTabCtrl
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 16.06.18 11:14
Оценка:
RF>>В чём причина этого? Как исправить ошибку?

_>поставь брекпойнт там где "бьется" и посмотри причину, для этого будет достаточно нажать ссотв. кнопку в диалоге отладчика


Какую кнопку нажать?
1613 г. = 2024 г.
Re[3]: Проблема с размещением страниц на CTabCtrl внутри другого CTabCtrl
От: pilgrim_ Россия  
Дата: 16.06.18 21:36
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>>>В чём причина этого? Как исправить ошибку?


_>>поставь брекпойнт там где "бьется" и посмотри причину, для этого будет достаточно нажать ссотв. кнопку в диалоге отладчика


RF>Какую кнопку нажать?


Кнопка может называться Retry/Break/Повторить/Прервать, точно не помню, напр (картинка из интернетов):



при нажатии на нее ты должен попасть в отладчик с открытым исходником, где произошел вызов этого диалога (в MFC обычно это вызов какого-нить ASSERT, напр. ASSERT(hWnd != NULL)).

Посмотри по стэку, где был вызван ASSERT, на какое условие он сработал, это может поможет найти причину.
Re[4]: Проблема с размещением страниц на CTabCtrl внутри другого CTabCtrl
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 18.06.18 08:18
Оценка:
Я перенёс код вставки подстраниц pPage3 и pPage4 на страницу pOrbitDefinition внутри функции COrbitDefinition::OnInitDialog :

BOOL  COrbitDefinition::OnInitDialog()
{
    CDialog::OnInitDialog();
    TCITEM  TabItem2;
    TabItem2.mask = TCIF_TEXT;
    TabItem2.pszText = L"Измерения";
    m_IDC_TAB1.InsertItem(0,&TabItem2);
    TabItem2.pszText = L"Краевая задача";
    m_IDC_TAB1.InsertItem(1,&TabItem2);
    pPage3 = new CPage3(&m_IDC_TAB1);
    pPage4 = new CPage4(&m_IDC_TAB1);
    CSize  csize2;
    csize2.SetSize(100,28);
    m_IDC_TAB1.SetItemSize(csize2);
    LOGFONT  lf2;
    CFont  *pfont2;
    memset(&lf2,0,sizeof(lf2));
    lf2.lfHeight = 16;
    lf2.lfWidth = 8;
    lf2.lfWeight = FW_NORMAL;
    lf2.lfCharSet = ANSI_CHARSET;
    lf2.lfOutPrecision = OUT_DEFAULT_PRECIS;
    lf2.lfClipPrecision = CLIP_DEFAULT_PRECIS;
    lf2.lfQuality = PROOF_QUALITY;
    lf2.lfPitchAndFamily = VARIABLE_PITCH | FF_ROMAN;
    wcscpy(lf2.lfFaceName,L"MS Sans Serif");
    pfont2 = new CFont();
    pfont2->CreateFontIndirectW(&lf2);
    m_IDC_TAB1.SetFont(pfont2);
    //
    TabItem2.mask = TCIF_PARAM;
    TabItem2.lParam = (LPARAM)pPage3;
    m_IDC_TAB1.SetItem(0,&TabItem2);
    ASSERT(pPage3->Create(CPage3::IDD,&m_IDC_TAB1)); // здесь бьётся программа
    pPage3->SetWindowPos(NULL,10,30,0,0,SWP_NOSIZE|SWP_NOZORDER); 
    pPage3->ShowWindow(SW_SHOW);
    //
    TabItem2.mask = TCIF_PARAM;
    TabItem2.lParam = (LPARAM)pPage4;
    m_IDC_TAB1.SetItem(1,&TabItem2);
    ASSERT(pPage4->Create(CPage4::IDD,&m_IDC_TAB1));
    pPage4->SetWindowPos(NULL,10,30,0,0,SWP_NOSIZE|SWP_NOZORDER);
    pPage4->ShowWindow(SW_HIDE); 
    m_IDC_TAB1.SetCurSel(0);
    return  TRUE;
}


И на строке
ASSERT(pPage3->Create(CPage3::IDD,&m_IDC_TAB1));

программа бьётся--выскакивает сообщение

Debug Assertion Failed!
Program: C:\Windows\system32\mfc110ud.dll
File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dlgdata.cpp
Line: 40


Что это означает? Как исправить эту ошибку?
1613 г. = 2024 г.
Re[2]: Проблема с размещением страниц на CTabCtrl внутри дру
От: AlexGin Беларусь  
Дата: 19.06.18 15:21
Оценка:
Здравствуйте, pilgrim_, Вы писали:

_>Здравствуйте, RussianFellow, Вы писали:


RF>>Код:


RF>>
RF>>    TabItem.pszText = L"Прогноз подлёта";
RF>>



_>off: Искренне надеюсь, что твое профессиональное творчество никогда не выйдет в продакшн и не попадет в МО


Выделенное выше — меня немного улыбнуло

Напомню, что ВСЕГДА рекомендуется — строки выносить в таблицу строковых ресурсов. Мы это делали на MFC ешё в 2002 году.
Однако, товарищ RussianFellow, прописывает строки прямо в коде

Hint: Если завтра творчество RussianFellow придётся поставлять, например в КНДР, — пляски с бубнами ОБЕСПЕЧЕНЫ
Отредактировано 19.06.2018 15:24 AlexGin . Предыдущая версия . Еще …
Отредактировано 19.06.2018 15:23 AlexGin . Предыдущая версия .
Re: Проблема с размещением страниц на CTabCtrl внутри другого CTabCtrl
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 20.06.18 07:04
Оценка:
Проблема решена.

В классе CPage3 в функции DoDataExchange я убрал вызовы функций DDX_Control для тех компонент этого класса, которые я удалил ранее. И всё у меня нормально заработало.
1613 г. = 2024 г.
Re[3]: Проблема с размещением страниц на CTabCtrl внутри дру
От: pilgrim_ Россия  
Дата: 21.06.18 23:46
Оценка:
Здравствуйте, AlexGin, Вы писали:

RF>>>
RF>>>    TabItem.pszText = L"Прогноз подлёта";
RF>>>


AG>Напомню, что ВСЕГДА рекомендуется — строки выносить в таблицу строковых ресурсов. Мы это делали на MFC ешё в 2002 году.

AG>Однако, товарищ RussianFellow, прописывает строки прямо в коде

AG>Hint: Если завтра творчество RussianFellow придётся поставлять, например в КНДР, — пляски с бубнами ОБЕСПЕЧЕНЫ


Ну о чем ты говоришь, какие строки/ресурсы/КНДР, то чем занимается ТС думаю никогда не выйдет за пределы страны, а вот если при чтении какого-нить файла
Автор: RussianFellow
Дата: 27.03.17
(обратить внимание на читаемую структуру) будет прочитан какой-нить мусор, либо каст с потерей разрядности, то может и на голову внезапно что-то упасть, чего не хотелось бы

ps: сори за оффтоп и обсуждение ТС, ничего личного
Re[4]: Проблема с размещением страниц на CTabCtrl внутри дру
От: Amygdala Россия  
Дата: 22.06.18 05:01
Оценка:
Здравствуйте, pilgrim_, Вы писали:

_>Здравствуйте, AlexGin, Вы писали:


RF>>>>
RF>>>>    TabItem.pszText = L"Прогноз подлёта";
RF>>>>


Кстати, не является ли выкладывание ТС-ом простыней своих нетленочек разглашением гос тайны?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.