Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.17;
Скачать: CL | DM;

Вниз

Как правильно проверить наличие только цифр в строке?   Найти похожие ветки 

 
guest   (2003-02-06 11:27) [0]

Есть, допустим, 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;
но компилятор ругается, что делать?


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

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


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

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;


 
Anatoly Podgoretsky ©   (2003-02-06 11:36) [3]

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


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

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


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

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


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

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

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


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

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

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


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

> Reindeer Moss Eater (06.02.03 12:04)

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

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


 
Nikolai_S ©   (2003-02-06 12:15) [9]

Лучше комбинировать 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;

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


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


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


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

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


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

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


 
Nikolai_S ©   (2003-02-06 12:56) [13]

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


 
Sha ©   (2003-02-06 13:30) [14]

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


 
Nikolai_S ©   (2003-02-06 14:29) [15]

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


 
Roma ©   (2003-02-06 15:28) [16]

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

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;


 
Roma ©   (2003-02-06 15:31) [17]

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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2003.02.17;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.026 c
4-53330
Groove_
2003-01-07 14:10
2003.02.17
Ещё вопросик возник


1-52964
akvilon
2003-02-09 15:09
2003.02.17
Тип размером в 3 бита


3-52735
VLL
2003-01-30 13:01
2003.02.17
Соединение с Интернетом


1-52874
kernel::panic
2003-02-07 17:05
2003.02.17
Глюк с TEdit в Delphi7


1-53032
Anton
2003-02-10 23:57
2003.02.17
Как выделить две строки в combobox