проблема с Edit Control

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

Delfin

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

Проблема в следующем:
На 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 и передачи ему нового значения.
 
04.09.2006
2 566
3
#2
Ваш код не содержит ошибок, скорее всего проблема в чем-то другом
 
D

Dimmuborgir

#3
Поддерживаю 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

#4
Если создавать 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, СПАСИБО!!!
 
04.09.2006
2 566
3
#5
Если создавать Edit Control через Edit1.Create(), то ниже представленный код работает без ошибок.
...
Ну, а если просто Edit Control кинуть на форму даолога и затем так же приписать его ID переменную str_edit, то вылезает ошибка.
Ну так и должно быть, ведь это не Delphi. Вы пытаетесь обратится к объекту, который еще не создан. Это и вызывает ошибку
 
D

Dimmuborgir

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

Delfin

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

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

Delfin

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

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

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

Delfin

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

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

Вложения

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