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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.12.2011, 23:08
Аватар для Ranmabaka
Ranmabaka Ranmabaka вне форума
Прохожий
 
Регистрация: 04.12.2011
Сообщения: 5
Репутация: 10
Вопрос Ограничение ввода количества цифр до и после точки

Здравствуйте!
Есть программа которая считывает построчно данные из файла (только цифры) и записывает каждую строку в отдельный memo. Потом данные в каждом memo редактируются и записываются обратно в файл. И возник вопрос, как сделать так чтобы пользователь при редактировании данных в memo не смог ввести больше шести цифр до точки и не более трех цифр после точки, при этом если он ,к примеру, уже ввел шесть цифр, то пока он не поставит точку оставшиеся три цифры он ввести не сможет.
Например, в mmo1 записано число "123456.789" и пользователь изменяет его на "7654321.77789" (7 цифр до точки и 5 после) и это у него не должно получится т.е. он сможет ввести только "765432" (шесть цифр) и пока точку не поставит ввести "77789" он не сможет, но и "77789" он тоже не должет суметь ввести, а как только он введет "777" (три цифры) то дальнейший ввод данных уже будет не возможен.
Я уже сделал так что можно вводить только цифры и только одну точку, а вот как быть с ограничениями на ввод данных не могу разобраться. Может кто уже сталкивался с похожим? Подскажите решение пожалуйста.

P.S. Первое число не обязательно должно быть шесть цифр так же как и второе не обязательно три т.е. может быть "101.54" или даже "0." (точка и хотя бы одно число перед точкой всегда должны быть обязательно).
P.S.S. Вариант "сделать проверку при записи в файл и если что дергать пользователя" не подходит т.к. нужно делать проверку именно в процессе редактирования.

Последний раз редактировалось Ranmabaka, 04.12.2011 в 23:19.
Ответить с цитированием
  #2  
Старый 04.12.2011, 23:27
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Зачем для этого нужен TMemo, TEdit недостаточно?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #3  
Старый 05.12.2011, 00:05
Аватар для Ranmabaka
Ranmabaka Ranmabaka вне форума
Прохожий
 
Регистрация: 04.12.2011
Сообщения: 5
Репутация: 10
По умолчанию

Потому что в TMemo есть выравнивание по правому краю, а в TEdit нет. Да и замена TMemo на TEdit проблему мне так кажется не решит

Последний раз редактировалось Ranmabaka, 05.12.2011 в 00:08.
Ответить с цитированием
  #4  
Старый 05.12.2011, 00:10
m1sclick m1sclick вне форума
Начинающий
 
Регистрация: 04.07.2011
Адрес: Украина
Сообщения: 186
Версия Delphi: 2010
Репутация: 2094
По умолчанию

MaskEdit...
Ответить с цитированием
  #5  
Старый 05.12.2011, 00:14
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Ranmabaka
Потому что в TMemo есть выравнивание по правому краю, а в TEdit нет. Да и замена TMemo на TEdit проблему мне так кажется не решит
Такое выравнивание в TEdit имеется, просто оно неявное. А по сути TMemo и TEdit одно и тоже, просто TEdit для этих дел кажется удобнее, и как сказали выше, TMaskEdit ещё удобнее.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #6  
Старый 05.12.2011, 00:40
Аватар для Ranmabaka
Ranmabaka Ranmabaka вне форума
Прохожий
 
Регистрация: 04.12.2011
Сообщения: 5
Репутация: 10
Смех

angvelem
m1sclick
Спасибо большое за помощь! Все теперь как надо вводится
Ответить с цитированием
  #7  
Старый 05.12.2011, 01:47
Аватар для Ranmabaka
Ranmabaka Ranmabaka вне форума
Прохожий
 
Регистрация: 04.12.2011
Сообщения: 5
Репутация: 10
По умолчанию

Хотя нет, я немного поторопился T_T
Сделал шаблон "999999/999;1; " и теперь проблема в том, что если пользователю нужно ввести не шесть цифр, а к примеру три, то эти три цифры остаются слева и потом три " " и получается например "123 .456". Можно как-нибудь сделать так что при вводе цифр перед точкой они вводились от точки, а не слева на право?
Ответить с цитированием
  #8  
Старый 05.12.2011, 01:56
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Переопределить TCustomMaskEdit под свои нужды.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #9  
Старый 05.12.2011, 05:51
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну тут задача очень специфическая. Может проще просто "сесть" на OnKeyPress и его обработать? Собственно, по SelStart можно понять куда пытаются вставить цифру, Pos - получить наличие и положение точки. Дальше просто аккуратно прописать условия.

Ну а еще проще контролировать результат на OnExit (потеря фокуса). Тогда пользователь пусть вводит что угодно (ну тоже ограничить, например, только цифры и точку), а при уходе с контрола просто проверить результат и не дать уходить.
Ответить с цитированием
  #10  
Старый 05.12.2011, 17:49
Аватар для Ranmabaka
Ranmabaka Ranmabaka вне форума
Прохожий
 
Регистрация: 04.12.2011
Сообщения: 5
Репутация: 10
По умолчанию

Вообщем с TCustomEditMask у меня как-то не срослось и поэтому я решил плясать от TMemo + меня вчера перед сном осенила одна мысль и вот я добрался до Делфи и сделал

Код:
procedure TForm1.mmo1KeyPress(Sender: TObject; var Key: Char);
Var a:integer;
begin
if mmo1.Text='.' then key:=#0;
if mmo1.Text=' ' then key:=#0;
if key in['0'..'9','.','+','-',#8] then begin
   if key='.' then begin
      For a:=1 to Length(mmo1.Text) do
      begin
      if mmo1.Text[a]='.' then key:=#0;
      end;
    end;
  end
else key:=#0;
  if Length(mmo1.Text) <= 8 then begin
  if pos('.',mmo1.text) <> 0 then begin
  if pos('.',mmo1.text) = 8 then mmo1.MaxLength:= 11
  else
  if pos('.',mmo1.text) < 8 then mmo1.MaxLength := Pos('.',mmo1.text) + 3;
end
else if Length(mmo1.Text) = 7 then begin
if key='.' then key:=#0;
mmo1.Text:=mmo1.text+'.';
mmo1.SelStart:=8;
end;
end;
end;

Вообщем сначала тут идут проверки чтобы пользователь не смог начать с пробела или точки, потом чтобы мог вводить только цифры,плюс и минус (забыл вчера упомянуть про это) и чтобы пользователь смог ввести только одну точку.
Как работает ограничитель? А там все гениально и просто. Так как в моем случае максимальное кол-во символов до точки равно 8 (например +123456) и точка идет 8, то я просто проверяю при вводе сколько уже пользователь ввел символов и если их меньше 8, то проверяю есть ли точка и если есть то на какой позиции находится (спасибо lmikle за идею) и если она стоит на 8 позиции(максимально возможной) то я просто устанавливаю максимальное допустимое кол-во символов в memo (mmo1.MaxLength) на 11 (значит что пользователь сможет ввести еще только три символа после точки), если она на какой-то другой позиции (например если число "1234.", тут у нас пятая позиция), то я просто устанавливаю максимальное допустимое кол-во символов в memo(mmo1.MaxLength) на это число (в нашем случае пять) плюс три. А вот если пользователь ввел 7 символов без точки, то точка автоматом добавляется при следующем вводе символа (если пользователь сам нажимает на точку то нажатие не засчитывается, но точка все равно добавится только уже программой).

Всем еще раз большое спасибо за помощь!

P.S. Ушел изучать дальше MaskEdit =)

Последний раз редактировалось Ranmabaka, 05.12.2011 в 18:14.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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