Поиск:

Ответ в темуСоздание новой темы Создание опроса
> переменные в диалоге 
:(
    Опции темы
mrgloom
Дата 13.2.2013, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



допустим есть главный диалог, а в нём кнопка настройки, которая вызывает диалог с настройками.
по идее все переменные настроек должны храниться в главном диалоге, т.к. там они пишутся в ини файл.
надо завести в диалоге настроек копии переменных и перед закрытием диалога как то копировать их в главный?

как это обычно делают?
PM MAIL   Вверх
Earnest
Дата 13.2.2013, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Делают по-разному. Во-первых, если настроечных параметров > 1 очень рекомендую завести структуру, где будут жить все эти параметры.
Диалог настройки может получать и запоминать ссылку на параметры, куда он будет записывать установленные значения.
А можно сделать так, чтобы ему передавали только начальную копию, а потом вызывающий код спрашивал, что получилось, после OK. Это дело вкуса. 
Но в любом случае настроечный диалог должен иметь внутри себя копию параметров, чтобы можно было корректно отказаться от изменений. Работает этот диалог только со своей копией, а по OK либо сам переписывает текущие значения в переданную при создании ссылку, либо это делает вызывающий код.


--------------------
...
PM   Вверх
mrgloom
Дата 13.2.2013, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



мне еще получается надо инициализировать диалог настроек, а как получить переменные из базового класса чтобы инициализировать?

обратно я получаю так

Код

void CMyDlg::OnBnClickedSettingsDlg()
{
    //вызывается диалог настроек
    CSettingsDlg dlg;
    if(dlg.DoModal()==IDOK)
    {
        m_my_var= dlg.m_my_var;
    }
} 

PM MAIL   Вверх
Albor
Дата 14.2.2013, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(mrgloom @  13.2.2013,  15:06 Найти цитируемый пост)
как получить переменные из базового класса чтобы инициализировать

Создайте конструктор в классе CSettingsDlg с параметрами и передайте туда нужные данные.
PM MAIL ICQ   Вверх
mrgloom
Дата 14.2.2013, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



да по идее можно и без конструктора.

Код

void CMyDlg::OnBnClickedSettingsDlg()
{
    //вызывается диалог настроек
    CSettingsDlg dlg;
    dlg.m_my_var= m_my_var;
    if(dlg.DoModal()==IDOK)
    {
        m_my_var= dlg.m_my_var; // почему то dlg.m_my_var=0 может т.к. dlg разрушается?
    }
} 


Это сообщение отредактировал(а) mrgloom - 14.2.2013, 10:34
PM MAIL   Вверх
mrgloom
Дата 14.2.2013, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



причем что странно не всегда передаёт ноль, такое ощущение что почему то обнуляется.
причем в самом окне и в дебаге смотрел значение меняется а вот на выходе при передаче всё равно ноль.

Код

void CSettingsDlg::OnChangeMyVar()
{
    char snum[8];
    CEdit* pEdit = (CEdit*)GetDlgItem( IDC_MY_VAR );
    pEdit->GetWindowText( snum, sizeof(snum) );

    DWORD n= atoi( snum );
    if(n<0)
        n=0;
    if(n>100)
        n=100;
    m_my_var = n;
    _itot( n, snum, 10 );
    pEdit->SetWindowText( snum );

    //m_my_var= 25;  // причем если эту строчку поставить то будет нормально передавать 25, а не 0
}

PM MAIL   Вверх
Albor
Дата 14.2.2013, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(mrgloom @  14.2.2013,  09:33 Найти цитируемый пост)
да по идее можно и без конструктора.

Можно, конечно, если переменные в открытом доступе.
Цитата(mrgloom @  14.2.2013,  10:10 Найти цитируемый пост)
такое ощущение что почему то обнуляется.

А что происходит в CSettingsDlg::OnInitDialog()? Не обнуляется ли там?  Или я вас не правильно понял. А почему не пользуетесь CString? Дело в том, что вы передаёте в GetWindowText() указатель на char и если ваш диалог собирается под UNICODE, то будут проблемы. Можно связать с edit-ом переменную целого типа и вообще не использовать atoi().


Это сообщение отредактировал(а) Albor - 14.2.2013, 13:16
PM MAIL ICQ   Вверх
mrgloom
Дата 14.2.2013, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



Цитата

CSettingsDlg::OnInitDialog()

да даже если бы обнулялось какая разница, я ж говорю при возвращении в главный диалог всё по нулям.
Цитата


почему не пользуетесь CString

т.к. я потом переменную использую в коде как int 

Цитата

если ваш диалог собирается под UNICODE, то будут проблемы

где про это почитать?
PM MAIL   Вверх
Albor
Дата 14.2.2013, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(mrgloom @  14.2.2013,  14:18 Найти цитируемый пост)
где про это почитать? 

Дело в том, что GetWindowText() принимает LPTSTR, то есть указатель на TSTR, а это не всегда char* (зависит от установок проекта, то есть и смотреть нужно там же). 
Цитата(mrgloom @  14.2.2013,  14:18 Найти цитируемый пост)
да даже если бы обнулялось какая разница, я ж говорю при возвращении в главный диалог всё по нулям

Значит я не так понял.
Цитата(mrgloom @  14.2.2013,  14:18 Найти цитируемый пост)
т.к. я потом переменную использую в коде как int 

Так свяжите с эдитом переменную типа int и пользуйтесь UpdateData() для записи/чтения этой переменной - и не нужно ни каких лишних действий (получение строки, потом преобразование в число). 

Это сообщение отредактировал(а) Albor - 14.2.2013, 15:48
PM MAIL ICQ   Вверх
mrgloom
Дата 15.2.2013, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



Цитата

Дело в том, что GetWindowText() принимает LPTSTR, то есть указатель на TSTR, а это не всегда char* (зависит от установок проекта, то есть и смотреть нужно там же). 


я всё время с этим мучаюсь т.к. получаеться целый зоопарк std::string, char*, CString  и т.д. , это только в MFC такие проблемы?

Цитата

свяжите с эдитом переменную типа int

что это значит?
PM MAIL   Вверх
Albor
Дата 15.2.2013, 10:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(mrgloom @  15.2.2013,  07:53 Найти цитируемый пост)
я всё время с этим мучаюсь т.к. получаеться целый зоопарк std::string, char*, CString  и т.д. , это только в MFC такие проблемы?

На самом деле ни чего сложного - используя условную компиляцию, LPTSTR определяется как указатель на wchar_t, если определен UNICODE, или указатель на char в противном случае. Посмотрите определение типов в файле WinNT.h . Я если хочу разобраться что это за тип, набираю в редакторе, правой кнопкой по имени типа и из контекстного меню выполняю "Go to declaration", студия открывает нужный файл, а там, обычно, typedef. Типы определённые в Windows по началу вводят в ступор, потому что их много, но в основном это псевдонимы.
Цитата(mrgloom @  15.2.2013,  07:53 Найти цитируемый пост)
что это значит? 

Это значит, что нужно задействовать механизм DDX. В редакторе ресурсов вашего диалога щелкаете правой кнопкой по эдитбоксу (равно как и по любому элементу) и выполняете команду контекстного меню "Add variable". Появится диалог, в котором можно указать какого типа переменную вы хотите. Для эдита можно добавить переменную int в том числе. Такой подход даст вам преимущество хотя бы в том, что в эдит вы уже не сможете ввести символы отличные от цифр. Полученная переменная используется как обычно, но с небольшим удобством - если вызвать UpdateData(TRUE), то в переменные будут считаны данные из контролов, а если сделать вызов UpdateData(FALSE), то содержимое переменных отобразится в контролах. 
PM MAIL ICQ   Вверх
mrgloom
Дата 18.2.2013, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



пытаюсь опросить комбобокс после нажатия Ок

определен как
Код

CComboBox m_Mode;

Код


dlg.m_CurMode= 1; //до начала вызова диалога инициализируем текущий выбранный в списке


потом сама инициализация в диалоге
Код

BOOL CImageJoiningSettingsDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    m_Mode.AddString(STR_...);
    m_Mode.AddString(STR_...);
    m_Mode.AddString(STR_...);

    m_Mode.SetCurSel(m_CurMode);

    return TRUE;
}


