![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
![]() Здравствуйте!
Есть программа которая считывает построчно данные из файла (только цифры) и записывает каждую строку в отдельный 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
|
||||
|
||||
![]() Зачем для этого нужен TMemo, TEdit недостаточно?
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
||||
|
||||
![]() Потому что в TMemo есть выравнивание по правому краю, а в TEdit нет. Да и замена TMemo на TEdit проблему мне так кажется не решит
![]() Последний раз редактировалось Ranmabaka, 05.12.2011 в 00:08. |
#4
|
|||
|
|||
![]() MaskEdit...
|
#5
|
||||
|
||||
![]() Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#6
|
||||
|
||||
![]() angvelem
m1sclick Спасибо большое за помощь! ![]() ![]() |
#7
|
||||
|
||||
![]() Хотя нет, я немного поторопился T_T
Сделал шаблон "999999/999;1; " и теперь проблема в том, что если пользователю нужно ввести не шесть цифр, а к примеру три, то эти три цифры остаются слева и потом три " " и получается например "123 .456". Можно как-нибудь сделать так что при вводе цифр перед точкой они вводились от точки, а не слева на право? |
#8
|
||||
|
||||
![]() Переопределить TCustomMaskEdit под свои нужды.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#9
|
|||
|
|||
![]() Ну тут задача очень специфическая. Может проще просто "сесть" на OnKeyPress и его обработать? Собственно, по SelStart можно понять куда пытаются вставить цифру, Pos - получить наличие и положение точки. Дальше просто аккуратно прописать условия.
Ну а еще проще контролировать результат на OnExit (потеря фокуса). Тогда пользователь пусть вводит что угодно (ну тоже ограничить, например, только цифры и точку), а при уходе с контрола просто проверить результат и не дать уходить. |
#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. |