![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Здравствуйте! В каком обработчика лучше осуществлять контроль ввода данных в edit? Onchanche , keypress или другой? Или с обработкой исключительных ситуаций , а может вместе? Нужно разрешить ввод только действительный чисел, ввод разделителя только один раз (не первый и не последний). Определить какой у пользователя разделитель и.т д. Или же ввести можно и не правильно ,но чтобы автоматически в поле ввода изменилось на правильное.
Последний раз редактировалось Maks19, 10.08.2019 в 09:06. |
|
#4
|
|||
|
|||
|
TMaskEdit - это и есть тот же TEdit, только доработанный для выполнения контроля ввода данных. Он даже унаследован от TEdit (TCustomMaskEdit = class(TCustomEdit).
Посмотреть, как он устроен и как работает, можно в модуле Mask.pas (подведи курсор мыши к слову TMaskEdit в редакторе кода и нажми Ctrl+ЛКМ - откроется исходный код модуля VCL). Последний раз редактировалось DenSarych, 10.08.2019 в 12:47. |
|
#5
|
||||
|
||||
|
Лучше всего использовать событие OnChange. KeyPress не канает, т.к. ошибочные данные могут быть вставлены в Edit из буфера обмена. И самый простой и надёжный способ - это использование механизма исключений (с смысле защищённых блоков). Если отслеживать нажатия кнопок, сильно геморно получится, ведь курсор может стоять в любом месте символьной цепочки, потом жмётся Del или BackSpace, и поди отследи, во что превращается исходное значение. Так что - пост-контроль по событию OnChange. Ну а авто-исправление можно StringReplace-ом сделать, заменяя точки на запятые (в случае более одной запятой в тексте - уж не знаю, как исправлять, так что я бы ваще отказался от такой функции).
Последний раз редактировалось Guaho, 10.08.2019 в 17:08. |
|
#6
|
|||
|
|||
|
Если с помощью функции проверять ввод данных
Код:
function TForm1.IsFloat(ch:char; st:string): Boolean;
begin
if (ch >='0') and (ch <='9') // цифры
or (ch =#13) // клавиша <Enter>
or (ch =#8) // клавиша <Backspace>
then
begin
IsFloat:=True;
Exit;
end;
case ch of
'-': if Length(st)=0 then IsFloat:=True;
',': if (Pos(',',st)=0) and (st[Length(st)]>='0') and (st[Length(st)]<='9') then
IsFloat:=True
else
IsFloat:=False;
end;
end;Код:
procedure TForm1.Edit1Change(Sender: TObject); begin if (Edit1.Text<>'') then Dmin:=strtofloat(Edit1.Text); end; .................. |
|
#7
|
|||
|
|||
|
Вообще, я, например, обычно проверяю в KeyPress
Код:
procedure TForm1.Edit1KeyPress(Sender : Tobject; var Key : Char);
begin
If Not (Key In ['0'..'9','.',#8,#13,'-'])
Then Key := #0
Else
Begin
If (Key = '.') And (Pos('.',Edit1.Text) > 0) Then Key := #0;
If (Key = '-') And (Pos('-',Edit1.Text) > 0) Then Key := #0;
If (Key = '-') And (Edit1.SelStart <> 1) Then Key := #0;
End;
end; |
|
#8
|
|||
|
|||
|
Цитата:
|
|
#9
|
||||
|
||||
|
Цитата:
Код:
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
procedure KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;Код:
procedure TForm1.KeyPress(Sender: TObject; var Key: Char);
begin
If Not (Key In ['0'..'9', '.', #8, #13, '-'])
Then Key := #0
Else
Begin
If (Key = '.') And (Pos('.', (Sender as TEdit).Text) > 0) Then Key := #0;
If (Key = '-') And (Pos('-', (Sender as TEdit).Text) > 0) Then Key := #0;
If (Key = '-') And ((Sender as TEdit).SelStart <> 1) Then Key := #0;
End;
end; |
|
#10
|
|||
|
|||
|
Цитата:
И в чем проблема? Сделать еще одну маленькую проверку и закастить Sender к TEdit? Код:
procedure TForm1.Edit1KeyPress(Sender : Tobject; var Key : Char);
var
Edit : TEdit;
begin
If Not (Sender Is TEdit) Then Exit;
Edit := Sender As TEdit;
If Not (Key In ['0'..'9','.',#8,#13,'-'])
Then Key := #0
Else
Begin
If (Key = '.') And (Pos('.',Edit.Text) > 0) Then Key := #0;
If (Key = '-') And (Pos('-',Edit.Text) > 0) Then Key := #0;
If (Key = '-') And (Edit.SelStart <> 1) Then Key := #0;
End;
end; |
|
#11
|
|||
|
|||
|
Цитата:
|
|
#12
|
|||
|
|||
|
Не, нельзя. Код принимает только точку. А вот с точки начать можно. Ну так дополни проверки. Вообще, если очень лень, то можно просто попробовать конвертировать текст в число в OnExit и не заморачиваться с обработкой одиночных нажатий.
|