Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Создание числового поля ввода


Автор: Proletariy 16.1.2009, 15:44
Доброго всем времени суток.

Хочу создать числовое поле ввода, которое бы воспринимало:
цифры (0-9);
знаки точка (или запятая) только один раз;
знаки "+" и "-" только один раз и перед числом.

До недавнего времени пользовался стандартным типом float. Но это не очень удобно. Т.к. в поле можно вводить и другие символы, а так же велика вероятность отсечения дробной части числа от целой если воспользовался не тем знаком разделения (точкой или запятой).


Как я делаю:
1.Создаю свой класс CMyEdit (родительский класс CEdit)
2. Добавляю onChar для CMyEdit

Код

void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: добавьте свой код обработчика сообщений или вызов стандартного
switch (nChar)
{
case '-': break;
case '+': break;
case '0': break;
case '1': break;
case '2': break;
case '3': break;
case '4': break;
case '5': break;
case '6': break;
case '7': break;
case '8': break;
case '9': break;
case '/': break;
case '.': break;
case ',': { nChar = '.'; break;}
case VK_BACK: break;
default: return;
}
CEdit::OnChar(nChar, nRepCnt, nFlags);
}

Чем задаю возможность ввода только вышеперечисленных символов

И дальше не знаю как быть 


Хотелось, бы чтобы при присвоении переменной для элемента управления 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
Цитата

Но тут тоже... надо две переменные одна типа CString, другая типа float.

А что мешает завести в классе переменную типа float и в событии OnChar анализировать строку и обновлять переменную?

Автор: Proletariy 19.1.2009, 10:59
voov, KEHT спасибо за советы.

Про UltimateToolbox не знал, попробую изучить.

KEHT,а вы можете выложить простой пример.
Цитата

А что мешает завести в классе переменную типа float и в событии OnChar анализировать строку и обновлять переменную?

Автор: KEHT 20.1.2009, 17:15
Возможно я неправильно понял вопрос, но при наличии некоторого метода ToFloat (или используя тот же atof) можно было бы вызвать его в конце OnChar.

Еще есть такой вариант: оставить OnChar такик, как вы привели и добавить 2 переменные для контрола визардами студии. Один типа float, другой типа CString и использовать тот что вам нужно.

Автор: Proletariy 20.1.2009, 18:01
Сегодня целый день пытался сделать что-либо внятное. Создать математическое поле ввода.   smile 

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 студии выдает ошибку!! Причину я не понял, а я только хотел на восьмую пересесть. 

Прошу господа, посмотрите мой код может у Вас будут некоторые замечания и дополнения  smile 
Очень хочется знать почему 8 студия ошибку выдает.

Автор: voov 20.1.2009, 18:54
Цитата(Proletariy @  20.1.2009,  18:01 Найти цитируемый пост)
Очень хочется знать почему 8 студия ошибку выдает

ты про какаю ошибку? у меня все собралось, варнинги правда есть, но без ошибок. запускается, вроде работает (не знаю как должно работать).

Автор: Proletariy 20.1.2009, 19:06
voov
Странно. smile 
У меня этот проект тоже в 8 студии заработал.


Попробовал сделать такой проект заново в 8 студии. Ошибку выдал после того как я прописал функцию OnChar в классе CFloatEdit
на этой строке

Код

CString          Holder = "`~!@#$%^&*()_=qwrtyuiop[]\\asdfghjkl;\'zxcvbnm,/QWRTYUIOP{}|ASDFGHJKL:\"ZXCVBNM<>?/";


Ошибка    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(), как правило хорошего тона. Тогда таких проблем не будет.

Код

CString          Holder = _Т("`~!@#$%^&*()_=qwrtyuiop[]\\asdfghjkl;\'zxcvbnm,/QWRTYUIOP{}|ASDFGHJKL:\"ZXCVBNM<>?/");

Автор: Proletariy 20.1.2009, 20:00
voov
Спасибо тебе большое. Ты мне опять очень помог.  smile 

Автор: 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)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)