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

Ваш аккаунт

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

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

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

Ddx

11K
13 марта 2006 года
General
27 / / 09.03.2006
MFC:

запустил модальное окно

в нем есть Edit, 3 CheckBoxa, кнопки ОК, Cancel

добавил событие
 
Код:
BEGIN_MESSAGE_MAP(CSelDlg, CDialog)
    //{{AFX_MSG_MAP(CSelDlg)
        // No message handlers
    //}}AFX_MSG_MAP
    ON_COMMAND(IDOK,ButOK)     
END_MESSAGE_MAP()

(тоесть вызов функции ButOK по нажатию)
Код:
void CSelDlg::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
 
Код:
void CSelDlg::DoDataExchange(CDataExchange* pDX)
{
    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. получилось несколько объемно :( если что не понятно спрашивайте
395
13 марта 2006 года
RelB
367 / / 09.11.2002
CWnd::UpdateData(FALSE) тебе поможет :)
11K
13 марта 2006 года
General
27 / / 09.03.2006
Цитата:
Originally posted by RelB
CWnd::UpdateData(FALSE) тебе поможет :)



и чем мне это поможет
и куда мне ее писать?

я написал в ButOK

UpdateWindow(FALSE) и UpdateWindow(0)

пишет function does not take 1 parametr.....

324
13 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by General
и чем мне это поможет
и куда мне ее писать?

я написал в ButOK

UpdateWindow(FALSE) и UpdateWindow(0)

пишет function does not take 1 parametr.....



Тебе надо обновить edit.

 
Код:
m_edit.UpdateData(FALSE);


И еще, что за функция SetEditStr. И какой тип у m_edit;
395
13 марта 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by General
и чем мне это поможет
и куда мне ее писать?

я написал в ButOK

UpdateWindow(FALSE) и UpdateWindow(0)

пишет function does not take 1 parametr.....


Ну для начала, нужно научится читать :)

UpdateData(FALSE), а не UpdateWindow

395
13 марта 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by AndreySar
Тебе надо обновить edit.
 
Код:
m_edit.UpdateData(FALSE);


И еще, что за функция SetEditStr. И какой тип у m_edit;


Я бы так не делал :)

11K
13 марта 2006 года
General
27 / / 09.03.2006
Цитата:
Originally posted by RelB
Я бы так не делал :)



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

324
13 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by RelB
Я бы так не делал :)



А как бы ты делал?

324
13 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by General
void CSelDlg::SetEditStr(CString csEdit)

{

m_edit=csEdit;

}



Оригинально. Учти, что в VC 7 , по умолчанию нельзя создать тип переменной CString, там можно создавать переменные только Control типа, в данном случае CEdit m_edit, тогда, что бы поместить текст в EDIT достаточно написать

 
Код:
m_edit.SetWindowText("My text");

и не надо заботиться об обновлении данных.
Цитата:
Originally posted by General

UpdateData не функция m_edit


UpdateData функция класса CWnd. Из-за этого я и спросил какого типа переменная m_edit.

395
13 марта 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by AndreySar
Оригинально. Учти, что в VC 7 , по умолчанию нельзя создать тип переменной CString, там можно создавать переменные только Control типа


Что за бред? Поясни плиз....

Цитата:
Originally posted by AndreySar

, в данном случае CEdit m_edit, тогда, что бы поместить текст в EDIT достаточно написать
 
Код:
m_edit.SetWindowText("My text");

и не надо заботиться об обновлении данных.


Впринципе верно, но зачастую использовать DDX удобнее... В данном случае необходимо вызывать UpdateData именно у окна, а не котрола! После этого автоматически произойдет вызов функции
DoDataExchange и в зависимости от параметра SaveAndValidate либо запишет значение переменной m_edit в контрол, либо считает его из контрола и запишет в m_edit...

324
13 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by RelB
Что за бред? Поясни плиз....


В VC 7 нельзя с помощью мастера объявить переменную для edita, кроме как Control, в VC 6 можно было обявлять несколько типов переменных для каждого контрола. Для того же edita это мог быть как CString, так и int.

