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

Вниз

Вопрос по Teidt???   Найти похожие ветки 

 
antonyo   (2002-05-23 12:19) [0]

Как сделать так чтобы в обычном edit вводились только числа!!!


 
Drakan   (2002-05-23 12:25) [1]

Компонент где-то видел - Edit только для чисел.
Поищи где-нибудь на torry.


 
MaximatorVeter   (2002-05-23 12:33) [2]

грубо можно сделать через событие onChange:
procedure TForm1.Edit1Change(Sender: TObject);
begin
try
StrToInt(Edit1.Text);
except
Edit1.Text:="";
end;
end;


 
Drakan   (2002-05-23 12:39) [3]

>MaximatorVeter
Лучше попробовать превратить в число последний символ Edit"а,
а если не получится, то убрать его.


 
MaximatorVeter   (2002-05-23 12:46) [4]


> Drakan

Верно! Я предложил идею.

> а если не получится, то убрать его.

Видимо без доп. переменной не обойтись ...



 
Кулюкин Олег   (2002-05-23 12:49) [5]

Если нужны только целые числа, то в обработчике события OnKeyPress проверяем Key, если код нажатой клавиши не соответствует цифре или клавише Забой (#8), то Key := 0


 
Johnmen   (2002-05-23 12:49) [6]

Обрабатывай OnKeyPress


 
MaximatorVeter   (2002-05-23 12:59) [7]

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not ( Key in ["0".."9",#8] ) then key:=#0;
end;


 
xGrey   (2002-05-23 13:11) [8]


procedure TSomeForm.SomeEditKeyPress(Sender: TObject; var Key: Char);
begin
if not (key in ["1","2","3","4","5","6","7","8","9","0",chr(8),chr(45),decimalseparator])
then
begin
key:=#0;
exit;
end;

if key=decimalseparator
then
begin
if pos(decimalseparator,(Sender as TEdit).text)<>0
then key:=#0;
exit;
end;

if key=chr(45)
then
begin
if ((Sender as TEdit).SelStart<>0)
then key:=#0;
end;
end;


 
Song   (2002-05-23 13:12) [9]

2MaximatorVeter © (23.05.02 12:59)
Предущее твоё творение конечно работать не будет.. но его можно подправить.. мне понравилось, интересный вариант

procedure TForm1.Edit1Change(Sender: TObject);
begin
With Edit1 Do
try
StrToInt(Text[Length(Text)]);
except
Delete(Text,Length(Text),1);
end;
end;


 
Johnmen   (2002-05-23 13:45) [10]

>Song © (23.05.02 13:12) : А числа бывают не только целые :)))


 
Song   (2002-05-23 13:47) [11]

Johnmen © (23.05.02 13:45) Да, для этого нужно другое решение..


 
Johnmen   (2002-05-23 13:52) [12]

да просто StrToInt(); -> StrToFloat()
>Song © (23.05.02 13:12) : А идея неплоха !


 
MaximatorVeter   (2002-05-23 13:56) [13]


>
> Song © (23.05.02 13:12)
> ...
> Delete(Text,Length(Text),1);
> end;


Попробуй откомпилировать ...


 
Song   (2002-05-23 13:58) [14]

Тогда нужно делать StrToFloat() для всей строки а не последней её букве.


 
Goblinus   (2002-05-23 14:00) [15]

>>>>> А числа бывают не только целые :)))

Обьяви глобальную переменную KeyFlag = 0;

в TForm1.KeyPress:

if (key > "0") and (key < "9") KeyFlag = 1
else KeyFlag = 0;
if not (key = ".") and (KeyFlag = 1) key := #0;
else KeyFlag = 0 // Чтобы не дать ввести >1 точки


Delphi под рукой нет, но вроде бы должно работать :-)


 
Goblinus   (2002-05-23 14:03) [16]

Пардон! В TForm1.Edit1KeyPress


 
Johnmen   (2002-05-23 14:09) [17]

Я бы развил идею 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 - понятно, поэтому опускаю...


 
PVOzerski   (2002-05-23 14:18) [18]

Народ,
вот примеры нескольких строк, и подумайте,
как с ними обойдутся предлагаемые Вами алгоритмы и как бы надо:

111
11.1
1.1.1
11,1
11.1,1
1e+11
-10
1-1+2

Это я к тому, что лучше использовать разбор строки, который уже есть в RTL,
чем изобретать (хотя это и не возбраняется). Мой подход в данной задаче
(а доводилось и мне её решать):

1) Перехватить очередной вводимый символ;
2) Собрать строку из уже накопившегося текста и этого символа;
3) Убрать разделители тысяч (если есть), заменить текущий десятичный
разделитель на точку;
4) Получившуюся строку "скормить" процедуре val;
5) Если 2-й параметр, передаваемый в val, стал 0, "пропустить" символ к
стандартному обработчику события.


 
Johnmen   (2002-05-23 14:22) [19]

>PVOzerski © (23.05.02 14:18) :
Нормально обойдутся (некоторые) :0)


 
MaximatorVeter   (2002-05-23 14:26) [20]


> PVOzerski
...
> 1-1+2

Переходим к написанию калькулятора ...


 
PVOzerski   (2002-05-23 14:34) [21]

