• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

проблема с Edit Control

  • Автор темы Delfin
  • Дата начала
D

Delfin

Здравствуйте!!!

Проблема в следующем:
На DialogBar я разместил Edit Control. В методе DoDataExchange пытаюсь связать его с переменной типа CString str_edit2.

Код:
void CMainFrame::DoDataExchange(CDataExchange* pDX)
{
// TODO: Add your specialized code here and/or call the base class
CFrameWnd::DoDataExchange(pDX);

DDX_Text(pDX, IDC_EDIT2, str_edit2);
}

Но, при вызове UpdateData вылезает ошибка (File: Dlgdata.cpp Line:44).

Объясните пожалуйста, как приписать переменную к Edit Control в которой хранится его значение.
Можете подсказать другой способ получения значения из Edit и передачи ему нового значения.
 
E

European

Ваш код не содержит ошибок, скорее всего проблема в чем-то другом
 
D

Dimmuborgir

Поддерживаю European. Еще один способ работать с Edit контролом, как впринципе и с любым другим, унаследованным от CWnd (тип главное указать):

Код:
CString str_in;
CString str_out="запись";

CEdit* pEdit=(CEdit*)GetDlgItem(IDC_EDIT1);
pEdit->GetWindowText(str_in);
pEdit->SetWindowText(&str_out);
 
D

Delfin

Если создавать Edit Control через Edit1.Create(), то ниже представленный код работает без ошибок.

[codebox]int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
.......................................
.......................................
m_myBar.Create(this, IDD_DIALOGBAR, CBRS_LEFT, IDD_DIALOGBAR);

edit1.Create(WS_CHILD | WS_VISIBLE | WS_BORDER, CRect (100,40,270,70), this, IDC_EDIT2);

return 0;
}

void CMainFrame::DoDataExchange(CDataExchange* pDX)
{
// TODO: Add your specialized code here and/or call the base class
DDX_Text(pDX, IDC_EDIT2, str_edit2);
}
[/codebox]
Ну, а если просто Edit Control кинуть на форму даолога и затем так же приписать его ID переменную str_edit, то вылезает ошибка.

За SetWindowText и GetWindowText, СПАСИБО!!!
 
E

European

Если создавать Edit Control через Edit1.Create(), то ниже представленный код работает без ошибок.
...
Ну, а если просто Edit Control кинуть на форму даолога и затем так же приписать его ID переменную str_edit, то вылезает ошибка.
Ну так и должно быть, ведь это не Delphi. Вы пытаетесь обратится к объекту, который еще не создан. Это и вызывает ошибку
 
D

Dimmuborgir

я тока одного не могу понять, Делфин, ты Едит контрол рисуешь на диалоге или пытаешься его где то во вьюшке нарисовать? При чем тут Диалог и манфрейм??? Если на диалог кинуть Едит контрол, то никаких Create вызывать не надо. все будет работать.
 
D

Delfin

Ну так и должно быть, ведь это не Delphi. Вы пытаетесь обратится к объекту, который еще не создан. Это и вызывает ошибку
Как это объект не создан???
Во первых, он отображается на DialogBar.
Во вторых, я с ним свободно обмениваюсь сообщениями через SetWindowText и GetWindowText.

я тока одного не могу понять, Делфин, ты Едит контрол рисуешь на диалоге или пытаешься его где то во вьюшке нарисовать? При чем тут Диалог и манфрейм??? Если на диалог кинуть Едит контрол, то никаких Create вызывать не надо. все будет работать.
Я пытаюсь вставить(вернее уже вставил) Edit на DialogBar.
Что такое DialogBar, смотри тут
DialogBar, как ToolBar и StatusBar создается в методе int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct).
 
D

Dimmuborgir

Я пытаюсь вставить(вернее уже вставил) Edit на DialogBar.
Что такое DialogBar, смотри тут
DialogBar, как ToolBar и StatusBar создается в методе int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct).
Перепутал с обычным диалогом. )
 
E

European

Как это объект не создан???
Во первых, он отображается на DialogBar.
Во вторых, я с ним свободно обмениваюсь сообщениями через SetWindowText и GetWindowText.
Ошибка в 17 строке... Одно гадание на кофейной гуще
 
D

Delfin

Ошибка в 17 строке... Одно гадание на кофейной гуще
Не в 17, а в 44 строке (если речь идет об одном и том же).

И ошибка вылезает, когда я в методе void CMainFrame::DoDataExchange(CDataExchange* pDX) приписываю идентификатору IDC_EDIT2 переменную str_edit2 ( DDX_Text(pDX, IDC_EDIT2, str_edit2); ), а затем вызываю UpdateData.
Т.е. ошибка вылазиет не во время компиляции, а во время работы программы, когда вызывается UpdateData.

Если же задавть и получать значение Edit через SetWindowText и GetWindiwText, то все работает хорошо.
 
E

European

Прикрепите минимальный проект, отражающий проблему
 
D

Delfin

Вот, смотрите.

При нажатии на кнопку вылезает ошибка.
 

Вложения

  • DlBar.rar
    54,8 КБ · Просмотры: 120
E

European

Механизм DDX в MFC предназначен для обмена информацией между окном и его элементами управления. Вы же пытаетесь связать элемент управления Edit, прbнадлежащий CDialogBar, с другим окном (CMainFrame). Из-за этого и валится исключение из нутрей MFC. Код из поста #4 работает, т.к. Вы создаете Edit непосредственно на MainFrame в обход DialogBar. Правильным решением будет написать наследника CDialogBar, у которого перегрузить DoDataExchange
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!