Главная страница
    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.48 MB
Время: 0.009 c
14-53221
Axis_of_Evil
2003-01-31 11:52
2003.02.17
Бывают ли встречи Мастаков в Москве (Области)?


3-52800
Чайник
2003-01-29 18:52
2003.02.17
Ширина колонок в Гриде


7-53302
SPIRIT
2002-12-17 16:50
2003.02.17
Свой DESKTOP


3-52767
Соловьев
2003-01-29 18:12
2003.02.17
При добавлении записи не срабатывает тригер?


14-53231
SniZ
2003-01-31 00:32
2003.02.17
Как написать программу патчер





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский