Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

нифига не понял по Ddx (передача данных)

289
29 апреля 2005 года
Jeyson
207 / / 20.04.2000
Здравствуйте. Пишу программу с использованием MFC (документ-вид). Надо выводить сообщение в Edit по клику мыши. Edit создан на диалоговом окне, которое причаливается к главному окну и постоянно видимо.
Создан класс диалогового окна. Описание функций класса следующее:
void DlgINFO::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_edit);
}

void DlgINFO::SetEditStr(CString csEdit)
{
m_edit=csEdit;
}
CString DlgINFO::GetEditStr()
{
return m_edit;
}

Описание на клик мыши (в модуле View.cpp):
DlgINFO dlg;
dlg.SetEditStr("Hello DDX");
dlg.GetEditStr();
Так вот функция
void DlgINFO::DoDataExchange(CDataExchange* pDX)
вообще не срабатывает.
Спасибо.
488
29 апреля 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Jeyson
void DlgINFO::DoDataExchange(CDataExchange* pDX)
вообще не срабатывает.
Спасибо.

Сперва нужно вызвать ф-ю
UpdateData(TRUE); // Чтение в m_edit
или
UpdateData(FALSE); // Вывод m_edit в CEdit

289
30 апреля 2005 года
Jeyson
207 / / 20.04.2000
Цитата:
Originally posted by Mоngооsе
Сперва нужно вызвать ф-ю
UpdateData(TRUE); // Чтение в m_edit
или
UpdateData(FALSE); // Вывод m_edit в CEdit


Куда надо вставить этот код. Нельзя ли по подробнее. Я пробовал на клик мыши эти функции поставить - результат: никакого результата. Не получилось короче... Но все равно спасибо.

488
30 апреля 2005 года
Mоngооsе
465 / / 01.04.2005
Код:
void DlgINFO:oDataExchange(CDataExchange* pDX)
{
  CDialog:oDataExchange(pDX);
  DDX_Text(pDX, IDC_EDIT1, m_edit);
}

void DlgINFO::SetEditStr(CString csEdit)
{
  m_edit=csEdit;
  Update(FALSE);
}
CString DlgINFO::GetEditStr()
{
  Update(TRUE);
  return m_edit;
}
289
03 мая 2005 года
Jeyson
207 / / 20.04.2000
Цитата:
Originally posted by Mоngооsе
Код:
void DlgINFO:oDataExchange(CDataExchange* pDX)
{
  CDialog:oDataExchange(pDX);
  DDX_Text(pDX, IDC_EDIT1, m_edit);
}

void DlgINFO::SetEditStr(CString csEdit)
{
  m_edit=csEdit;
  Update(FALSE);
}
CString DlgINFO::GetEditStr()
{
  Update(TRUE);
  return m_edit;
}



Наверное не Update(...), а UpdateData(...). При этом все компилиться и запускается, но при вызове данных функций программа предлагает завершить приложение, что делать?

289
04 мая 2005 года
Jeyson
207 / / 20.04.2000
Цитата:
Originally posted by Jeyson
Наверное не Update(...), а UpdateData(...). При этом все компилиться и запускается, но при вызове данных функций программа предлагает завершить приложение, что делать?



Так никто и не ответил. Ну ведь у кого-то должны быть предположения. Мое диалоговое окно причалено к главному в виде объекта DialogBar. Может в этом проблема. И еще как мне кажется ошибка возникает из-за того, что нужно окно сделать модальным, но если его сделать таковым, то все приложение становиться не доступным и приходится закрывать его через диспетчер задач.

425
04 мая 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by Jeyson
Так никто и не ответил. Ну ведь у кого-то должны быть предположения. Мое диалоговое окно причалено к главному в виде объекта DialogBar. Может в этом проблема. И еще как мне кажется ошибка возникает из-за того, что нужно окно сделать модальным, но если его сделать таковым, то все приложение становиться не доступным и приходится закрывать его через диспетчер задач.


Попробую ответить.

1. Очевидно, Update() — опечатка. Должно быть UpdateData().