Цитата:
Originally posted by RelB
Впринципе верно, но зачастую использовать DDX удобнее...


А кто тебе сказал, что в данном случае не используется DDX???

Цитата:
Originally posted by RelB

В данном случае необходимо вызывать UpdateData именно у окна, а не котрола! После этого автоматически произойдет вызов функции
DoDataExchange и в зависимости от параметра SaveAndValidate либо запишет значение переменной m_edit в контрол, либо считает его из контрола и запишет в m_edit...



И зачем весь этот гемор с UpdateData(TRUE/FALSE)?

11K
13 марта 2006 года
General
27 / / 09.03.2006
Цитата:
Originally posted by RelB
Что за бред? Поясни плиз....


Впринципе верно, но зачастую использовать DDX удобнее... В данном случае необходимо вызывать UpdateData именно у окна, а не котрола! После этого автоматически произойдет вызов функции
DoDataExchange и в зависимости от параметра SaveAndValidate либо запишет значение переменной m_edit в контрол, либо считает его из контрола и запишет в m_edit...




я пишу в VC++ 6.0

SetWindowText нуту такого у CString

..........

млин хелп.........!
как где что вызвать чтоб заработало?

324
13 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by General
я пишу в VC++ 6.0

SetWindowText нуту такого у CString

..........

млин хелп.........!
как где что вызвать чтоб заработало?



SetWindowText Это функция класса CWnd!!! Из названия же ясно - УстановитьТекстВОкно. Неужели нельзя посмотреть в MSDN. Он же не для понта создан

395
13 марта 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by AndreySar
В VC 7 нельзя с помощью мастера объявить переменную для edita, кроме как Control, в VC 6 можно было обявлять несколько типов переменных для каждого контрола. Для того же edita это мог быть как CString, так и int.


Аа... так Вы только мастером умеете пользоваться... ну тогда все ясно.... :)

Цитата:
Originally posted by AndreySar
А кто тебе сказал, что в данном случае не используется DDX???


Так что, если я объявлю переменную m_edit типа CEdit и сделаю вызов SetWindowText, то каким-то образом попаду в функцию DoDataExchange? Что-то сомневаюсь... :)


Цитата:
Originally posted by AndreySar
И зачем весь этот гемор с UpdateData(TRUE/FALSE)?


Не понятно в чем гемор? Наоборот гемора меньше... (ну может конечно совсем чуть-чуть :) )

395
13 марта 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by General
я пишу в VC++ 6.0

SetWindowText нуту такого у CString

..........

млин хелп.........!
как где что вызвать чтоб заработало?


Издеваешься?
Просто вызвать UpdateData(FALSE) и все, больше ничего не менять!

534
13 марта 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by AndreySar
В VC 7 нельзя с помощью мастера объявить переменную для edita, кроме как Control, в VC 6 можно было обявлять несколько типов переменных для каждого контрола. Для того же edita это мог быть как CString, так и int.


А кто тебе сказал, что в данном случае не используется DDX???



И зачем весь этот гемор с UpdateData(TRUE/FALSE)?

Как это нельзя переменные типа Value создавать? Всё можно. Создаём переменную Wizzard'ом и не паримся...

324
13 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by RelB
Аа... так Вы только мастером умеете пользоваться... ну тогда все ясно.... :)



А вообще то за то чтобы использовать только один тип переменных для одного объекта, а не кучу, чтобы сделать конкретное действие, чтобы занести число - int, текст - CString, как то изменить Control - CEdit. Место этого я использую всего одну переменную типа Control CEdit и могу проделать все эти действия используя только одну переменную!!!

Цитата:
Originally posted by RelB

Так что, если я объявлю переменную m_edit типа CEdit и сделаю вызов SetWindowText, то каким-то образом попаду в функцию DoDataExchange? Что-то сомневаюсь... :)


А как ты попадешь в DoDataExchange используя UpdateData()?

Цитата:
Originally posted by RelB

Не понятно в чем гемор? Наоборот гемора меньше... (ну может конечно совсем чуть-чуть :) )



А в том, что забыл я поставить UpdateData(FALSE) и нет у меня данных в окошке или , что еще хуже место FALSE написал TRUE.

