Ddx
запустил модальное окно
в нем есть Edit, 3 CheckBoxa, кнопки ОК, Cancel
добавил событие
//{{AFX_MSG_MAP(CSelDlg)
// No message handlers
//}}AFX_MSG_MAP
ON_COMMAND(IDOK,ButOK)
END_MESSAGE_MAP()
(тоесть вызов функции ButOK по нажатию)
{
//CDataExchange* pDX;
//CSelDlg::DoDataExchange(pDX);
SetEditStr("Woohoo1!!!!!");
if (m_Check1.GetCheck()==1) SetEditStr("Woohoo");//
if (m_Check2.GetCheck()==1) SetEditStr("Woohoo2");//
if (m_Check3.GetCheck()==1) SetEditStr("Woohoo3");//
//CSelDlg::DoDataExchange(pDX);
}
функция вызывается но ничего не происходит (строка Edit не изменяется) думаю это из-за того что нужно здесь вызвать функцию DDX, но при вызове прога вылетает, может быть я что-то не так делаю ...
///////
а вот и сам DDX
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_edit);// ??? ?????
DDX_Control(pDX, IDC_CHECK1, m_Check1);// c ??????????????
DDX_Control(pDX, IDC_CHECK2, m_Check2);// c ??????????????
DDX_Control(pDX, IDC_CHECK3, m_Check3);// c ??????????????
//{{AFX_DATA_MAP(CSelDlg)
//}}AFX_DATA_MAP
}
//p.s. получилось несколько объемно :( если что не понятно спрашивайте
CWnd::UpdateData(FALSE) тебе поможет :)
и чем мне это поможет
и куда мне ее писать?
я написал в ButOK
UpdateWindow(FALSE) и UpdateWindow(0)
пишет function does not take 1 parametr.....
и чем мне это поможет
и куда мне ее писать?
я написал в ButOK
UpdateWindow(FALSE) и UpdateWindow(0)
пишет function does not take 1 parametr.....
Тебе надо обновить edit.
И еще, что за функция SetEditStr. И какой тип у m_edit;
и чем мне это поможет
и куда мне ее писать?
я написал в ButOK
UpdateWindow(FALSE) и UpdateWindow(0)
пишет function does not take 1 parametr.....
Ну для начала, нужно научится читать :)
UpdateData(FALSE), а не UpdateWindow
Тебе надо обновить edit.
И еще, что за функция SetEditStr. И какой тип у m_edit;
Я бы так не делал :)
Я бы так не делал :)
void CSelDlg::SetEditStr(CString csEdit)
{
m_edit=csEdit;
}
class CSelDlg : public CDialog
{
public:
CSelDlg(); // standard constructor
void SetEditStr(CString csEdit);// ?????????? ??????
CString GetEditStr();// ???????? ??????
void ButOK();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_SELECT};
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSelDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
CString m_edit;// ??????
CButton m_Check1;// ??? ?????????????
CButton m_Check2;// ??? ?????????????
CButton m_Check3;// ??? ?????????????
//{{AFX_MSG(CSelDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
----------------
UpdateData не функция m_edit
Я бы так не делал :)
А как бы ты делал?
void CSelDlg::SetEditStr(CString csEdit)
{
m_edit=csEdit;
}
Оригинально. Учти, что в VC 7 , по умолчанию нельзя создать тип переменной CString, там можно создавать переменные только Control типа, в данном случае CEdit m_edit, тогда, что бы поместить текст в EDIT достаточно написать
и не надо заботиться об обновлении данных.
UpdateData не функция m_edit
UpdateData функция класса CWnd. Из-за этого я и спросил какого типа переменная m_edit.
Оригинально. Учти, что в VC 7 , по умолчанию нельзя создать тип переменной CString, там можно создавать переменные только Control типа
Что за бред? Поясни плиз....
, в данном случае CEdit m_edit, тогда, что бы поместить текст в EDIT достаточно написать
и не надо заботиться об обновлении данных.
Впринципе верно, но зачастую использовать DDX удобнее... В данном случае необходимо вызывать UpdateData именно у окна, а не котрола! После этого автоматически произойдет вызов функции
DoDataExchange и в зависимости от параметра SaveAndValidate либо запишет значение переменной m_edit в контрол, либо считает его из контрола и запишет в m_edit...
Что за бред? Поясни плиз....
В VC 7 нельзя с помощью мастера объявить переменную для edita, кроме как Control, в VC 6 можно было обявлять несколько типов переменных для каждого контрола. Для того же edita это мог быть как CString, так и int.
Впринципе верно, но зачастую использовать DDX удобнее...
А кто тебе сказал, что в данном случае не используется DDX???
В данном случае необходимо вызывать UpdateData именно у окна, а не котрола! После этого автоматически произойдет вызов функции
DoDataExchange и в зависимости от параметра SaveAndValidate либо запишет значение переменной m_edit в контрол, либо считает его из контрола и запишет в m_edit...
И зачем весь этот гемор с UpdateData(TRUE/FALSE)?
Что за бред? Поясни плиз....
Впринципе верно, но зачастую использовать DDX удобнее... В данном случае необходимо вызывать UpdateData именно у окна, а не котрола! После этого автоматически произойдет вызов функции
DoDataExchange и в зависимости от параметра SaveAndValidate либо запишет значение переменной m_edit в контрол, либо считает его из контрола и запишет в m_edit...
я пишу в VC++ 6.0
SetWindowText нуту такого у CString
..........
млин хелп.........!
как где что вызвать чтоб заработало?
я пишу в VC++ 6.0
SetWindowText нуту такого у CString
..........
млин хелп.........!
как где что вызвать чтоб заработало?
SetWindowText Это функция класса CWnd!!! Из названия же ясно - УстановитьТекстВОкно. Неужели нельзя посмотреть в MSDN. Он же не для понта создан
В VC 7 нельзя с помощью мастера объявить переменную для edita, кроме как Control, в VC 6 можно было обявлять несколько типов переменных для каждого контрола. Для того же edita это мог быть как CString, так и int.
Аа... так Вы только мастером умеете пользоваться... ну тогда все ясно.... :)
А кто тебе сказал, что в данном случае не используется DDX???
Так что, если я объявлю переменную m_edit типа CEdit и сделаю вызов SetWindowText, то каким-то образом попаду в функцию DoDataExchange? Что-то сомневаюсь... :)
И зачем весь этот гемор с UpdateData(TRUE/FALSE)?
Не понятно в чем гемор? Наоборот гемора меньше... (ну может конечно совсем чуть-чуть :) )
я пишу в VC++ 6.0
SetWindowText нуту такого у CString
..........
млин хелп.........!
как где что вызвать чтоб заработало?
Издеваешься?
Просто вызвать UpdateData(FALSE) и все, больше ничего не менять!
В VC 7 нельзя с помощью мастера объявить переменную для edita, кроме как Control, в VC 6 можно было обявлять несколько типов переменных для каждого контрола. Для того же edita это мог быть как CString, так и int.
А кто тебе сказал, что в данном случае не используется DDX???
И зачем весь этот гемор с UpdateData(TRUE/FALSE)?
Как это нельзя переменные типа Value создавать? Всё можно. Создаём переменную Wizzard'ом и не паримся...
Аа... так Вы только мастером умеете пользоваться... ну тогда все ясно.... :)
А вообще то за то чтобы использовать только один тип переменных для одного объекта, а не кучу, чтобы сделать конкретное действие, чтобы занести число - int, текст - CString, как то изменить Control - CEdit. Место этого я использую всего одну переменную типа Control CEdit и могу проделать все эти действия используя только одну переменную!!!
Так что, если я объявлю переменную m_edit типа CEdit и сделаю вызов SetWindowText, то каким-то образом попаду в функцию DoDataExchange? Что-то сомневаюсь... :)
А как ты попадешь в DoDataExchange используя UpdateData()?
Не понятно в чем гемор? Наоборот гемора меньше... (ну может конечно совсем чуть-чуть :) )
А в том, что забыл я поставить UpdateData(FALSE) и нет у меня данных в окошке или , что еще хуже место FALSE написал TRUE.
А в том, что забыл я поставить UpdateData(FALSE) и нет у меня данных в окошке или , что еще хуже место FALSE написал TRUE.
Нуу.... Вам надо еще учиться и учиться... :)
Допустим ситуация: диалог изменения пароля...
Выводим диалог на экран, ну скажем:
CPassDlg dlg;
dlg.ShowModal();
Пользователь ввел новый пароль и нажал ОК диалог при закрытии автоматически вызывает UpdateData(TRUE)...
Далее я могу спокойно уже у закрытого диалога вызывать скажем
dlg.GetPass()
В Вашем случае функция GetPass() будет вызывать GetWindowText() у уже убитого окна и я думаю, что ни к чему хорошему это не приведет.... :)
А как ты попадешь в DoDataExchange используя UpdateData()?
Поверь, попаду... можешь поставить брякпоинт если не веришь :D
А в том, что забыл я поставить UpdateData(FALSE) и нет у меня данных в окошке или , что еще хуже место FALSE написал TRUE.
Ну, знаешь ли, это равносильно тому, что я скажу так: Забыл я SetWindowText() написать, и нету у меня текста на кнопке... Естественно, что если ты что-то забыл, то ошибки одна за одной полезут. Но это же везде так, и не только в программировании...
Нуу.... Вам надо еще учиться и учиться... :)
Я тебе просто привел пример
Допустим ситуация: диалог изменения пароля...
Выводим диалог на экран, ну скажем:
CPassDlg dlg;
dlg.ShowModal();
Пользователь ввел новый пароль и нажал ОК диалог при закрытии автоматически вызывает UpdateData(TRUE)...
Далее я могу спокойно уже у закрытого диалога вызывать скажем
dlg.GetPass()
В Вашем случае функция GetPass() будет вызывать GetWindowText() у уже убитого окна и я думаю, что ни к чему хорошему это не приведет.... :)
Наверное, единственный пример удобного использования не Control переменных, в пределах одного класса это для меня не удобно. И я никогда не буду вызывать GetWindowText для убитого окна, а сохраню нужную переменную и буду использовать её по своему усмотрению.
Поверь, попаду... можешь поставить брякпоинт если не веришь :D
Я в этом и не сомневаюсь
Ну, знаешь ли, это равносильно тому, что я скажу так: Забыл я SetWindowText() написать, и нету у меня текста на кнопке... Естественно, что если ты что-то забыл, то ошибки одна за одной полезут. Но это же везде так, и не только в программировании...
Это видно если хоть раз сталкивался с такой проблемой. А теперь представь себе: разбираешься в чужом коде, m_edit переменная типа int и принимает два значения 0 или 1 и у тебя код:
...
else
...
По идее ты заносишь в Edit 1 или 0 и получаешь результат, а тебя m_edit всегда 0, откуда знать, что данные еще надо обновить???
Короче, я вот хотел что сказать
Set(Get)WindowText намного нагляднее чем UpdateData(TRUE/FALSE)
И я никогда не буду вызывать GetWindowText для убитого окна, а сохраню нужную переменную и буду использовать её по своему усмотрению.
Т.е. ты будешь при закрытии окна специально (лишний раз) вызывать GetWindowText(), сохранять ее в (лишнюю) переменную...
С такими подходами необходимо бороться, дабы повышать культуру программирования!
Т.е. ты будешь при закрытии окна специально (лишний раз) вызывать GetWindowText(), сохранять ее в (лишнюю) переменную...
А ты настолько часто передаешь переменные из одного класса в другой? Посчитай сколько раз ты вызываешь UpdateData() внутри своего класса для обработки данных
С такими подходами необходимо бороться, дабы повышать культуру программирования!
А ты еще книжку об этом напиши.
Это значит что GetWindowText придумали неКультурные программисты, что бы ты потом мог упрекать всех кто использует эти функции???
пасибо обоим за помощь, в вашем споре узнал много интересного
По-моему кто-то страдает херней. DoDataExchange автоматом вызывается при обработке кнопки IDOK. Не нужно никаких сообщений и переопределений. Просто напиши тело DoDataExchange.
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_edit);
DDX_Control(pDX, IDC_CHECK1, m_Check1);
DDX_Control(pDX, IDC_CHECK2, m_Check2);
DDX_Control(pDX, IDC_CHECK3, m_Check3);
}
А если уж тебя посетила гениальная мысль переопределить обработчик IDOK, то будь добр вызови
CDialog::OnOk();
И усееееееееее. ;)
но
у нас есть строка Edit(IDC_EDIT1)
[тоесть когда я ручками вписываю значение в IDC_EDIT а потом жму ОК, чтоб обработать в m_edit ничего не передается, хотя там использую функцию UpdateData(False) для вызова DDX....
]
и ее значение никак не хочет передаваться в CString m_edit
UpdateData(False) не помогает....
что я делаю не так?
как занести значение с эдитбокса в перменную o_O
честно говоря я думал что
DDX_Text(pDX, IDC_EDIT1, m_edit);
как раз и отвественно за этот обмен
UpdateData(FALSE);
SetEditStr(GetEditStr());
результат работы клавиши ОК , пустая строка
и через дебагер смотрел значение m_edit после UpdateData такая m_edit="" :(
хм......бред какой-то все что сказали сделал, все получилось
но
у нас есть строка Edit(IDC_EDIT1)
[тоесть когда я ручками вписываю значение в IDC_EDIT а потом жму ОК, чтоб обработать в m_edit ничего не передается, хотя там использую функцию UpdateData(False) для вызова DDX....
]
и ее значение никак не хочет передаваться в CString m_edit
UpdateData(False) не помогает....
что я делаю не так?
как занести значение с эдитбокса в перменную o_O
честно говоря я думал что
DDX_Text(pDX, IDC_EDIT1, m_edit);
как раз и отвественно за этот обмен
UpdateData(FALSE);
SetEditStr(GetEditStr());
результат работы клавиши ОК , пустая строка
и через дебагер смотрел значение m_edit после UpdateData такая m_edit="" :(
UpdateData(TRUE) :D
UpdateData(TRUE) :D
:) точняк спасибо
:D:D:D
По-моему кто-то страдает херней. DoDataExchange автоматом вызывается при обработке кнопки IDOK. Не нужно никаких сообщений и переопределений. Просто напиши тело DoDataExchange.
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_edit);
DDX_Control(pDX, IDC_CHECK1, m_Check1);
DDX_Control(pDX, IDC_CHECK2, m_Check2);
DDX_Control(pDX, IDC_CHECK3, m_Check3);
}
А если уж тебя посетила гениальная мысль переопределить обработчик IDOK, то будь добр вызови
CDialog::OnOk();
И усееееееееее. ;)
А ты получаешь значение Edit только после нажатия кнопки Ок? А как быть с проверкой правильности ввода, обработки события при вводе определенного значения в Edit и вообще если программировать в пределах одного диалогового окна?
А ты получаешь значение Edit только после нажатия кнопки Ок? А как быть с проверкой правильности ввода, обработки события при вводе определенного значения в Edit и вообще если программировать в пределах одного диалогового окна?
Точно также как делал бы это ты, только перед проверкой делfл бы один вызов UpdateData(TRUE) и все..
Это конечно не очень приципиально, если у нас немного контролов... а если много? Для каждого делать GetWindowText? А если тебе число необходимо считать или что-то в этом роде? Не зря же придумали все-таки Dialog Data Exchange....
Точно также как делал бы это ты, только перед проверкой делfл бы один вызов UpdateData(TRUE) и все..
Это конечно не очень приципиально, если у нас немного контролов... а если много? Для каждого делать GetWindowText? А если тебе число необходимо считать или что-то в этом роде? Не зря же придумали все-таки Dialog Data Exchange....
Я хоть слово сказал против Dialog Data Exchange? Сontrol переменная тоде использует механизм DDX. Я говорил, что для одного контрола удобнее использовать всего одну переменную. С помощью неё я могу сделать с контролом любое действие!
Я хоть слово сказал против Dialog Data Exchange? Я говорил, что для одного контрола удобнее использовать всего одну переменную. С помощью неё я могу сделать с контролом любое действие!
Да можно вообще переменных не использовать :).
GetDlgItem и вперед... :)
Да можно вообще переменных не использовать :).
GetDlgItem и вперед... :)
Согласен, только GetDlgItem возвращает указатель на окно, а GetDlgItemText получает текст этого окна
А ты получаешь значение Edit только после нажатия кнопки Ок? А как быть с проверкой правильности ввода, обработки события при вводе определенного значения в Edit и вообще если программировать в пределах одного диалогового окна?
Да после нажатия на кнопку, странно??? , а мне нормально. Если тебя прет с проверками на лету - PreTranslateMessage и обрабаитывай вм_кейдаун. Только к ддх это не имеет ну никакого отношения.
Да после нажатия на кнопку, странно??? , а мне нормально. Если тебя прет с проверками на лету - PreTranslateMessage и обрабаитывай вм_кейдаун. Только к ддх это не имеет ну никакого отношения.
Да-а, интересно девки пляшут...