2. Модальное окно в вашей задаче — плохая идея. На то оно и модальное, чтобы все функции приложения ждали его завершения. Делайте немодальное. Однако, к вашему первоначальному вопросу это отношения не имеет.

488
04 мая 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Jeyson
Так никто и не ответил. Ну ведь у кого-то должны быть предположения. Мое диалоговое окно причалено к главному в виде объекта DialogBar. Может в этом проблема. И еще как мне кажется ошибка возникает из-за того, что нужно окно сделать модальным, но если его сделать таковым, то все приложение становиться не доступным и приходится закрывать его через диспетчер задач.

На твой вопрос ответили. Даже вместе с кодом. Конечно нужно UpdateData(). И можешь делать окно модальным, немодальным, это в данном случае никакой роли не играет. Тебе всего навсего в свой код нужно перекопировать 2, повторяю 2 команды.

289
04 мая 2005 года
Jeyson
207 / / 20.04.2000
Цитата:
Originally posted by Mоngооsе
На твой вопрос ответили. Даже вместе с кодом. Конечно нужно UpdateData(). И можешь делать окно модальным, немодальным, это в данном случае никакой роли не играет. Тебе всего навсего в свой код нужно перекопировать 2, повторяю 2 команды.



Это я все понял. Спасибо за ответы. Но вопрос был еще другой: После копирования один в один UpdateData(...) программа при вызове данных функций обглючивается и предлагает либо отладку либо завершение. Пишет:
Debug Assertion Failed!
File: wincore.cpp
Line: 3095
Прервать Повтор Пропустить
Все Includы прописаны. Че ему еще надо?
Только этого я понять не могу.

425
04 мая 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by Jeyson
Это я все понял. Спасибо за ответы. Но вопрос был еще другой: После копирования один в один UpdateData(...) программа при вызове данных функций обглючивается и предлагает либо отладку либо завершение. Пишет:
Debug Assertion Failed!
File: wincore.cpp
Line: 3095
Прервать Повтор Пропустить
Все Includы прописаны. Че ему еще надо?
Только этого я понять не могу.


Жмите "Повтор" и начинайте лазить по стеку, проверять значения переменных и т.д., чтобы выяснить причину ошибки...

Параллельно читайте про DialogBar. Может быть, поймёте, что ему ещё надо.

488
04 мая 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by Jeyson
Это я все понял. Спасибо за ответы. Но вопрос был еще другой: После копирования один в один UpdateData(...) программа при вызове данных функций обглючивается и предлагает либо отладку либо завершение. Пишет:
Debug Assertion Failed!
File: wincore.cpp
Line: 3095
Прервать Повтор Пропустить
Все Includы прописаны. Че ему еще надо?
Только этого я понять не могу.

Ты вызываешь UpdateData ПЕРЕД DoModal(). DoModal() сама вызовет UpdateData(FALSE).

289
06 мая 2005 года
Jeyson
207 / / 20.04.2000
Цитата:
Originally posted by Mоngооsе
Ты вызываешь UpdateData ПЕРЕД DoModal(). DoModal() сама вызовет UpdateData(FALSE).



Там DoModal, я вообще не использую. Я исходник выкладываю. Если не трудно взгляните плз... Думаю, что ошибка где-то на поверхности.

488
06 мая 2005 года
Mоngооsе
465 / / 01.04.2005
Проект открыть в VS6, не можно, trace.dsw пуст. Но массив n_Par нигде не инициализирован. В CMainFrame::Create нужно бы его обнулить.
289
07 мая 2005 года
Jeyson
207 / / 20.04.2000
Цитата:
Originally posted by Mоngооsе
Проект открыть в VS6, не можно, trace.dsw пуст. Но массив n_Par нигде не инициализирован. В CMainFrame::Create нужно бы его обнулить.


странно, у меня все открывается. Но float m_Par[9] объявлен в MainFrm.cpp. Это никак не относится к моему вопросу (я так думаю). Блин... что делать. Может надо переопределить метод Create для диалога, таким образом, чтобы он создавался именно немодальным? Если да, то какой код будет в переопределении?
При вызове функции в отладке прога вываливается на строку
ASSERT(::IsWindow(m_hWnd)); // calling UpdateData before DoModal?
которая находится в описании функции
BOOL CWnd::UpdateData(BOOL bSaveAndValidate)
в файле wincore.cpp
что делать?

