Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.02.17;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.01 c
14-53283
Шишкин Илья
2003-02-02 11:39
2003.02.17
Кто-нибудь знает ссылку, где можно увидеть свой IP?


1-53065
me2
2003-02-06 09:30
2003.02.17
Дополнительное свойство у узла компонента TreeView


1-52910
___Nikolay
2003-02-08 16:18
2003.02.17
Что сделать, чтобы работала команда Copy в TWebBrowser-e?


14-53239
race1
2003-02-01 11:32
2003.02.17
mp3


7-53310
Sanyok
2002-12-16 19:14
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский