Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   TEdit и тип AnsiString (http://forum.oszone.net/showthread.php?t=60342)

Sir Z 31-01-2006 00:31 399169

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

pva 31-01-2006 12:16 399315

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 399337

Цитата:

AnsiString - это притянутая за уши паскалевская строка
Предположение - может тогда как в паскале в нулевом байте сидит длина строки?

pva 02-02-2006 14:20 399980

Нет. Размер строк AnsiString превышает 255

Kroc 03-02-2006 01:37 400246

А если контролировать в процессе набора?
Прямо по событию нажатия клавиши.

XCodeR 03-02-2006 01:46 400250

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

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

pva 15-02-2006 12:34 406777

Цитата:

А если контролировать в процессе набора?
Прямо по событию нажатия клавиши.
Традиционный способ:
Код:

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



Время: 14:51.

Время: 14:51.
© OSzone.net 2001-