Советы по Delphi

         

Числовая маска компонента Edit c помощью OnKeyPress III


Я предлагаю обработать событие 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]



Содержание раздела