Показать полную графическую версию : TEdit и тип AnsiString
Такая ситуация. Необходимо реализовать проверку введенного юзером значения в поле компонента TEdit на форме. Для этого считывать каждый символ в строке и проверять, является ли он цифрой. В обратном случае выводится сообщение об ошибке. Собственно, есть только один вопрос: как узнать, что достигнут конец строки? В стандарных null-terminated строках строка заканчивается символом '\0', а вот как дела обстоят в типе AnsiString, для меня пока что загадка.
Да, еще: почему в AnsiString, когда необходимо обратиться к первому символу в строке, обращаются к элементу [1], а не [0], как везде в C++?
Спасибо
AnsiString - это притянутая за уши паскалевская строка (они начинаются с единицы). В конце есть '\0', в этом можно убедиться, посмотрев исходник AnsiString::c_str(); Таким образом, есть 2 варианта:
AnsiString str=Edit1->text;
// паскалевский или C++ вариант:
unsigned a=1, b=str.length();
for(; a<=b && isdigit(str[a]); ++a) {}
if (a<=b) throw Exception("error: invalid user with curly hands");
// вариант C:
char* base=str.c_str();
while(*base && isdigit(*base++)) {}
if (*base) throw Exception("error: invalid user with curly hands");
aESThete
31-01-2006, 13:31
AnsiString - это притянутая за уши паскалевская строка
Предположение - может тогда как в паскале в нулевом байте сидит длина строки?
Нет. Размер строк AnsiString превышает 255
А если контролировать в процессе набора?
Прямо по событию нажатия клавиши.
А можно просто после нажатия клавиши Enter или любой другой клавиши(впринципе, на любой Event) повесить => код
AnsiString t;
t.ToInt() - вслучае нечислового значения функция выдаст ошибку => перед нами не число...
вот такой "ламерский" спопосб... зато всего 2 строчки...
А если контролировать в процессе набора?
Прямо по событию нажатия клавиши.
Традиционный способ:
TMyEdit::perform(TMessage& msg)
{
if (msg.message!=WM_CHAR || isdigit(msg.wParam))
{
TWdit::perform(msg);
}
};
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.