после нажатия Ок
Код

    if(dlg.DoModal()==IDOK)
    {
        m_Mode= dlg.m_Mode.GetCurSel(); //тут падает
    }



что делаю не так?

Это сообщение отредактировал(а) mrgloom - 18.2.2013, 11:05
PM MAIL   Вверх
Albor
Дата 18.2.2013, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(mrgloom @  18.2.2013,  10:04 Найти цитируемый пост)
что делаю не так?

Об этом уже писалось не один раз. В момент, когда вы обращаетесь к комбобоксу, он уже не существует. Комбобокс оконный объект и разрушется вместе с окном диалога. Доступ есть только к "неоконным" переменным. По нажатию кнопки OK в диалоге сохраните текущую позицию в переменной типа int и обращайтесь к ней из блока   if(dlg.DoModal()==IDOK)
PM MAIL ICQ   Вверх
mrgloom
Дата 18.2.2013, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



ну в итоге я так и сделал, но мне показалось что это какой то костыль.


по идее же можно от того же комбобокса унаследовать класс и добавить туда поле с интом?
PM MAIL   Вверх
Albor
Дата 18.2.2013, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(mrgloom @  18.2.2013,  12:20 Найти цитируемый пост)
по идее же можно от того же комбобокса унаследовать класс и добавить туда поле с интом? 

наверное да, но зачем?
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.4376 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.