проблема с Edit Control

Тема в разделе "MS Visual C++", создана пользователем Delfin, 21 мар 2008.

  1. Delfin

    Delfin Гость

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

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

    Код (Text):
    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 и передачи ему нового значения.
     
  2. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Ваш код не содержит ошибок, скорее всего проблема в чем-то другом
     
  3. Dimmuborgir

    Dimmuborgir Гость

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

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

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

    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, СПАСИБО!!!
     
  5. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Ну так и должно быть, ведь это не Delphi. Вы пытаетесь обратится к объекту, который еще не создан. Это и вызывает ошибку
     
  6. Dimmuborgir

    Dimmuborgir Гость

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

    Delfin Гость

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

    Я пытаюсь вставить(вернее уже вставил) Edit на DialogBar.
    Что такое DialogBar, смотри тут http://doc.mpv.ru/steps/mfc/steps/250.html
    DialogBar, как ToolBar и StatusBar создается в методе int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct).
     
  8. Dimmuborgir

    Dimmuborgir Гость

    Перепутал с обычным диалогом. )
     
  9. European

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Ошибка в 17 строке... Одно гадание на кофейной гуще
     
  10. Delfin

    Delfin Гость

    Не в 17, а в 44 строке (если речь идет об одном и том же).

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

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

    Регистрация:
    4 сен 2006
    Сообщения:
    2.580
    Симпатии:
    0
    Прикрепите минимальный проект, отражающий проблему
     
  12. Delfin

    Delfin Гость

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

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

    Вложения:

    • DlBar.rar
      Размер файла:
      54,8 КБ
      Просмотров:
      17
  13. European

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

    Delfin Гость

    ок, СПАСИБО !!!
     
Загрузка...

Поделиться этой страницей