|
|
Регистрация | << Правила форума >> | 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 и не заморачиваться с обработкой одиночных нажатий.
|