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

Вниз

Проверка на ввод нечисловых символов и запятой.   Найти похожие ветки 

 
Neket   (2008-09-24 09:33) [0]

Доброе утро. Подскажите как сделать проверку введенного текста в Edit на наличие буков и если вводится дробное число то чтобы разделитель был "," а не точка.
т.е. доллжны вводится цифры, в том числе и вещественные а если будут буквы или разделитель не запятая а точка то либо самому менять или шоб ошибку выдавало. Заранее благодарен.


 
Vlad Oshin ©   (2008-09-24 09:35) [1]

onKeyPress(...Key:char);
if Key not in ["0".."9",","] then Key:=#0;


 
Сергей М. ©   (2008-09-24 09:38) [2]


> чтобы разделитель был "," а не точка


С пом. StringReplace замени точки на запятые, если таковые имеются.

А что за дискриминация, почему юзеру недозволено использовать в кач-ве разделителя то что ему удобней при вводе ?


> как сделать проверку


Например, с пом. TryStrToFloat


 
Dennis I. Komarov ©   (2008-09-24 09:39) [3]


> Neket   (24.09.08 09:33)  

На каком основании ты навязываешь пользователю свой дробный разделитель? Такой софт должен быть уничтожен до инсталяции...

Использую DecimalSeporator (кажися так пишется) и FloatToStr

Так же в OnChange можно проверять что ввели, а лучше это делать по окончанию ввода


 
Dennis I. Komarov ©   (2008-09-24 09:40) [4]


> и FloatToStr

наоборот...


 
Sergey13 ©   (2008-09-24 09:54) [5]

> [0] Neket   (24.09.08 09:33)

Можно заменить TEdit на компонент, заточенный под ввод именно числовых данных.


 
Neket   (2008-09-24 10:05) [6]

Всем спасибо. Вариант предложенный Vlad Oshin ©   (24.09.08 09:35) [1] подошел очень даже не плохо. Остался только один вопрос. Как плюс ковсему разрешить еще и использование BackSpase. Какой у него код?


 
Поросенок Винни-Пух ©   (2008-09-24 10:08) [7]

A Delete запретить?


 
Neket   (2008-09-24 10:10) [8]

Нее Delit работает.
Поросенок Винни-Пух © - харош глумиться.


 
Сергей М. ©   (2008-09-24 10:10) [9]


> Neket   (24.09.08 10:05) [6]


> Вариант предложенный Vlad Oshin ©   (24.09.08 09:35) [1]
> подошел очень даже не плохо


В нем нет "защиты от дурака" - ничто мешает натыкать, к примеру, кучу запятых, да еще и в "неположенных местах")

К тому же ты ничего не сказал про знак вводимого числа


 
Поросенок Винни-Пух ©   (2008-09-24 10:10) [10]

а стрелки влево/вправо?


 
Поросенок Винни-Пух ©   (2008-09-24 10:12) [11]

В нем нет "защиты от дурака" - ничто мешает натыкать, к примеру, кучу запятых, да еще и в "неположенных местах")

1,000,000.99


 
Neket   (2008-09-24 10:13) [12]

На знак я проверку сделал. А вот касаемо нескольких запятых, то идея хорошая надо будет тоже проверку сделать.
Так какой код у BackSpase?

Поросенок Винни-Пух ©   (24.09.08 10:10) [10] - работают :-)


 
Vlad Oshin ©   (2008-09-24 10:17) [13]

Windows.pas
VK_BACK = 8;


 
Сергей М. ©   (2008-09-24 10:18) [14]


> На знак я проверку сделал


Интересно, какую ?

А код бэкспейса выясни сам - ShowMessage(IntToStr(Ord(Key)))


 
Neket   (2008-09-24 10:22) [15]

> На знак я проверку сделал

Интересно, какую ?

Ды просто запретил его вводить )))))))))))


 
Сергей М. ©   (2008-09-24 10:29) [16]


> Neket   (24.09.08 10:22) [15]


Так это не ты сделал, а Vlad Oshin ©   (24.09.08 09:35) [1])
А ты и пальцем не пошевелил)


 
AndreyV ©   (2008-09-24 10:33) [17]

> [15] Neket   (24.09.08 10:22)
> > На знак я проверку сделал
>
> Интересно, какую ?
> Ды просто запретил его вводить )))))))))))

Хороша проверка для вещественных чисел.
А такое:
+123.456е-2
пользователю запрещщено вводить?


 
Vlad Oshin ©   (2008-09-24 10:38) [18]

а Е, Pi пусть на счетах посчитает предварительно :)


 
Правильный$Вася   (2008-09-24 10:43) [19]

теперь остается запретить вставку из буфера обмена


 
Правильный$Вася   (2008-09-24 10:43) [20]

и можно будет выкидывать на помойку


 
Сергей М. ©   (2008-09-24 10:54) [21]


> Е, Pi пусть на счетах посчитает предварительно


На счетах - это даже неприлично) .. Настоящие джедаи завсегда лорарифмическую линейку пользуют для перевода из scientific-формата в денежный формат) ..


 
Anatoly Podgoretsky ©   (2008-09-24 10:55) [22]

