| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Создание числового поля ввода |
| Автор: Proletariy 16.1.2009, 15:44 | ||
| Доброго всем времени суток. Хочу создать числовое поле ввода, которое бы воспринимало: цифры (0-9); знаки точка (или запятая) только один раз; знаки "+" и "-" только один раз и перед числом. До недавнего времени пользовался стандартным типом float. Но это не очень удобно. Т.к. в поле можно вводить и другие символы, а так же велика вероятность отсечения дробной части числа от целой если воспользовался не тем знаком разделения (точкой или запятой). Как я делаю: 1.Создаю свой класс CMyEdit (родительский класс CEdit) 2. Добавляю onChar для CMyEdit
Чем задаю возможность ввода только вышеперечисленных символов И дальше не знаю как быть Хотелось, бы чтобы при присвоении переменной для элемента управления EditBox производной от класса CMyEdit с ней можно было бы работать как с переменной типа float. Возможно есть другой путь? Заранее спасибо на добром слове. П.С. Подумалось. Может написать функцию, которая будет анализировать переменную типа CString при добавлении к ней символов. OnUpdate. А при killfokus переводила бы ее в float (atof)??? Но тут тоже... надо две переменные одна типа CString, другая типа float. |
| Автор: voov 16.1.2009, 19:01 |
| А не хочешь воспользоваться http://www.codeproject.com/KB/MFC/UltimateToolbox.aspx?df=100&forumid=452557&exp=0&fr=26? Там есть такой компонент. И ваще там много всего есть. В крайнем случае, там есть исходники и можно посмотреть как сделано. |
| Автор: KEHT 16.1.2009, 19:35 | ||
А что мешает завести в классе переменную типа float и в событии OnChar анализировать строку и обновлять переменную? |
| Автор: Proletariy 19.1.2009, 10:59 | ||
| voov, KEHT спасибо за советы. Про UltimateToolbox не знал, попробую изучить. KEHT,а вы можете выложить простой пример.
|
| Автор: KEHT 20.1.2009, 17:15 |
| Возможно я неправильно понял вопрос, но при наличии некоторого метода ToFloat (или используя тот же atof) можно было бы вызвать его в конце OnChar. Еще есть такой вариант: оставить OnChar такик, как вы привели и добавить 2 переменные для контрола визардами студии. Один типа float, другой типа CString и использовать тот что вам нужно. |
| Автор: Proletariy 20.1.2009, 18:01 |
| Сегодня целый день пытался сделать что-либо внятное. Создать математическое поле ввода. OnChar благополучно позаимствовал на http://63.236.73.79/cpp/controls/editctrl/maskededitcontrols/comments.php/c491/?thread=5306 лучшее из того, что я нашел. 1.Создал класс производный от CEdit CFloatEdit. 2.Добавил OnChar куда загнал вышеуказанный код. 3.Добавил в класс CFloatEdit две функции - одну на считывание данных из EditBoxa и преобразование их в тип float, вторую на запись данных из типа float в EditBox ( znach() и sendznach() ). Меня в принципе результат устраивает. Вот еще код OnChar хорошо работает в 7 студии в 8 студии выдает ошибку!! Причину я не понял, а я только хотел на восьмую пересесть. Прошу господа, посмотрите мой код может у Вас будут некоторые замечания и дополнения Очень хочется знать почему 8 студия ошибку выдает. |
| Автор: voov 20.1.2009, 18:54 |
ты про какаю ошибку? у меня все собралось, варнинги правда есть, но без ошибок. запускается, вроде работает (не знаю как должно работать). |
| Автор: Proletariy 20.1.2009, 19:06 | ||
| voov Странно. У меня этот проект тоже в 8 студии заработал. Попробовал сделать такой проект заново в 8 студии. Ошибку выдал после того как я прописал функцию OnChar в классе CFloatEdit на этой строке
Ошибка 1 error C2440: инициализация: невозможно преобразовать 'const char [81]' в 'ATL::CStringT<BaseType,StringTraits>' d:\программирование\555\555\floatedit.cpp 29 ????? |
| Автор: voov 20.1.2009, 19:35 | ||
| Поставь в настройках проекта (Аlt+F7) General -> Character Set -> Use Multi-Byte Character Set А вообще привыкай строки обрамлять макросом _T(), как правило хорошего тона. Тогда таких проблем не будет.
|
| Автор: Proletariy 20.1.2009, 20:00 |
| voov Спасибо тебе большое. Ты мне опять очень помог. |
| Автор: Proletariy 21.1.2009, 19:32 |
| Причесал я немного класс CFloatEdit и получил то что хотел. Выкладываю. Возможно это сохранит кому-нибудь время. 1.Добавляем файлы FloatEdit.h и FloatEdit.cpp в проект. 2.Добавляем EditControl. 3.Добавляем к EditControl переменную Variable type: CfloatEdit Например public: CFloatEdit m_varible; Теперь можно работать с переменной m_varible.m_category=5; //Число будет отображаться с точностью 5 знаков после запятой m_varible.SetValue(float m_value); или m_varible.SetValue(7) //EditControl отобразит значение переменной типа float с указанным числом знаков после запятой Например 7.000 m_varible.GetValue(); //Получает значение с EditControl с которым можно сразу выполнять математические действия тип float П.С. Работает при использовании многобайтовой кодировки (Use Multi-Byte Character Set) |