Случилось так, что потребовался мне ввод номера телефона. Компонента, аналога TMaskEdit в FMX нет, так что пришлось "изобретать на коленке". Компонент писать было лень, потому просто покажу как я решил это в конкретном диалоге с использованием TEdit. Может кому то пригодится. Из кода я убрал все лишнее, оставил только то что относится к делу.
uses
....
System.MaskUtils, System.Character;
type
TFormRegistry = class(TForm)
edtPhone: TEdit;
procedure edtPhoneValidating(Sender: TObject; var Text: string);
procedure edtPhoneKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
procedure FormCreate(Sender: TObject);
procedure edtPhoneEnter(Sender: TObject);
procedure edtPhoneTyping(Sender: TObject);
private
const Mask = '+7(000)000-00-00;0;*'; /// '+0(000)000-00-00;0;*' - для других стран, например для Украины +3(999)....
private
PhoneNumber: string;
function GetCaretPos: Integer;
function GetMaxLength: integer;
public
end;
procedure TFormRegistry.FormCreate(Sender: TObject);
begin
edtPhone.Text := FormatMaskText(Mask, PhoneNumber);
end;
function TFormRegistry.GetCaretPos: Integer;
var
i: integer;
begin
Result := 0;
for i := 0 to Mask.Length-1 do
begin
if not (MaskGetCharType(Mask, i) in [mcDirective, mcMask]) then
Result := Result + 1;
if (Result + PhoneNumber.Length) = i then
Break;
end;
Result := Result + PhoneNumber.Length - 1;
end;
function TFormRegistry.GetMaxLength: integer;
var
i: integer;
begin
Result := 0;
for i := 0 to Mask.Length-1 do
if (MaskGetCharType(Mask, i) in [mcMask]) then
Result := Result + 1;
end;
procedure TFormRegistry.edtPhoneKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
if (Key = 8) and (PhoneNumber.Length > 0) then
PhoneNumber := Copy(PhoneNumber, 1, PhoneNumber.Length-1)
else
if (PhoneNumber.Length < GetMaxLength) and (Key = 0) and IsDigit(KeyChar) then
PhoneNumber := PhoneNumber + KeyChar
else
KeyChar := #0;
end;
procedure TFormRegistry.edtPhoneEnter(Sender: TObject);
begin
edtPhone.CaretPosition := GetCaretPos;
end;
procedure TFormRegistry.edtPhoneTyping(Sender: TObject);
begin
edtPhone.CaretPosition := GetCaretPos;
end;
procedure TFormRegistry.edtPhoneValidating(Sender: TObject; var Text: string);
begin
Text := FormatMaskText(Mask, PhoneNumber);
end;
end.
Вопрос
DirtyBorov
Случилось так, что потребовался мне ввод номера телефона. Компонента, аналога TMaskEdit в FMX нет, так что пришлось "изобретать на коленке". Компонент писать было лень, потому просто покажу как я решил это в конкретном диалоге с использованием TEdit. Может кому то пригодится. Из кода я убрал все лишнее, оставил только то что относится к делу.
uses .... System.MaskUtils, System.Character; type TFormRegistry = class(TForm) edtPhone: TEdit; procedure edtPhoneValidating(Sender: TObject; var Text: string); procedure edtPhoneKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); procedure FormCreate(Sender: TObject); procedure edtPhoneEnter(Sender: TObject); procedure edtPhoneTyping(Sender: TObject); private const Mask = '+7(000)000-00-00;0;*'; /// '+0(000)000-00-00;0;*' - для других стран, например для Украины +3(999).... private PhoneNumber: string; function GetCaretPos: Integer; function GetMaxLength: integer; public end; procedure TFormRegistry.FormCreate(Sender: TObject); begin edtPhone.Text := FormatMaskText(Mask, PhoneNumber); end; function TFormRegistry.GetCaretPos: Integer; var i: integer; begin Result := 0; for i := 0 to Mask.Length-1 do begin if not (MaskGetCharType(Mask, i) in [mcDirective, mcMask]) then Result := Result + 1; if (Result + PhoneNumber.Length) = i then Break; end; Result := Result + PhoneNumber.Length - 1; end; function TFormRegistry.GetMaxLength: integer; var i: integer; begin Result := 0; for i := 0 to Mask.Length-1 do if (MaskGetCharType(Mask, i) in [mcMask]) then Result := Result + 1; end; procedure TFormRegistry.edtPhoneKeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin if (Key = 8) and (PhoneNumber.Length > 0) then PhoneNumber := Copy(PhoneNumber, 1, PhoneNumber.Length-1) else if (PhoneNumber.Length < GetMaxLength) and (Key = 0) and IsDigit(KeyChar) then PhoneNumber := PhoneNumber + KeyChar else KeyChar := #0; end; procedure TFormRegistry.edtPhoneEnter(Sender: TObject); begin edtPhone.CaretPosition := GetCaretPos; end; procedure TFormRegistry.edtPhoneTyping(Sender: TObject); begin edtPhone.CaretPosition := GetCaretPos; end; procedure TFormRegistry.edtPhoneValidating(Sender: TObject; var Text: string); begin Text := FormatMaskText(Mask, PhoneNumber); end; end.8 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.