![]() |
|
|
![]()
|
|
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
допустим есть главный диалог, а в нём кнопка настройки, которая вызывает диалог с настройками.
по идее все переменные настроек должны храниться в главном диалоге, т.к. там они пишутся в ини файл. надо завести в диалоге настроек копии переменных и перед закрытием диалога как то копировать их в главный? как это обычно делают? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Делают по-разному. Во-первых, если настроечных параметров > 1 очень рекомендую завести структуру, где будут жить все эти параметры.
Диалог настройки может получать и запоминать ссылку на параметры, куда он будет записывать установленные значения. А можно сделать так, чтобы ему передавали только начальную копию, а потом вызывающий код спрашивал, что получилось, после OK. Это дело вкуса. Но в любом случае настроечный диалог должен иметь внутри себя копию параметров, чтобы можно было корректно отказаться от изменений. Работает этот диалог только со своей копией, а по OK либо сам переписывает текущие значения в переданную при создании ссылку, либо это делает вызывающий код. -------------------- ... |
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
мне еще получается надо инициализировать диалог настроек, а как получить переменные из базового класса чтобы инициализировать?
обратно я получаю так
|
|||
|
||||
| Albor |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
||||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
да по идее можно и без конструктора.
Это сообщение отредактировал(а) mrgloom - 14.2.2013, 10:34 |
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
причем что странно не всегда передаёт ноль, такое ощущение что почему то обнуляется.
причем в самом окне и в дебаге смотрел значение меняется а вот на выходе при передаче всё равно ноль.
|
|||
|
||||
| Albor |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Можно, конечно, если переменные в открытом доступе. А что происходит в CSettingsDlg::OnInitDialog()? Не обнуляется ли там? Или я вас не правильно понял. А почему не пользуетесь CString? Дело в том, что вы передаёте в GetWindowText() указатель на char и если ваш диалог собирается под UNICODE, то будут проблемы. Можно связать с edit-ом переменную целого типа и вообще не использовать atoi(). Это сообщение отредактировал(а) Albor - 14.2.2013, 13:16 |
|||
|
||||
| mrgloom |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
да даже если бы обнулялось какая разница, я ж говорю при возвращении в главный диалог всё по нулям.
т.к. я потом переменную использую в коде как int
где про это почитать? |
||||||
|
|||||||
| Albor |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Дело в том, что GetWindowText() принимает LPTSTR, то есть указатель на TSTR, а это не всегда char* (зависит от установок проекта, то есть и смотреть нужно там же).
Значит я не так понял. Так свяжите с эдитом переменную типа int и пользуйтесь UpdateData() для записи/чтения этой переменной - и не нужно ни каких лишних действий (получение строки, потом преобразование в число). Это сообщение отредактировал(а) Albor - 14.2.2013, 15:48 |
|||
|
||||
| mrgloom |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
я всё время с этим мучаюсь т.к. получаеться целый зоопарк std::string, char*, CString и т.д. , это только в MFC такие проблемы?
что это значит? |
||||
|
|||||
| Albor |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
На самом деле ни чего сложного - используя условную компиляцию, LPTSTR определяется как указатель на wchar_t, если определен UNICODE, или указатель на char в противном случае. Посмотрите определение типов в файле WinNT.h . Я если хочу разобраться что это за тип, набираю в редакторе, правой кнопкой по имени типа и из контекстного меню выполняю "Go to declaration", студия открывает нужный файл, а там, обычно, typedef. Типы определённые в Windows по началу вводят в ступор, потому что их много, но в основном это псевдонимы. Это значит, что нужно задействовать механизм DDX. В редакторе ресурсов вашего диалога щелкаете правой кнопкой по эдитбоксу (равно как и по любому элементу) и выполняете команду контекстного меню "Add variable". Появится диалог, в котором можно указать какого типа переменную вы хотите. Для эдита можно добавить переменную int в том числе. Такой подход даст вам преимущество хотя бы в том, что в эдит вы уже не сможете ввести символы отличные от цифр. Полученная переменная используется как обычно, но с небольшим удобством - если вызвать UpdateData(TRUE), то в переменные будут считаны данные из контролов, а если сделать вызов UpdateData(FALSE), то содержимое переменных отобразится в контролах. |
|||
|
||||
| mrgloom |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
пытаюсь опросить комбобокс после нажатия Ок
определен как
потом сама инициализация в диалоге
после нажатия Ок
что делаю не так? Это сообщение отредактировал(а) mrgloom - 18.2.2013, 11:05 |
||||||||
|
|||||||||
| Albor |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Об этом уже писалось не один раз. В момент, когда вы обращаетесь к комбобоксу, он уже не существует. Комбобокс оконный объект и разрушется вместе с окном диалога. Доступ есть только к "неоконным" переменным. По нажатию кнопки OK в диалоге сохраните текущую позицию в переменной типа int и обращайтесь к ней из блока if(dlg.DoModal()==IDOK) |
|||
|
||||
| mrgloom |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
ну в итоге я так и сделал, но мне показалось что это какой то костыль.
по идее же можно от того же комбобокса унаследовать класс и добавить туда поле с интом? |
|||
|
||||
| Albor |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
||||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |