Форум: "Основная";
Текущий архив: 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