395
13 марта 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by AndreySar

А в том, что забыл я поставить UpdateData(FALSE) и нет у меня данных в окошке или , что еще хуже место FALSE написал TRUE.


Нуу.... Вам надо еще учиться и учиться... :)

Допустим ситуация: диалог изменения пароля...
Выводим диалог на экран, ну скажем:
CPassDlg dlg;
dlg.ShowModal();
Пользователь ввел новый пароль и нажал ОК диалог при закрытии автоматически вызывает UpdateData(TRUE)...
Далее я могу спокойно уже у закрытого диалога вызывать скажем
dlg.GetPass()

В Вашем случае функция GetPass() будет вызывать GetWindowText() у уже убитого окна и я думаю, что ни к чему хорошему это не приведет.... :)

Цитата:
Originally posted by AndreySar
А как ты попадешь в DoDataExchange используя UpdateData()?


Поверь, попаду... можешь поставить брякпоинт если не веришь :D

534
13 марта 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by AndreySar
А в том, что забыл я поставить UpdateData(FALSE) и нет у меня данных в окошке или , что еще хуже место FALSE написал TRUE.

Ну, знаешь ли, это равносильно тому, что я скажу так: Забыл я SetWindowText() написать, и нету у меня текста на кнопке... Естественно, что если ты что-то забыл, то ошибки одна за одной полезут. Но это же везде так, и не только в программировании...

324
13 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by RelB
Нуу.... Вам надо еще учиться и учиться... :)


Я тебе просто привел пример

Цитата:
Originally posted by RelB

Допустим ситуация: диалог изменения пароля...
Выводим диалог на экран, ну скажем:
CPassDlg dlg;
dlg.ShowModal();
Пользователь ввел новый пароль и нажал ОК диалог при закрытии автоматически вызывает UpdateData(TRUE)...
Далее я могу спокойно уже у закрытого диалога вызывать скажем
dlg.GetPass()

В Вашем случае функция GetPass() будет вызывать GetWindowText() у уже убитого окна и я думаю, что ни к чему хорошему это не приведет.... :)


Наверное, единственный пример удобного использования не Control переменных, в пределах одного класса это для меня не удобно. И я никогда не буду вызывать GetWindowText для убитого окна, а сохраню нужную переменную и буду использовать её по своему усмотрению.

Цитата:
Originally posted by RelB

Поверь, попаду... можешь поставить брякпоинт если не веришь :D



Я в этом и не сомневаюсь

324
13 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by HarryAxe
Ну, знаешь ли, это равносильно тому, что я скажу так: Забыл я SetWindowText() написать, и нету у меня текста на кнопке... Естественно, что если ты что-то забыл, то ошибки одна за одной полезут. Но это же везде так, и не только в программировании...



Это видно если хоть раз сталкивался с такой проблемой. А теперь представь себе: разбираешься в чужом коде, m_edit переменная типа int и принимает два значения 0 или 1 и у тебя код:

 
Код:
if m_edit == 1
    ...
else
  ...

По идее ты заносишь в Edit 1 или 0 и получаешь результат, а тебя m_edit всегда 0, откуда знать, что данные еще надо обновить???

Короче, я вот хотел что сказать
Set(Get)WindowText намного нагляднее чем UpdateData(TRUE/FALSE)
395
13 марта 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by AndreySar
И я никогда не буду вызывать GetWindowText для убитого окна, а сохраню нужную переменную и буду использовать её по своему усмотрению.

Т.е. ты будешь при закрытии окна специально (лишний раз) вызывать GetWindowText(), сохранять ее в (лишнюю) переменную...

С такими подходами необходимо бороться, дабы повышать культуру программирования!

324
13 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by RelB
Т.е. ты будешь при закрытии окна специально (лишний раз) вызывать GetWindowText(), сохранять ее в (лишнюю) переменную...


А ты настолько часто передаешь переменные из одного класса в другой? Посчитай сколько раз ты вызываешь UpdateData() внутри своего класса для обработки данных

Цитата:
Originally posted by RelB

С такими подходами необходимо бороться, дабы повышать культуру программирования!



