Я предлагаю обработать событие OnKeyPress следующим образом:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if NOT (Key in ('0'..'9', '.', #8, #13)) // разрешенные клавиши OR ( (Key = '.') // пользователь нажал '.' AND (POS ('.', Edit1.Text) > 0)) // десятичная точка уже имеется then begin Key := #0; MessageBeep (MB_OK); end; end; |
В коде проверяется, была ли нажатая клавиша цифрой, клавишей [Tab] или [Enter]. Все остальное запрещено (код клавиши не принимается, и устанавливается в ноль) и подается сигнал через компьютерную пищалку.
Если вы не хотите связываться с десятичной дробью, уберите строчку с ключевым словом OR и символ '.' из первого IF-условия. Если вы хотите проверять, что пользователь ввел между LowLimit и HighLimit, воспользуйтесь следующим кодом:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if NOT (Key in ('0'..'9', #8, #13)) OR (StrToInt (Edit1.Text + Key) < LowLimit) OR (StrToInt (Edit1.Text + Key) > HighLimit) then begin Key := #0; MessageBeep (MB_OK); end; end; |
[001555]
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); VAR P, L : Byte; begin WITH Sender AS TEdit DO BEGIN L := Length(Text); P := Pos('.', Text); END; CASE Key OF '0'..'9' : IF (P>0) AND (L-P>1) THEN Key := #0; '.' : IF P > 0 THEN Key := #0; #8 : {пробел}; ELSE Key := #0; END; end; |
Команда Key=#0 в обработчике события OnKeyPress "гасит" нажатую клавишу. Так, если нажата цифровая клавиша, то код ее "гасится", ЕСЛИ уже присутствует десятичная точка и две цифры после нее. Если введена десятичная точка, то она "гасится", ЕСЛИ десятичная точка уже присутствует. Пробел пропускается в любом случае, коды остальных клавиш всегда "гасятся". Во всяком случае теперь вы знаете "куда копать".
- Neil [000550]
Читатель советует:
Посылаю Вам несколько расширенный вариант числовой маски компонента TЕdit c помощью OnKeyPress. В отличие от имеющегося в "Советах", приведенный код не "запирает" поле ввода при заполнении десятичной части, преобразует точку в запятую (для удобства пользователя), не позволяет поставить десятичную запятую перед числом и позволяет стирать знаки в поле ввода клавишей 'Back Space'. Код проверен в Delphi 5.
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); var //цифровая маска vrPos,vrLength,vrSelStart : byte; const I : byte=1; //I+1 = количество знаков после запятой (в данном случае - 2 знака) begin With Sender as TEdit do begin vrLength:=Length(Text); //определяем длину текста vrPos:=Pos(',', Text); //проверяем наличие запятой vrSelStart:=SelStart; //определяем положение курсора end; Case Key of '0'..'9' : begin //проверяем положение курсора и количество знаков после запятой If (vrPos>0)and(vrLength-vrPos>I)and(vrSelStart>=vrPos) then Key:=#0; //"погасить" клавишу end; ',','.' : begin //если запятая уже есть или запятую пытаются поставить перед числом или никаких цифр в поле ввода еще нет If (vrPos>0)or(vrSelStart=0)or(vrLength=0) then Key:=#0 //"погасить" клавишу else Key:=#44; //всегда заменять точку на запятую end; #8 : ; //позволить удаление знаков клавишей 'Back Space' else Key := #0; //"погасить" все остальные клавиши end; end; |
С уважением, Михаил Шпанер. [000903]