![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по Teidt??? [D6, Win95/98]
antonyo © (2002-05-23 12:19:00)Как сделать так чтобы в обычном edit вводились только числа!!!
Andrey007 (2002-05-24 09:49:00) [1]Ну, в общем, понятно, что если числа целые, то надо использовать TSpinEdit. А вот в случае с вещественными числами проще обрабатывать по OnKeyPress не каждое нажатие, а окончание ввода. Например
if key=#13 then
try
StrToInt(Edit1.Text);
...
except
ShowMessage("Облом!")
end;
Delphi5.01 (2002-05-24 08:17:00) [2]da zachem takie gori prog kotorie fakticheski delaut odno i toje prosto porabotaem mozgami i soblerom odnu celuu progu is otvetov. esli trudno vso v valit v odin Case razdelim proverku na dve chasti pervoie proverim na nalichii cifr
Case Key Of
"0".."9": ; //nichego ne delaem
#8, #13 : ; //Backspase i Del razreshaetsa vse propustili #13
"-" : if Edit.Text<>"" then ; //moojno nabrat minus esli esho nichego ne nabralos
"e", "E": If (Edit.Text<>"")and(Edit.Text[Length(Edit.Text)]<>"-")and(Edit.Text[Length(Edit.Text)]<>"e") then ; //mojno nabrat e esli do six por nabrano chto libo a takje esli poslednaa ccifra ne "-" esli "-" znachit nbran tolko odin simvol smotrite tretuu stroku casea, nu i konechno doljen bit nabrana cifra kakaiat
Else : Key:=#0;
end;
vot i proverka konchilas a vot teper esle
If Edit.Text<>"" then begin
//zdes vishitivaem eto chislo
end;
Proton (2002-05-23 20:08:00) [3]Повесь вот это на OnCreate
SetWindowLong(Edit1.Handle,GWL_STYLE,
GetWindowLong(Edit1.Handle,GWL_STYLE) or ES_NUMBER);
Johnmen (2002-05-23 17:30:00) [4]MaskEditне даст универсальности представления чисел...
Вообще то надо придти к компромиссу и остановиться на нем...
MaximatorVeter (2002-05-23 17:16:00) [5]Вообще-то проблема не такая простая как кажется.
Языки специальные пишут для разбора строк (Perl).
А про регулярные выражения слышали!
> Goblinus (23.05.02 15:15)
> А Вы пробовали использовать компонент MaskEdit, входящий
> в Delphi 6?
Да, проще этот вариант использовать. MaskEdit и более ранних версиях есть.
С уважением, Максим.
PVOzerski (2002-05-23 15:40:00) [6]2Johnmen ©:
>то анализ надо делать по завершении процесса ввода, или, извращаясь, налету...
А в итоге я пришел примерно к этому же:
1) Если вводятся целые положительные числа, подобные фильтры допустимы безусловно.
2) Во всех отальных случаях проверку всё-таки лучше делать по окончании ввода. Еще
один аргумент против использования фильтров в общем случае: если корректно введенное
число будет нуждаться в редактировании, в его ходе фильтр может вызвать проблемы.
Пример:
Хотели ввести -1e-1
Ввели по ошибке -2e-1
Хватились, попытались стереть двойку, чтобы потом заменить единицей, и...
Johnmen (2002-05-23 15:32:00) [7]>MaximatorVeter © (23.05.02 15:11)
Прости, не заметил - действительно ты...
>PVOzerski © (23.05.02 15:16)
Согласен ! Признаю ошибки и неточности !
И поскольку заранее неизвестно, а что же хочет ввести юзер,
то анализ надо делать по завершении процесса ввода, или, извращаясь, налету...
PVOzerski (2002-05-23 15:16:00) [8]Ох, и легко мне сейчас всех критиковать: я-то исходников не дал,
ограничился рассуждениями :^)
Так что в порядке и самокритики тоже - проблему-то у себя не
заметил, а она та же, что у Johnmen © (23.05.02 14:09).
А давайте попробуем ввести в Edit число -1 , при использовании
функции от Johnmen © (23.05.02 14:09):
Введем мы 1-й символ - минус - а он и не введётся. Потому что
StrToFloat("-"); - exception гарантированно. То же случится при вводе,
скажем, 1e-10 : "затык" на минусе (равно как и на плюсе). Я сейчас
вспоминаю, как сам это решал... Кажется, в случае неуспеха val
временно добавлял в конец проверяемой строки дополнительную цифру.
А в остальном решение Johnmen"а меня устраивает. То, что я наворачивал, -
скорее дополнительные фичи, чем удержание решения в рамках
поставленной задачи. Но в самом деле, например, по умолчанию
десятичный разделитель при locale=Russia почему-то запятая (я всегда
переопределяю на точку в Виндах). В результате при активной
русской раскладке на NumPad набирается запятая, при английской - точка.
А почему при быстром наборе чисел у пользователя должна болеть голова о
том, какая раскладка у него сейчас включена? То же - при копировании
чисел из Clipboard"а. А у меня в одной проге и запятая, и точка приводится
к одному и тому же знаку на этапе ввода текста (правда, в приведённом
мной выше алгоритме этого, опять же, нет).
Skif (2002-05-23 15:16:00) [9]Упс, не заметил в procedure procedure TForm1.ManRAMKeyPress(Sender: TObject; var Key: Char);
должен стоять procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
Skif (2002-05-23 15:16:00) [10]Упс, не заметил в procedure TForm1.ManRAMKeyPress(Sender: TObject; var Key: Char);
должен стоять procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
Goblinus (2002-05-23 15:15:00) [11]А Вы пробовали использовать компонент MaskEdit, входящий в Delphi 6?
MaximatorVeter (2002-05-23 15:11:00) [12]
> Johnmen © (23.05.02 15:05)
> >MaximatorVeter © (23.05.02 15:01)
> Ну вот ты и сам увлекся указанным способом ! :-)
Мне казалось, что я его предложил ...
MaximatorVeter (2002-05-23 15:08:00) [13]
> "И незачем так орать"... :)
> Почему ?
Потому что до присвоения Text:=OldText они равны и OldText не хранит старого значения ...
Johnmen (2002-05-23 15:05:00) [14]>MaximatorVeter © (23.05.02 15:01)
Ну вот ты и сам увлекся указанным способом ! :-)
Skif (2002-05-23 15:04:00) [15]procedure TForm1.ManRAMKeyPress(Sender: TObject; var Key: Char);
var
dlstroki: integer; //длина строки
begin
case key of
"0".."9" : begin //вводимые символы
if not(Key in [#8,"0".."9"]) then Key := #0;
dlstroki:=StrLen(PChar(Edit1.Text));//определ длину строки
if dlstroki>3 then Key := #0;
end;
#8: //разрешение использовать пробел
else key:=#0;//на остальные
end;
end;
Только у меня здесь еще и ограничение по количеству вводимых символов!
Johnmen (2002-05-23 15:01:00) [16]>MaximatorVeter © (23.05.02 14:55)
"И незачем так орать"... :)
Почему ?
MaximatorVeter (2002-05-23 15:01:00) [17]Как насчет этого примера.
implementation
var
st:string;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
st:=Edit1.Text;
end;
procedure TForm1.Edit1Change(Sender: TObject);
begin
try
StrToFloat(Edit1.Text);
except
if Edit1.Text<> "" then Edit1.Text:=st; // для удаления первого символа
end;
end;
из ряда
111
11.1
1.1.1
11,1
11.1,1
1e+11
-10
1-1+2
работает все кроме строк с точками (разделители тысяч).
Событие Edit1KeyPress наступает первым.
P.S. Побочный эффект - при попытки ввода недопустимого символа курсор возвращется в начало поля Edit1.
MaximatorVeter (2002-05-23 14:55:00) [18]
> Johnmen © (23.05.02 14:09)
> Я бы развил идею Song © (23.05.02 13:12) :
> procedure TForm1.Edit1Change(Sender: TObject);
> begin
> With Edit1 Do
> try
> StrToFloat(Text);
> OldText:=Text;
> except
> Text:=OldText;
> end;
> end;
>
> OldText - понятно, поэтому опускаю...
ЭТО НЕ РАБОТАЕТ!
Johnmen (2002-05-23 14:42:00) [19]>PVOzerski © :
А все-таки, чем не нравится идея
Song © (23.05.02 13:12) + Johnmen © (23.05.02 14:09)
xGrey (2002-05-23 14:41:00) [20]2PVOzerski
А зачем такие сложности? Можно просто не давать вводить "лишние символы".
В приведенном мной примере можно ввести любую цифру, один разделитель целой/дробной части (опред. в лок. настр. Windows) ,один минус, если он первый и стереть любой символ. Все остальное блокируется, в т.ч вставка из буфера.
IHMO, стороки вида 1e+11 и 1-1+2 не несут смысловой нагрузки для пользователя.