![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по Teidt??? [D6, Win95/98]
antonyo © (2002-05-23 12:19:00)Как сделать так чтобы в обычном edit вводились только числа!!!
PVOzerski (2002-05-23 14:34:00) [21]2MaximatorVeter © (23.05.02 14:26)
А я не говорил, что 1-1+2 в данном случае должно восприниматься как число.
Но подразумевалось, что, например, минус должно быть позволено вводить
первым символом или после e, но не после цифры, как в данном примере. Впрочим,
одно я в своём алгоритме, действительно, упустил - обработку стирания символов.
MaximatorVeter (2002-05-23 14:26:00) [22]
> PVOzerski
...
> 1-1+2
Переходим к написанию калькулятора ...
Johnmen (2002-05-23 14:22:00) [23]>PVOzerski © (23.05.02 14:18) :
Нормально обойдутся (некоторые) :0)
PVOzerski (2002-05-23 14:18:00) [24]Народ,
вот примеры нескольких строк, и подумайте,
как с ними обойдутся предлагаемые Вами алгоритмы и как бы надо:
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:09:00) [25]Я бы развил идею 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 - понятно, поэтому опускаю...
Goblinus (2002-05-23 14:03:00) [26]Пардон! В TForm1.Edit1KeyPress
Goblinus (2002-05-23 14:00:00) [27]>>>>> А числа бывают не только целые :)))
Обьяви глобальную переменную 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 под рукой нет, но вроде бы должно работать :-)
Song (2002-05-23 13:58:00) [28]Тогда нужно делать StrToFloat() для всей строки а не последней её букве.
MaximatorVeter (2002-05-23 13:56:00) [29]
>
> Song © (23.05.02 13:12)
> ...
> Delete(Text,Length(Text),1);
> end;
Попробуй откомпилировать ...
Johnmen (2002-05-23 13:52:00) [30]да просто StrToInt(); -> StrToFloat()
>Song © (23.05.02 13:12) : А идея неплоха !
Song (2002-05-23 13:47:00) [31]Johnmen © (23.05.02 13:45) Да, для этого нужно другое решение..
Johnmen (2002-05-23 13:45:00) [32]>Song © (23.05.02 13:12) : А числа бывают не только целые :)))
Song (2002-05-23 13:12:00) [33]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;
xGrey (2002-05-23 13:11:00) [34]
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;
MaximatorVeter (2002-05-23 12:59:00) [35]
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not ( Key in ["0".."9",#8] ) then key:=#0;
end;
Johnmen (2002-05-23 12:49:00) [36]Обрабатывай OnKeyPress
Кулюкин Олег (2002-05-23 12:49:00) [37]Если нужны только целые числа, то в обработчике события OnKeyPress проверяем Key, если код нажатой клавиши не соответствует цифре или клавише Забой (#8), то Key := 0
MaximatorVeter (2002-05-23 12:46:00) [38]
> Drakan
Верно! Я предложил идею.
> а если не получится, то убрать его.
Видимо без доп. переменной не обойтись ...
Drakan (2002-05-23 12:39:00) [39]>MaximatorVeter
Лучше попробовать превратить в число последний символ Edit"а,
а если не получится, то убрать его.
MaximatorVeter (2002-05-23 12:33:00) [40]грубо можно сделать через событие onChange:
procedure TForm1.Edit1Change(Sender: TObject);
begin
try
StrToInt(Edit1.Text);
except
Edit1.Text:="";
end;
end;