Проблема с выводом текста в текстовые поля диалога
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 28.11.16 08:01
Оценка:
Я работаю в Visual C++ 2012.

Есть класс CSourceNUDialog : public CDialog

class CSourceNuDialog : public CDialog
{
//...
public:
    void  setTextsIntoEdits(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7, char *s8);
    //...
};


В этом классе есть функция setTextsIntoEdits:

void  CSourceNuDialog::setTextsIntoEdits(char *s1, char *s2, char *s3, char *s4, char *s5, char *s6, char *s7, char *s8)
{
    m_IDC_EDIT1.SetWindowTextA(s1);
    m_IDC_EDIT2.SetWindowTextA(s2);
    m_IDC_EDIT3.SetWindowTextA(s3);
    m_IDC_EDIT4.SetWindowTextA(s4);
    m_IDC_EDIT5.SetWindowTextA(s5);
    m_IDC_EDIT6.SetWindowTextA(s6);
    m_IDC_EDIT7.SetWindowsTextA(s7);
    m_IDC_EDIT8.SetWindowTextA(s8);
}


В вызывающей функции я пишу:

CSourceNuDialog  mySourceNuDialog(this);

strcpy(s1,"a");  strcpy(s2,"b");  strcpy(s3,"c");  strcpy(s4,"d");  strcpy(s5,"e");  strcpy(s6,"f");  strcpy(s7,"g");  strcpy(s8,"h");
mySourceNuDialog.setTextsIntoEdits(s1,s2,s3,s4,s5,s6,s7,s8);
mySourceNuDialog.DoModal();


И в отладчике внутри функции setTextsIntoEdits на первой же строке
m_IDC_EDIT1.SetWindowTextA(s1);

программа бьётся с сообщением об ошибке:

Debug Assertion Failed!
Program: C:\Windows\system32\mfc110d.dll
File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\winocc.cpp
Line: 246


Что это означает? Как исправить эту ошибку?
1613 г. = 2024 г.
Re: Проблема с выводом текста в текстовые поля диалога
От: flаt  
Дата: 28.11.16 09:17
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>В вызывающей функции я пишу:


RF>strcpy(s1,"a"); strcpy(s2,"b"); strcpy(s3,"c"); strcpy(s4,"d"); strcpy(s5,"e"); strcpy(s6,"f"); strcpy(s7,"g"); strcpy(s8,"h");


Что такое s1? Скорее всего, это просто char* s1;, что и ведёт к краху.

Исправь на

CString s1 = "a", s2 = "b" ...
mySourceNuDialog.setTextsIntoEdits(s1, s2 ...);


А ещё лучше в параметрах тоже заменить char* s1 на const CString& s1.

ЗЫ: Впрочем, даже если там CString, всё равно в него нельзя писать через strcpy, только через

CString s1;
strcpy(s1.GetBuffer(strlen("a")), "a");

, но зачем?
Re: Проблема с выводом текста в текстовые поля диалога
От: kov_serg Россия  
Дата: 29.11.16 09:04
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Я работаю в Visual C++ 2012.


RF>Что это означает? Как исправить эту ошибку?


https://msdn.microsoft.com/ru-ru/library/fwz35s59.aspx

CDialog::OnInitDialog() — не забыл?
Re[2]: Проблема с выводом текста в текстовые поля диалога
От: VladFein США  
Дата: 16.12.16 19:02
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>CDialog::OnInitDialog() — не забыл?


Даже если и не забыл — InitDialog() будет вызван ПОСЛЕ DoMadal()!
Re: Проблема с выводом текста в текстовые поля диалога
От: VladFein США  
Дата: 16.12.16 19:06
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>
RF>CSourceNuDialog  mySourceNuDialog(this);

RF>strcpy(s1,"a");  strcpy(s2,"b");  strcpy(s3,"c");  strcpy(s4,"d");  strcpy(s5,"e");  strcpy(s6,"f");  strcpy(s7,"g");  strcpy(s8,"h");
RF>mySourceNuDialog.setTextsIntoEdits(s1,s2,s3,s4,s5,s6,s7,s8);
RF>mySourceNuDialog.DoModal();
RF>


До вызова mySourceNuDialog.DoModal(); никакие m_IDC_EDITX не существуют.
Стандартное решение — держать массив строк в диалоге, инициировать его, потом DoModal(); и в OnInitDialog() заполнить контролы. ПОСЛЕ CDialogEx::OnInitDialog();!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.