А ты еще книжку об этом напиши.
Это значит что GetWindowText придумали неКультурные программисты, что бы ты потом мог упрекать всех кто использует эти функции???

11K
13 марта 2006 года
General
27 / / 09.03.2006
прокатило UpdateData(FALSE);

пасибо обоим за помощь, в вашем споре узнал много интересного
398
13 марта 2006 года
Alexandoros
630 / / 21.10.2005
:D:D:D
По-моему кто-то страдает херней. DoDataExchange автоматом вызывается при обработке кнопки IDOK. Не нужно никаких сообщений и переопределений. Просто напиши тело DoDataExchange.

 
Код:
void CSelDlg::DoDataExchange(CDataExchange* pDX)
{
    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();

И усееееееееее. ;)
11K
13 марта 2006 года
General
27 / / 09.03.2006
хм......бред какой-то все что сказали сделал, все получилось


но


у нас есть строка 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="" :(

395
14 марта 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by General
хм......бред какой-то все что сказали сделал, все получилось


но


у нас есть строка 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

11K
14 марта 2006 года
General
27 / / 09.03.2006
Цитата:
Originally posted by RelB
UpdateData(TRUE) :D



:) точняк спасибо

324
14 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by Alexandoros
:D:D:D
По-моему кто-то страдает херней. DoDataExchange автоматом вызывается при обработке кнопки IDOK. Не нужно никаких сообщений и переопределений. Просто напиши тело DoDataExchange.

 
Код:
void CSelDlg::DoDataExchange(CDataExchange* pDX)
{
    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 и вообще если программировать в пределах одного диалогового окна?

395
14 марта 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by AndreySar
А ты получаешь значение Edit только после нажатия кнопки Ок? А как быть с проверкой правильности ввода, обработки события при вводе определенного значения в Edit и вообще если программировать в пределах одного диалогового окна?


Точно также как делал бы это ты, только перед проверкой делfл бы один вызов UpdateData(TRUE) и все..
Это конечно не очень приципиально, если у нас немного контролов... а если много? Для каждого делать GetWindowText? А если тебе число необходимо считать или что-то в этом роде? Не зря же придумали все-таки Dialog Data Exchange....

324
14 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by RelB
Точно также как делал бы это ты, только перед проверкой делfл бы один вызов UpdateData(TRUE) и все..
Это конечно не очень приципиально, если у нас немного контролов... а если много? Для каждого делать GetWindowText? А если тебе число необходимо считать или что-то в этом роде? Не зря же придумали все-таки Dialog Data Exchange....



Я хоть слово сказал против Dialog Data Exchange? Сontrol переменная тоде использует механизм DDX. Я говорил, что для одного контрола удобнее использовать всего одну переменную. С помощью неё я могу сделать с контролом любое действие!

395
14 марта 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by AndreySar
Я хоть слово сказал против Dialog Data Exchange? Я говорил, что для одного контрола удобнее использовать всего одну переменную. С помощью неё я могу сделать с контролом любое действие!


Да можно вообще переменных не использовать :).
GetDlgItem и вперед... :)

324
14 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by RelB
Да можно вообще переменных не использовать :).
GetDlgItem и вперед... :)



Согласен, только GetDlgItem возвращает указатель на окно, а GetDlgItemText получает текст этого окна

398
16 марта 2006 года
Alexandoros
630 / / 21.10.2005
Цитата:
Originally posted by AndreySar
А ты получаешь значение Edit только после нажатия кнопки Ок? А как быть с проверкой правильности ввода, обработки события при вводе определенного значения в Edit и вообще если программировать в пределах одного диалогового окна?



Да после нажатия на кнопку, странно??? , а мне нормально. Если тебя прет с проверками на лету - PreTranslateMessage и обрабаитывай вм_кейдаун. Только к ддх это не имеет ну никакого отношения.

324
16 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by Alexandoros
Да после нажатия на кнопку, странно??? , а мне нормально. Если тебя прет с проверками на лету - PreTranslateMessage и обрабаитывай вм_кейдаун. Только к ддх это не имеет ну никакого отношения.



Да-а, интересно девки пляшут...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог