Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по Teidt??? [D6, Win95/98]


Страницы:   1 2 3

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;


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо