Случилось так, что потребовался мне ввод номера телефона. Компонента, аналога 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. Может кому то пригодится. Из кода я убрал все лишнее, оставил только то что относится к делу.
Ссылка на комментарий
5 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.