2MaximatorVeter © (23.05.02 14:26)
А я не говорил, что 1-1+2 в данном случае должно восприниматься как число.
Но подразумевалось, что, например, минус должно быть позволено вводить
первым символом или после e, но не после цифры, как в данном примере. Впрочим,
одно я в своём алгоритме, действительно, упустил - обработку стирания символов.


 
xGrey   (2002-05-23 14:41) [22]

2PVOzerski
А зачем такие сложности? Можно просто не давать вводить "лишние символы".
В приведенном мной примере можно ввести любую цифру, один разделитель целой/дробной части (опред. в лок. настр. Windows) ,один минус, если он первый и стереть любой символ. Все остальное блокируется, в т.ч вставка из буфера.
IHMO, стороки вида 1e+11 и 1-1+2 не несут смысловой нагрузки для пользователя.


 
Johnmen   (2002-05-23 14:42) [23]

>PVOzerski © :
А все-таки, чем не нравится идея
Song © (23.05.02 13:12) + Johnmen © (23.05.02 14:09)


 
MaximatorVeter   (2002-05-23 14:55) [24]


> 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 - понятно, поэтому опускаю...



ЭТО НЕ РАБОТАЕТ!


 
MaximatorVeter   (2002-05-23 15:01) [25]

Как насчет этого примера.

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.


 
Johnmen   (2002-05-23 15:01) [26]

>MaximatorVeter © (23.05.02 14:55)
"И незачем так орать"... :)
Почему ?


 
Skif   (2002-05-23 15:04) [27]

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:05) [28]

>MaximatorVeter © (23.05.02 15:01)
Ну вот ты и сам увлекся указанным способом ! :-)


 
MaximatorVeter   (2002-05-23 15:08) [29]


> "И незачем так орать"... :)
> Почему ?


Потому что до присвоения Text:=OldText они равны и OldText не хранит старого значения ...


 
MaximatorVeter   (2002-05-23 15:11) [30]


> Johnmen © (23.05.02 15:05)
> >MaximatorVeter © (23.05.02 15:01)
> Ну вот ты и сам увлекся указанным способом ! :-)


Мне казалось, что я его предложил ...


 
Goblinus   (2002-05-23 15:15) [31]

А Вы пробовали использовать компонент MaskEdit, входящий в Delphi 6?


 
PVOzerski   (2002-05-23 15:16) [32]

Ох, и легко мне сейчас всех критиковать: я-то исходников не дал,
ограничился рассуждениями :^)

Так что в порядке и самокритики тоже - проблему-то у себя не
заметил, а она та же, что у 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) [33]

Упс, не заметил в procedure procedure TForm1.ManRAMKeyPress(Sender: TObject; var Key: Char);
должен стоять procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);



 
Skif   (2002-05-23 15:16) [34]

Упс, не заметил в procedure TForm1.ManRAMKeyPress(Sender: TObject; var Key: Char);
должен стоять procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);



 
Johnmen   (2002-05-23 15:32) [35]

>MaximatorVeter © (23.05.02 15:11)
Прости, не заметил - действительно ты...
>PVOzerski © (23.05.02 15:16)
Согласен ! Признаю ошибки и неточности !

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


 
PVOzerski   (2002-05-23 15:40) [36]

2Johnmen ©:
>то анализ надо делать по завершении процесса ввода, или, извращаясь, налету...
А в итоге я пришел примерно к этому же:
1) Если вводятся целые положительные числа, подобные фильтры допустимы безусловно.
2) Во всех отальных случаях проверку всё-таки лучше делать по окончании ввода. Еще
один аргумент против использования фильтров в общем случае: если корректно введенное
число будет нуждаться в редактировании, в его ходе фильтр может вызвать проблемы.
Пример:

Хотели ввести -1e-1
Ввели по ошибке -2e-1
Хватились, попытались стереть двойку, чтобы потом заменить единицей, и...


 
MaximatorVeter   (2002-05-23 17:16) [37]

Вообще-то проблема не такая простая как кажется.
Языки специальные пишут для разбора строк (Perl).
А про регулярные выражения слышали!



> Goblinus (23.05.02 15:15)
> А Вы пробовали использовать компонент MaskEdit, входящий
> в Delphi 6?


Да, проще этот вариант использовать. MaskEdit и более ранних версиях есть.

С уважением, Максим.


 
Johnmen   (2002-05-23 17:30) [38]

MaskEdit не даст универсальности представления чисел...
Вообще то надо придти к компромиссу и остановиться на нем...


 
Proton   (2002-05-23 20:08) [39]

Повесь вот это на OnCreate
SetWindowLong(Edit1.Handle,GWL_STYLE,
GetWindowLong(Edit1.Handle,GWL_STYLE) or ES_NUMBER);


 
Delphi5.01   (2002-05-24 08:17) [40]

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;



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

Форум: "Основная";
Текущий архив: 2002.06.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.007 c
14-18098
mimino
2002-04-29 09:24
2002.06.06
kak?


1-17977
Дельфятник
2002-05-28 13:00
2002.06.06
OnMouseMove по ScrollBar y ListBox a.


3-17778
Dimaiv
2002-05-15 08:08
2002.06.06
Поиск для русских слов учитывает регистр, а для английских нет


7-18173
Brand
2002-03-10 00:46
2002.06.06
Завершение Windows


3-17803
Cranium
2002-05-14 12:20
2002.06.06
Поля со списком в IB





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