You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi中EditMask手机号输入优化:实现右侧输入自动左移填充

Delphi手机号掩码输入自动左移实现方案

核心逻辑

通过拦截输入事件自定义数字填充规则:

  • 仅允许输入数字和退格键
  • 输入新数字时,自动填充左侧空位(或按需求实现数字左移补位)
  • 固定光标在最右侧,无需手动调整位置

代码实现

场景1:带分隔符的掩码输入(如XXX-XXXXXXXX格式)

使用TMaskEdit,掩码设为___-________,并添加以下事件处理:

  1. OnKeyPress 事件
procedure TForm1.MaskEdit1KeyPress(Sender: TObject; var Key: Char);
var
  CurrentText: string;
  I: Integer;
begin
  // 过滤非数字、非退格键输入
  if not (Key in ['0'..'9', #8]) then
  begin
    Key := #0;
    Exit;
  end;

  // 处理数字输入:填充左侧第一个空位
  if Key in ['0'..'9'] then
  begin
    CurrentText := TMaskEdit(Sender).Text;
    for I := 1 to Length(CurrentText) do
    begin
      if CurrentText[I] = '_' then
      begin
        CurrentText[I] := Key;
        TMaskEdit(Sender).Text := CurrentText;
        // 光标回到最右侧
        TMaskEdit(Sender).SelStart := Length(TMaskEdit(Sender).Text);
        Key := #0;
        Break;
      end;
    end;
    Exit;
  end;

  // 处理退格键:删除右侧第一个已填充数字,恢复为占位符
  if Key = #8 then
  begin
    CurrentText := TMaskEdit(Sender).Text;
    for I := Length(CurrentText) downto 1 do
    begin
      if CurrentText[I] <> '_' then
      begin
        CurrentText[I] := '_';
        TMaskEdit(Sender).Text := CurrentText;
        TMaskEdit(Sender).SelStart := Length(TMaskEdit(Sender).Text);
        Key := #0;
        Break;
      end;
    end;
  end;
end;
  1. OnEnter 事件(固定光标在最右侧)
procedure TForm1.MaskEdit1Enter(Sender: TObject);
begin
  TMaskEdit(Sender).SelStart := Length(TMaskEdit(Sender).Text);
end;

场景2:无分隔符的纯数字输入

使用普通TEdit,设置MaxLength=11,实现从右往左填充(输入数字自动左移补位):

  1. OnKeyPress 事件
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  CurrentText: string;
begin
  if not (Key in ['0'..'9', #8]) then
  begin
    Key := #0;
    Exit;
  end;

  // 数字输入:新数字补在左侧,现有内容右移
  if Key in ['0'..'9'] then
  begin
    CurrentText := Edit1.Text;
    if Length(CurrentText) >= 11 then
    begin
      Key := #0;
      Exit;
    end;
    Edit1.Text := Key + CurrentText;
    Edit1.SelStart := Length(Edit1.Text);
    Key := #0;
    Exit;
  end;

  // 退格键:删除最左侧数字
  if Key = #8 then
  begin
    if Length(Edit1.Text) > 0 then
      Edit1.Text := Copy(Edit1.Text, 2, MaxInt);
    Edit1.SelStart := Length(Edit1.Text);
    Key := #0;
  end;
end;
  1. OnEnter 事件
procedure TForm1.Edit1Enter(Sender: TObject);
begin
  Edit1.SelStart := Length(Edit1.Text);
end;

内容的提问来源于stack exchange,提问作者Erick Landim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 06:10:33