Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание числового поля ввода, CMyEdit 
V
    Опции темы
Proletariy
Дата 16.1.2009, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго всем времени суток.

Хочу создать числовое поле ввода, которое бы воспринимало:
цифры (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.

Это сообщение отредактировал(а) Proletariy - 16.1.2009, 16:36
PM MAIL   Вверх
voov
Дата 16.1.2009, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


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

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



А не хочешь воспользоваться уже готовым решением (UltimateToolbox)?
Там есть такой компонент. И ваще там много всего есть. В крайнем случае, там есть исходники и можно посмотреть как сделано.
PM MAIL   Вверх
KEHT
Дата 16.1.2009, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

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

А что мешает завести в классе переменную типа float и в событии OnChar анализировать строку и обновлять переменную?
PM MAIL   Вверх
Proletariy
Дата 19.1.2009, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



voovKEHT спасибо за советы.

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

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

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


Это сообщение отредактировал(а) Proletariy - 19.1.2009, 11:35
PM MAIL   Вверх
KEHT
Дата 20.1.2009, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Еще есть такой вариант: оставить OnChar такик, как вы привели и добавить 2 переменные для контрола визардами студии. Один типа float, другой типа CString и использовать тот что вам нужно.
PM MAIL   Вверх
Proletariy
Дата 20.1.2009, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Сегодня целый день пытался сделать что-либо внятное. Создать математическое поле ввода.   smile 

OnChar благополучно позаимствовал на 
http://63.236.73.79/cpp/controls/editctrl/...91/?thread=5306
лучшее из того, что я нашел.

1.Создал класс производный от CEdit CFloatEdit.
2.Добавил OnChar куда загнал вышеуказанный код.
3.Добавил в класс CFloatEdit две функции - одну на считывание данных из EditBoxa и преобразование их в тип float, вторую на запись данных из типа float в EditBox ( znach() и sendznach() ).

Меня в принципе результат устраивает.

Вот еще код OnChar хорошо работает в 7 студии в 8 студии выдает ошибку!! Причину я не понял, а я только хотел на восьмую пересесть. 

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

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  MyDialog.rar 479,48 Kb
PM MAIL   Вверх
voov
Дата 20.1.2009, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


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

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



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

ты про какаю ошибку? у меня все собралось, варнинги правда есть, но без ошибок. запускается, вроде работает (не знаю как должно работать).
PM MAIL   Вверх
Proletariy
Дата 20.1.2009, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

?????




Это сообщение отредактировал(а) Proletariy - 20.1.2009, 19:09
PM MAIL   Вверх
voov
Дата 20.1.2009, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Патамушта мы пилоты
**


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

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



Поставь в настройках проекта (Аlt+F7) General -> Character Set -> Use Multi-Byte Character Set

А вообще привыкай строки обрамлять макросом _T(), как правило хорошего тона. Тогда таких проблем не будет.

Код

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

PM MAIL   Вверх
Proletariy
Дата 20.1.2009, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



voov
Спасибо тебе большое. Ты мне опять очень помог.  smile 
PM MAIL   Вверх
Proletariy
Дата 21.1.2009, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Причесал я немного класс 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)

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  FloatEdit.rar 2,02 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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