А может ну его нафиг такой ввод?


 
Сергей М. ©   (2008-09-24 10:57) [23]


> может ну его нафиг такой ввод?


Дык об чем и речь !

В общем случае юзеру надо дать полную свободу в тыкании любых кнопок, а проверку корректности введенной им абракадабры осуществлять при потере контролом фокуса ..


 
Vlad Oshin ©   (2008-09-24 11:02) [24]

не, лучше на изменение значения повесится
Если после ввода ткнут в ерунду, которая не получит фокус, но начнет вычисления?


 
Anatoly Podgoretsky ©   (2008-09-24 11:03) [25]

> Сергей М.  (24.09.2008 10:57:23)  [23]

Я так и поступаю, пусть вводят любую ерунду, мое дело отказаться в ее приеме, при том не обязательно при потере фокуса, возможно он еще не кочил ерундить, при нажатие кнопки ОК проверяю.


 
Neket   (2008-09-24 11:22) [26]

Хм... Ну касаемо +123.456е-2 и т.д. Такое они вводить не будут, не смогут да оно и не надо чтобы могли вводить.
А касаемо Anatoly Podgoretsky ©   (24.09.08 11:03) [25]
То проверка основная как раз и проводится по нажати "Ок", просто предложенный вариант в начале является одним из этапов контроля корректности. Кстати на мой взгляд очень удобным.


 
ASoft   (2008-09-24 11:44) [27]


> Кстати на мой взгляд очень удобным

а на
> Dennis I. Komarov ©   (24.09.08 09:39) [3]

наплюем, да?


 
Dennis I. Komarov ©   (2008-09-24 12:25) [28]


> ASoft   (24.09.08 11:44) [27]

Да пусть делает чего хочет... Единственное - жалко того, кто будет пользовать эту поделку. Оно и понятно - скупой платит ...

ЗЫ Обидно когда из серьезных контор приходят такие поделки, и при том отказаться от них низя :(
Вот за это надо таких программистов бить по голове до полного просветления (или наоборот - тут уж как повезет)


 
MsGuns ©   (2008-09-24 12:48) [29]

Код состоит аж из 5 строк, среди которых помимо проверки на символ цифры, разделителя дроби и знака "-" есть еще при последнем проверка уже имеющегося содержимого на "-".
Самому написать ну никах ?


 
Anatoly Podgoretsky ©   (2008-09-24 12:50) [30]


> Neket   (24.09.08 11:22) [26]

Странное понятие об удобстве.


 
Neket   (2008-09-24 14:07) [31]

Т.е. исходя из вышесказанного, наиболее правельно сделать так...
Пользователь вводит значения... Любые. Пускай хоть Войну и Мир в бедный едит вхреначит, а я должен написать "искуственный интелект" который должен распознавать что действительно он хотел ввести?
Не легче ли, на этапе ввода ограничивать пользователя в различных моментах, так сказать "Наставляя его на путь истинный" и чтобы он сам думал что вводит. В любом случае мы как программисты не сможем все предугадать все ходы "дурака" и все описать в алгоритме. Вот и стараемся сделать хоть какую-то "защиту от дурака"

Anatoly Podgoretsky ©   (24.09.08 12:50) [30] Поделитесь своей точкой зрения. Плз....


 
{RASkov} ©   (2008-09-24 14:12) [32]

> [31] Neket   (24.09.08 14:07)
> а я должен написать "искуственный интелект" который должен
> распознавать что действительно он хотел ввести?

Весь этот ИИ и есть, например, StrToFloat или Val


 
Neket   (2008-09-24 14:15) [33]

{RASkov} ©   (24.09.08 14:12) [32]
Ну а кусок примера... Как припомощи процедуры преобразования StrToFloat можно отловить ошибку?


 
Сергей М. ©   (2008-09-24 14:16) [34]


> Neket   (24.09.08 14:07) [31]


Только не воспринимай это как догму ..

Общий случай он и есть общий, а если требуется частный (тот или иной контроль корректности вводимых данных непосредственно в ходе ввода), то почему бы и нет ?


> не сможем все предугадать все ходы "дурака"


А и не надо)

Разработчику достаточно иметь формализованные требования тех.задания, согласованного с Заказчиком, и четко следовать этим требованиям при проектировании и реализации.


 
Vlad Oshin ©   (2008-09-24 14:17) [35]

Иногда бывает так, что заполнив кучу едитов, программа, пип, ругнется, потом начинаешь искать куда надо было что ввести. И это еще хорошо, если не сбросит все в 0.

Имхо, на Изменение надо вешать функцию проверки.
инициализировать значением по умолчанию, для примера.


 
Neket   (2008-09-24 14:18) [36]


А и не надо)
Разработчику достаточно иметь формализованные требования тех.задания, согласованного с Заказчиком, и четко следовать этим требованиям при проектировании и реализации.


Даааа вот в этом-то как-раз и проблема... Этого и нет ))))))))))
Вот и приходится сидеть и пытаться предугадывать ВСЕ....


 
Neket   (2008-09-24 14:20) [37]

