Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.08.2019, 08:57
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 113
Версия Delphi: Delphi7
Репутация: 10
По умолчанию Контроль ввода данных

Здравствуйте! В каком обработчика лучше осуществлять контроль ввода данных в edit? Onchanche , keypress или другой? Или с обработкой исключительных ситуаций , а может вместе? Нужно разрешить ввод только действительный чисел, ввод разделителя только один раз (не первый и не последний). Определить какой у пользователя разделитель и.т д. Или же ввести можно и не правильно ,но чтобы автоматически в поле ввода изменилось на правильное.

Последний раз редактировалось Maks19, 10.08.2019 в 09:06.
Ответить с цитированием
  #2  
Старый 10.08.2019, 10:07
DenSarych DenSarych вне форума
Прохожий
 
Регистрация: 02.08.2018
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Для этого существует компонент TEditMask
тык
Ответить с цитированием
  #3  
Старый 10.08.2019, 11:00
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 113
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от DenSarych
Для этого существует компонент TEditMask
тык
Понятно что существует. Но речь шла о edit.
Ответить с цитированием
  #4  
Старый 10.08.2019, 12:44
DenSarych DenSarych вне форума
Прохожий
 
Регистрация: 02.08.2018
Сообщения: 11
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

TMaskEdit - это и есть тот же TEdit, только доработанный для выполнения контроля ввода данных. Он даже унаследован от TEdit (TCustomMaskEdit = class(TCustomEdit).

Посмотреть, как он устроен и как работает, можно в модуле Mask.pas (подведи курсор мыши к слову TMaskEdit в редакторе кода и нажми Ctrl+ЛКМ - откроется исходный код модуля VCL).

Последний раз редактировалось DenSarych, 10.08.2019 в 12:47.
Ответить с цитированием
  #5  
Старый 10.08.2019, 17:01
Аватар для Guaho
Guaho Guaho вне форума
Начинающий
 
Регистрация: 27.08.2017
Сообщения: 173
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Лучше всего использовать событие OnChange. KeyPress не канает, т.к. ошибочные данные могут быть вставлены в Edit из буфера обмена. И самый простой и надёжный способ - это использование механизма исключений (с смысле защищённых блоков). Если отслеживать нажатия кнопок, сильно геморно получится, ведь курсор может стоять в любом месте символьной цепочки, потом жмётся Del или BackSpace, и поди отследи, во что превращается исходное значение. Так что - пост-контроль по событию OnChange. Ну а авто-исправление можно StringReplace-ом сделать, заменяя точки на запятые (в случае более одной запятой в тексте - уж не знаю, как исправлять, так что я бы ваще отказался от такой функции).

Последний раз редактировалось Guaho, 10.08.2019 в 17:08.
Ответить с цитированием
  #6  
Старый 13.08.2019, 20:55
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 113
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Если с помощью функции проверять ввод данных
Код:
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  
Старый 14.08.2019, 04:43
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вообще, я, например, обычно проверяю в 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  
Старый 14.08.2019, 10:59
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 113
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Вообще, я, например, обычно проверяю в 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;
Как-то так...
Но функцию можно прописать один раз, а обработчик keypress надо для каждого edita.
Ответить с цитированием
  #9  
Старый 14.08.2019, 14:13
Аватар для Kailon
Kailon Kailon вне форума
Активный
 
Регистрация: 06.06.2010
Сообщения: 339
Версия Delphi: 10.4
Репутация: 429
Сообщение

Цитата:
Сообщение от Maks19
Но функцию можно прописать один раз, а обработчик keypress надо для каждого edita.
Добавляем процедуру к классу нашей формы
Код:
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    procedure KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
Затем жмем Ctrl+Shift+C и чуть-чуть переделываем код предоставленный lmikle
Код:
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;
Потом для каждого Edit'a в событии OnKeyPress нужно выбрать нашу процедуру KeyPress. Вот и всё. Теперь каждый Edit будет работать согласно нашей процедуре.
__________________
Всегда пишите код так, будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете.
Ответить с цитированием
  #10  
Старый 14.08.2019, 20:42
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Maks19
Но функцию можно прописать один раз, а обработчик keypress надо для каждого edita.

И в чем проблема? Сделать еще одну маленькую проверку и закастить 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;
И назначай этот же обработчик всем Edit'ам...
Ответить с цитированием
  #11  
Старый 14.08.2019, 23:09
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 113
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Kailon
Добавляем процедуру к классу нашей формы
Код:
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    procedure KeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
Затем жмем Ctrl+Shift+C и чуть-чуть переделываем код предоставленный lmikle
Код:
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;
Потом для каждого Edit'a в событии OnKeyPress нужно выбрать нашу процедуру KeyPress. Вот и всё. Теперь каждый Edit будет работать согласно нашей процедуре.
А если надо чтобы по нажатию enter передавался фокус ввода от edit 1 к edit 2 от edit 2 к третьему и т.д то как сделать?
Ответить с цитированием
  #12  
Старый 15.08.2019, 04:46
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Как-то так:
Код:
If Key = #13 Then Self.SelectNext(Edit,True,True);

PS. Kalion, ничего переделывать не надо. И самому писать процедуру тоже не надо. Выделяем один TEdit, переходит в Object Inspector на вкладку с событиями, выделяем OnKeyPress, пишем желаемое имя и жмем Enter. Дальше среда сделает все сама - и заголовок, и пустую реализацию.
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
Kailon (15.08.2019)
  #13  
Старый 15.08.2019, 21:10
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 113
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Как-то так:
Код:
If Key = #13 Then Self.SelectNext(Edit,True,True);
А в каком обработчике этот код , в keypress?
Ответить с цитированием
  #14  
Старый 16.08.2019, 01:11
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Все в том же OnKeyPress
Ответить с цитированием
  #15  
Старый 21.08.2019, 15:53
Maks19 Maks19 вне форума
Начинающий
 
Регистрация: 19.06.2019
Сообщения: 113
Версия Delphi: Delphi7
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
Все в том же OnKeyPress
Если написать
Код:
If Key = #13 Then Self.SelectNext(Edit1,True,True);
Если написать только один раз, в одном обработчике keypress. То будет переход от edit1 к edit2. А как сделать переход от edit 2 к edit 3 ?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:15.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter