Войти

Показать полную графическую версию : TEdit и тип AnsiString


Sir Z
31-01-2006, 00:31
Такая ситуация. Необходимо реализовать проверку введенного юзером значения в поле компонента TEdit на форме. Для этого считывать каждый символ в строке и проверять, является ли он цифрой. В обратном случае выводится сообщение об ошибке. Собственно, есть только один вопрос: как узнать, что достигнут конец строки? В стандарных null-terminated строках строка заканчивается символом '\0', а вот как дела обстоят в типе AnsiString, для меня пока что загадка.
Да, еще: почему в AnsiString, когда необходимо обратиться к первому символу в строке, обращаются к элементу [1], а не [0], как везде в C++?
Спасибо

pva
31-01-2006, 12:16
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 - это притянутая за уши паскалевская строка
Предположение - может тогда как в паскале в нулевом байте сидит длина строки?

pva
02-02-2006, 14:20
Нет. Размер строк AnsiString превышает 255

Kroc
03-02-2006, 01:37
А если контролировать в процессе набора?
Прямо по событию нажатия клавиши.

XCodeR
03-02-2006, 01:46
А можно просто после нажатия клавиши Enter или любой другой клавиши(впринципе, на любой Event) повесить => код
AnsiString t;
t.ToInt() - вслучае нечислового значения функция выдаст ошибку => перед нами не число...

вот такой "ламерский" спопосб... зато всего 2 строчки...

pva
15-02-2006, 12:34
А если контролировать в процессе набора?
Прямо по событию нажатия клавиши.
Традиционный способ:

TMyEdit::perform(TMessage& msg)
{
if (msg.message!=WM_CHAR || isdigit(msg.wParam))
{
TWdit::perform(msg);
}
};




© OSzone.net 2001-2012