| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > переменные в диалоге |
| Автор: mrgloom 13.2.2013, 14:01 |
| допустим есть главный диалог, а в нём кнопка настройки, которая вызывает диалог с настройками. по идее все переменные настроек должны храниться в главном диалоге, т.к. там они пишутся в ини файл. надо завести в диалоге настроек копии переменных и перед закрытием диалога как то копировать их в главный? как это обычно делают? |
| Автор: Earnest 13.2.2013, 14:26 |
| Делают по-разному. Во-первых, если настроечных параметров > 1 очень рекомендую завести структуру, где будут жить все эти параметры. Диалог настройки может получать и запоминать ссылку на параметры, куда он будет записывать установленные значения. А можно сделать так, чтобы ему передавали только начальную копию, а потом вызывающий код спрашивал, что получилось, после OK. Это дело вкуса. Но в любом случае настроечный диалог должен иметь внутри себя копию параметров, чтобы можно было корректно отказаться от изменений. Работает этот диалог только со своей копией, а по OK либо сам переписывает текущие значения в переданную при создании ссылку, либо это делает вызывающий код. |
| Автор: mrgloom 13.2.2013, 16:06 | ||
| мне еще получается надо инициализировать диалог настроек, а как получить переменные из базового класса чтобы инициализировать? обратно я получаю так
|
| Автор: mrgloom 14.2.2013, 10:33 | ||
да по идее можно и без конструктора.
|
| Автор: mrgloom 14.2.2013, 11:10 | ||
| причем что странно не всегда передаёт ноль, такое ощущение что почему то обнуляется. причем в самом окне и в дебаге смотрел значение меняется а вот на выходе при передаче всё равно ноль.
|
| Автор: Albor 14.2.2013, 13:04 |
Можно, конечно, если переменные в открытом доступе. А что происходит в CSettingsDlg::OnInitDialog()? Не обнуляется ли там? Или я вас не правильно понял. А почему не пользуетесь CString? Дело в том, что вы передаёте в GetWindowText() указатель на char и если ваш диалог собирается под UNICODE, то будут проблемы. Можно связать с edit-ом переменную целого типа и вообще не использовать atoi(). |
| Автор: mrgloom 14.2.2013, 15:18 | ||||||
да даже если бы обнулялось какая разница, я ж говорю при возвращении в главный диалог всё по нулям.
т.к. я потом переменную использую в коде как int
где про это почитать? |
| Автор: Albor 14.2.2013, 15:47 | ||
Дело в том, что GetWindowText() принимает LPTSTR, то есть указатель на TSTR, а это не всегда char* (зависит от установок проекта, то есть и смотреть нужно там же).
Значит я не так понял. Так свяжите с эдитом переменную типа int и пользуйтесь UpdateData() для записи/чтения этой переменной - и не нужно ни каких лишних действий (получение строки, потом преобразование в число). |
| Автор: mrgloom 15.2.2013, 08:53 | ||||
я всё время с этим мучаюсь т.к. получаеться целый зоопарк std::string, char*, CString и т.д. , это только в MFC такие проблемы?
что это значит? |
| Автор: Albor 15.2.2013, 10:15 | ||
На самом деле ни чего сложного - используя условную компиляцию, LPTSTR определяется как указатель на wchar_t, если определен UNICODE, или указатель на char в противном случае. Посмотрите определение типов в файле WinNT.h . Я если хочу разобраться что это за тип, набираю в редакторе, правой кнопкой по имени типа и из контекстного меню выполняю "Go to declaration", студия открывает нужный файл, а там, обычно, typedef. Типы определённые в Windows по началу вводят в ступор, потому что их много, но в основном это псевдонимы. Это значит, что нужно задействовать механизм DDX. В редакторе ресурсов вашего диалога щелкаете правой кнопкой по эдитбоксу (равно как и по любому элементу) и выполняете команду контекстного меню "Add variable". Появится диалог, в котором можно указать какого типа переменную вы хотите. Для эдита можно добавить переменную int в том числе. Такой подход даст вам преимущество хотя бы в том, что в эдит вы уже не сможете ввести символы отличные от цифр. Полученная переменная используется как обычно, но с небольшим удобством - если вызвать UpdateData(TRUE), то в переменные будут считаны данные из контролов, а если сделать вызов UpdateData(FALSE), то содержимое переменных отобразится в контролах. |
| Автор: mrgloom 18.2.2013, 11:04 | ||||||||
| пытаюсь опросить комбобокс после нажатия Ок определен как
потом сама инициализация в диалоге
после нажатия Ок
что делаю не так? |
| Автор: Albor 18.2.2013, 12:16 |
Об этом уже писалось не один раз. В момент, когда вы обращаетесь к комбобоксу, он уже не существует. Комбобокс оконный объект и разрушется вместе с окном диалога. Доступ есть только к "неоконным" переменным. По нажатию кнопки OK в диалоге сохраните текущую позицию в переменной типа int и обращайтесь к ней из блока if(dlg.DoModal()==IDOK) |
| Автор: mrgloom 18.2.2013, 13:20 |
| ну в итоге я так и сделал, но мне показалось что это какой то костыль. по идее же можно от того же комбобокса унаследовать класс и добавить туда поле с интом? |
| Автор: Albor 18.2.2013, 13:31 | ||
наверное да, но зачем? |
| Автор: baldina 18.2.2013, 14:07 |
| можно добавить в диалог переменную int и обновлять её по DDX. это можно сделать через мастер VS, связав список еще с одной переменной (выбрав category - value). |