Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно ;проверить наличие только цифр ;в строке?


guest ©   (2003-02-06 11:27:00) 

Есть, допустим, Edi1. Нужно, чтобы пользователь вводил только цифры. Я пробовал так:
function isDigit:boolean;
var
i:integer;
a:array [0..9] of integer;
begin
result:=false;
for i:=1 to length(Edit1.Text) do
begin
if Edit1.Text[i] in a then result:=true;
end;
end;
но компилятор ругается, что делать?


Вованчик   (2003-02-06 16:58:00) [1]

советую вставить в обработчик OnKeyPress
if not (key in ["0".."9", #8]) then key := #27;
#8 - чтобы можно было стирать символы
и все работает просто замечательно


Vovchik_A   (2003-02-06 16:31:00) [2]

Ничего-ничего, я и не претендовал :)


Roma   (2003-02-06 15:31:00) [3]

Ах да, это ж уже было - Vovchik_A (06.02.03 12:34)
Сорри...


Roma   (2003-02-06 15:28:00) [4]

Вот еще один вариант проверки:

function StrIsNumber(const S: string): Boolean;
{ Функция проверки, является ли строковый параметр S числом. }
var
Code: Integer;
V: Double; // или Integer, если нужно пропускать только целые
begin
{$rangechecks on}
Val(S, V, Code);
{$rangechecks off}

Result := Code = 0;
end; // function StrIsNumber(const S: string): Boolean;


Nikolai_S   (2003-02-06 14:29:00) [5]

Пожалуй, это неплохая идея...


Sha   (2003-02-06 13:30:00) [6]

2 Nikolai_S © (06.02.03 12:56)
Весь. Но он подсветится в момент ввода пользователем неверного символа, и благодаря такой моментальной обратной связи, пользователь сразу в процессе ввода исправляет ВСЕ возможные ошибки.


Nikolai_S   (2003-02-06 12:56:00) [7]

2 Sha © (06.02.03 12:45)
А как подсветить в TEdit отдельные символы красным. Или подсвечивается весь текст?


Sha   (2003-02-06 12:45:00) [8]

Попробую тоже предложить свой вариант, на мой взгляд достаточно универсальный.
Позволяем пользователю вводить все, что угодно.
Но по OnChange каждый раз проверяем, допустимо ли значение Text. Если нет - подсвечиваем его красным.
В OnKeyPress и OnKeyDown кроме цифр и BkSp, для чисел я обычно разрешаю точку и запятую, для дат точку, минус и слеш, подменяя их на установленные в системе разделители.
Минус и плюс для чисел стараюсь не разрешать - источник ошибок пользователя.


Vovchik_A   (2003-02-06 12:36:00) [9]

Вдогонку... Пардоне, не внимательно прочитал условие. Так можно проверить есть ли не цифры в строке


Vovchik_A   (2003-02-06 12:34:00) [10]


var
i, code : integer
begin
Val(edit1.text,i, code);
if Code<>0 then ShowMessage("Ошибка в позиции "+IntToStr(Code));
end;


Nikolai_S   (2003-02-06 12:15:00) [11]

Лучше комбинировать 2 варианта:
1. Сначала на событие OnKeyPress вставить запрет ввода ненужных символов:

procedure GetIntChar(var Key: char; AllowNegative: boolean);
var
Digits: set of char;
begin
Digits := [#8, "0".."9"];
if AllowNegative then Digits := Digits + ["-"];
if not (Key in Digits) then Key := #0;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
GetIntChar(Key, False);
end;

Здесь #8 включен для того, чтобы разрешалось нажатие клавиши BackSpace.

2. Затем нужно все равно проверить значение, т.к. в Edit могут вставить текст из буфера обмена или ввести слишком много цифр и т.д.:

function CheckInt(s: string): boolean;
begin
try
StrToInt(s);
Result := True;
except
Result := False;
end;
end;

-------------------
Все это приведено для целых чисел (с учетом положительных, отрицательных). Можно усложнить под конкрентую задачу. Например допускать ввод вещественных чисел и т.д.


Юрий Зотов   (2003-02-06 12:11:00) [12]

> Reindeer Moss Eater (06.02.03 12:04)

1. 39 - это не девятка, а апостроф. Именно поэтому StrToInt даст ошибку, а вовсе не из-за сумасшедщей длины (если Вы это имели в виду).

2. Какое отношение все это имеет к юзерскому вводу в Edit?


Reindeer Moss Eater   (2003-02-06 12:04:00) [13]

Причины для беспокойства все равно будут.

SetLength(MyString,2000000000000);
FillChar(MyString[1],2000000000000,39); //В строке одни "девятки"
StrToInt(MyString);


Юрий Зотов   (2003-02-06 11:54:00) [14]

А еще лучше один раз выставить Edit"у стиль ES_NUMBER и более ни о чем не беспокоиться и ничего не проверять.

См. Get/SetWindowLong и список стилей в CreateWindow.


Андрей Сенченко   (2003-02-06 11:48:00) [15]

TMaskEdit для ввода не подойдет ?


Романов Р.В.   (2003-02-06 11:46:00) [16]

procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(Edit1.Handle, GWL_STYLE, GetWindowLong(Edit1.Handle, GWL_STYLE) or ES_NUMBER);
end;


Anatoly Podgoretsky   (2003-02-06 11:36:00) [17]

Потому ругается что оператор in не применим к массивам.


Reindeer Moss Eater   (2003-02-06 11:30:00) [18]

if Edit1.Text[i] in ["0".."9"] then ...


Наталия   (2003-02-06 11:30:00) [19]

procedure TfMain.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
case ord(key) of
44,48..57,7,127,8: ;
13: SelectNext(Sender as TWincontrol,true,true);
else
key:=chr(7);
end;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо