Текущий архив: 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.48 MB
Время: 0.009 c