Vlad Oshin ©   (24.09.08 14:17) [35]
Ну это если руки уж очень криво растут, или программер ОООЧЕНЬ ленивый.
На самом деле у меня реализована проверка каждого Едита и в случае ошибки пользователь будет оповещен где именно он накосячил.


 
Dennis I. Komarov ©   (2008-09-24 14:21) [38]


> Как припомощи процедуры преобразования StrToFloat можно
> отловить ошибку?

brail.dll подключи, "программист".


 
Neket   (2008-09-24 14:24) [39]

Dennis I. Komarov ©   (24.09.08 14:21) [38]
возможно вы имели ввиду  brain.dll ?


 
{RASkov} ©   (2008-09-24 14:27) [40]

> [33] Neket   (24.09.08 14:15)

try
E:=StrToFloat(Edit.Text);
except
ShowMessage("Ошибка ввода числа "+Edit.Text);
Edit.SetFocus;
end;


А если использовать Val то можно и курсор установить на место первого ошибочного символа...


 
Dennis I. Komarov ©   (2008-09-24 14:28) [41]


> Dennis I. Komarov ©   (24.09.08 14:21) [38]
> возможно вы имели ввиду  brain.dll ?

ее самую...

try exept - знаешь что такое?
в [2] так же есть tryStrToFloat, осталось за малым - почитать хелп, подключив библиотеку...


 
Neket   (2008-09-24 14:31) [42]

Ладно мужики. Спасибо. Реально благодарен всем. Просто есть люди которые программирование на хлеб зарабатываю, а есть те кому приходится время от времени ввиду того что начальство жлобится на новую штатную единицу, писать самому. Вот и такая разница в знаниях. Ещё раз всем спасибо.


 
Vlad Oshin ©   (2008-09-24 14:32) [43]

procedure TForm1.Edit1Change(Sender: TObject);
var
a:double;
i:integer;
s:string;
begin
 if Length(edit1.Text)=0 then exit;
 if not(trystrtofloat(Edit1.Text,a)) then
 begin
   ShowMessage("Неправильное значение. Последний символ удален");
   i:=length(edit1.Text);
   s:=edit1.Text;
   setlength(s,i-1);
   edit1.Text:=s;
 end;
end;


 
{RASkov} ©   (2008-09-24 14:34) [44]

> [43] Vlad Oshin ©   (24.09.08 14:32)

:)
Проще тогда и в самом деле вести контроль допустимых символов. "Легче" алгоритм будет )


 
MsGuns ©   (2008-09-24 14:38) [45]

function CheckSymbolForFloatText(Edit: TEdit; Key: Char): Char;
begin
 result := Key;
 with Edit do
   if not (Key in ["0".."9","-",DecimalSeparator,Char(VK_BACK),Char(VK_TAB)]) or
      ((Key=",") and (Pos(Key,Text)>0)) or
      ((Key="-") and ((Pos(Key,Text)>0) or (SelStart>0))) then result := #0;
end;

В OnKeyPress едита

 Key := CheckSymbolForFloatText(TEdit(Sender),Key)

В  OnChange эдита проверка TryStrToFloat


 
MsGuns ©   (2008-09-24 14:41) [46]

Пардон, вместо запятой при проверке надо поставить сепаратор


 
Anatoly Podgoretsky ©   (2008-09-24 15:03) [47]


> А если использовать Val то можно

Не надо, поскольку системно независима, подходит только для импорта/экспорта.


 
Anatoly Podgoretsky ©   (2008-09-24 15:17) [48]

> Neket  (24.09.2008 14:07:31)  [31]

Ты теперь в другую крайность падаешь.
Никакой искуственный ителлект и прочее не требуется, тип поля известен или целочисленный, или с плавающей запятой и попытка преобразование сразу скажет дурак пользователь или нет, не говоря уже о случаях автоматической проверки по маске, тогда уйти из поля нельзя будет. УЖАС.

Не надо ограничивать пользователя, до закрытия формы, может я хочу сформировать поле коипируя его части из других мест, например из других полей той же формы и запрет на выход не позволит это сделать.
И прикинь, что подумает пользователь - кто из вас двоих дурак?


 
Anatoly Podgoretsky ©   (2008-09-24 15:18) [49]

> Neket  (24.09.2008 14:20:37)  [37]

Как будет оповещен, дело не в проверке - дело в оповещение?



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

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

Наверх




Память: 0.59 MB
Время: 0.017 c
2-1222157170
Анна
2008-09-23 12:06
2008.11.02
Сводная таблица, замена колонки Общий итог на Отклонение


15-1220905107
Riply
2008-09-09 00:18
2008.11.02
Просмоторщик lib файлов.


2-1222334998
deadteachers
2008-09-25 13:29
2008.11.02
Паук-Робот


2-1222450602
berrometr
2008-09-26 21:36
2008.11.02
Delphi 2009


4-1198793355
Domoffou
2007-12-28 01:09
2008.11.02
RichEdit20W - перехват текста