425
11 мая 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by Jeyson
странно, у меня все открывается...

Мой VS.NET тоже не может открыть ваш проект. Пишет "file corrupted". Прицепите файл снова.

Кстати, *.aps, *.ncb, *.plg посылать не надо. Они не только место занимают, но даже и мешают иногда (редко) при переносе проекта с места на место. В большинстве случаев *.opt тоже не нужен.

289
12 мая 2005 года
Jeyson
207 / / 20.04.2000
Цитата:
Originally posted by sq_deep
Мой VS.NET тоже не может открыть ваш проект. Пишет "file corrupted". Прицепите файл снова.

Кстати, *.aps, *.ncb, *.plg посылать не надо. Они не только место занимают, но даже и мешают иногда (редко) при переносе проекта с места на место. В большинстве случаев *.opt тоже не нужен.


Спасибо за проявленный интерес к моему вопросу.
Я пока так ничего и не понял. У меня стоит Visual C++ 6.0 c Updat`ом и руссификатором. Может можно просто в другом редакторе (хоть в фаре) посмотреть исходник. Это процедура левого клика мышкой в файле TraceView.cpp. Файл прикрепил еще раз с учетом Ваших замечаний.Спасибо.

488
12 мая 2005 года
Mоngооsе
465 / / 01.04.2005
Проект не открывается.

DlgInfo dlg;
dlg.SetEditStr("Hello DDX");
dlg.GetEditStr();

Вместо того, что выше нужно

DlgInfo dlg;
dlg.m_edit = "Hello DDX";
dlg.DoModal();
AfxMessageBox(dlg.m_edit);

И конечно мелочи жизни, (не моя прога), но массив m_par должен быть проинициализирован.
289
13 мая 2005 года
Jeyson
207 / / 20.04.2000
Цитата:
Originally posted by Mоngооsе
Проект не открывается.

DlgInfo dlg;
dlg.SetEditStr("Hello DDX");
dlg.GetEditStr();

Вместо того, что выше нужно

DlgInfo dlg;
dlg.m_edit = "Hello DDX";
dlg.DoModal();
AfxMessageBox(dlg.m_edit);

И конечно мелочи жизни, (не моя прога), но массив m_par должен быть проинициализирован.



Блин, почти работает. Единственное что все становиться модальным и недоступным приходится прогу выключать через диспетчера задач.
А также создается еще одно модальное окно, которое появляется в левом верхнем углу в котором все прописано как надо. Как теперь с этим бороться?

425
14 мая 2005 года
sq_deep
498 / / 18.02.2005
Jeyson, ваш проект действительно не открывается. Я попробовал включить его файлы в свой проект, но там, оказывается используется OpenGL, а у меня его нет. Короче, я потратил кучу времени...

Однако, я готов потратить ещё немного, если вы локализуете свою проблему. Если трудность с DoDataExchange(), то создайте стандартный проект MFC и поместите туда свой диалог, выкинув всё лишнее. Тогда и проект откроется. Опишите, что не нравится. Вот тогда и посмотрим.
289
23 мая 2005 года
Jeyson
207 / / 20.04.2000
Цитата:
Originally posted by sq_deep

Однако, я готов потратить ещё немного, если вы локализуете свою проблему. Если трудность с DoDataExchange(), то создайте стандартный проект MFC и поместите туда свой диалог, выкинув всё лишнее. Тогда и проект откроется. Опишите, что не нравится. Вот тогда и посмотрим.



Здравствуйте, прошу прощения, что так долго не отвечал, не было время. Сейчас я сделал простенький проект. При нажатии мышкой на поле, должна выводиться строка в Edit, который расположен на причаливаемом диалоговом окне. UpdateData() не помогает. Ошибка сохраняется. Может быть надо как-то связать диалоговое окно с классом окна? Я запутался. Спасибо.

488
23 мая 2005 года
Mоngооsе
465 / / 01.04.2005
Нужно написать в начало trace2view.cpp
#include "mainfrm.h"
и
 
Код:
void CTrace2View::OnLButtonDown(UINT nFlags, CPoint point)
{
  CTrace2App *pApp = (CTrace2App *)AfxGetApp();
  CMainFrame *pMainFrame = (CMainFrame *)pApp->m_pMainWnd;
  CWnd * pWnd = pMainFrame->m_wBar.GetDlgItem(IDC_EDIT1);
  pWnd->SetWindowText("Hello!");
  CView::OnLButtonDown(nFlags, point);
}

Чтоб прочитать, что введено в CEdit, нужен код типа
 
Код:
CTrace2App *pApp = (CTrace2App *)AfxGetApp();
  CMainFrame *pMainFrame = (CMainFrame *)pApp->m_pMainWnd;
  CWnd * pWnd = pMainFrame->m_wBar.GetDlgItem(IDC_EDIT1);
  CString str;
  pWnd->GetWindowText(str);
  AfxMessageBox(str);


Мимоходом, проект все еще не открывается.
289
24 мая 2005 года
Jeyson
207 / / 20.04.2000
Цитата:
Originally posted by Mоngооsе


Мимоходом, проект все еще не открывается.


Спасибо, огромное. Мне еще учиться и учиться. Все заработало!

14K
21 ноября 2005 года
klingon
3 / / 21.11.2005
Прошу прощения за ламерский вопрос.
Хочу считать значение CString из поля ввода(EditBox) в переменную, которая с ним связана. Применяю функцию UpdateData(), далее пытаюсь вывести значение переменной с помощью ф-ии AfxMessageBox. В ходе выполнения программы никаких ошибок не происходит, однако MessageBox выводит пустую строку.
Помогите, пожалуйста, я не понимаю почему так происходит!
работаю в Visual Studio .net 2003
425
22 ноября 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by klingon
...UpdateData...AfxMessageBox...Visual Studio .net...


Вроде правильно всё пишете. Может быть, дело тут вовсе не в UpdateData? Попробуйте вывести тестовую строку с помощью AfxMessageBox. Не покажет ли он такую же пустоту?

Дело в том, что у меня дважды была смешная проблема. Под VS.NET мои диалоги работали правильно, а вот любые mbox'ы выдавали окна с пустым текстом. Я даже обращался с этим вопросом в разные форумы.

Может быть, у вас та же ерунда?

14K
22 ноября 2005 года
klingon
3 / / 21.11.2005
Пытался выводить тестовую строку этой же функцией. Той же переменной(связанной с EditBox) присвоил строку. Все выводит нормально, но с UpdateData работать отказывается(при этом не выводит никаких ошибок - вообще)! :(
Если есть хоть какие-то предложения, пожалуйста, ответьте.
425
23 ноября 2005 года
sq_deep
498 / / 18.02.2005
[SIZE=3][COLOR=blue]Коллеги, помогите klingonу![/COLOR][/SIZE]

Чувствую, там совсем простая проблема. Сам бы помог с удовольствием, но в связи с переменами в жизни у меня теперь нет ничего, кроме VBA и informix 4GL.

klingon, прицепите свой проект. На этом форуме всегда помогают. Раньше так было, по крайней мере. Надеюсь, что и сейчас ещё традиции живы.

[COLOR=blue]PS. Пролистал последние сообщения, нашёл знакомые имена людей, которых уважаю. Перечислять не буду, чтобы случайно кого-нибудь не забыть.

Всем желаю удачи.[/COLOR]
14K
23 ноября 2005 года
klingon
3 / / 21.11.2005
Все, проблема решилась. :}
Честно говоря, такого я не ожидал.
Начал копаться в ф-ях, вызываемых UpdateData и обнаружил, что часть ф-ии создания WndCtrl и присвоения ему значения просто отсутствует(не хватало двух строк кода).
Короче, хотел разобраться в MFC, а пришлось выискивать ошибки в библиотеке MFC.:devil:

PS Большое спасибо sq_deep за участие и поддержку:) :) :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог