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

在Delphi中自定义24小时制HH:MM格式的时间输入框

实现支持24小时制HH:MM格式的Edit输入(不用掩码/DateTimePicker)

你的原代码逻辑有不少漏洞,比如没区分第一位是2时第二位的取值范围、没处理分钟位的输入规则、无效按键直接清空文本体验差、光标位置也没维护好。给你整理了修正后的实现代码,逻辑更严谨,输入体验也更顺畅:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
  CurrentLen: Integer;
  FirstChar: Char;
begin
  // 固定输入框最大长度为5(对应HH:MM格式)
  Edit1.MaxLength := 5;
  CurrentLen := Length(Edit1.Text);

  // 退格、Tab、回车、ESC这些控制键直接放行,保证基础操作正常
  if Key in [#8, #9, #13, #27] then Exit;

  // 只允许输入数字,其他字符直接阻止
  if not (Key in ['0'..'9']) then
  begin
    Key := #0;
    Exit;
  end;

  case CurrentLen of
    0: // 输入第一位(小时的十位):只能是0、1、2
      begin
        if not (Key in ['0'..'2']) then
          Key := #0;
      end;
    1: // 输入第二位(小时的个位):如果第一位是2,只能输0-3;否则可以输0-9
      begin
        FirstChar := Edit1.Text[1];
        if (FirstChar = '2') and not (Key in ['0'..'3']) then
          Key := #0;
      end;
    2: // 当前已经输入两位数字,输第三个数字时自动插入冒号,再把数字加上
      begin
        Edit1.Text := Edit1.Text + ':' + Key;
        Key := #0; // 已经手动处理了输入,把原按键拦截掉
        Edit1.SelStart := 4; // 把光标移到冒号后面的第二位,方便继续输分钟
      end;
    3: // 输入第四位(分钟的十位):只能是0-5
      begin
        if not (Key in ['0'..'5']) then
          Key := #0;
      end;
    4: // 输入第五位(分钟的个位):可以输0-9,但要避免24:xx这种非法时间
      begin
        if (Copy(Edit1.Text, 1, 2) = '24') then
          Key := #0;
      end;
    else // 已经输入满5位了,阻止继续输入
      Key := #0;
  end;
end;

// 可选:输入框失去焦点时自动补全格式,比如输123变成12:30,输2变成02:00
procedure TForm1.Edit1Exit(Sender: TObject);
var
  CleanText: string;
  Hour, Min: Integer;
begin
  // 先把输入里的非数字字符过滤掉
  CleanText := '';
  for var C in Edit1.Text do
    if C in ['0'..'9'] then
      CleanText := CleanText + C;

  // 根据输入的数字长度自动补全成HH:MM格式
  case Length(CleanText) of
    0: Edit1.Text := '00:00';
    1: Edit1.Text := '0' + CleanText + ':00';
    2: Edit1.Text := CleanText + ':00';
    3: Edit1.Text := Copy(CleanText, 1, 2) + ':' + '0' + Copy(CleanText, 3, 1);
    4: Edit1.Text := Copy(CleanText, 1, 2) + ':' + Copy(CleanText, 3, 2);
  end;

  // 最后检查时间合法性,超过23:59的话自动修正为23:59
  Hour := StrToInt(Copy(Edit1.Text, 1, 2));
  Min := StrToInt(Copy(Edit1.Text, 4, 2));
  if Hour > 23 then Hour := 23;
  if Min > 59 then Min := 59;
  Edit1.Text := Format('%.2d:%.2d', [Hour, Min]);
end;

代码说明

  • KeyPress事件:

    • 优先放行常用控制键,避免输入操作受限;
    • 严格限制每一位的输入范围,从源头保证时间格式合法;
    • 输入到第3位时自动插入冒号,不用用户手动输入,提升流畅度;
    • 针对24小时制的规则做校验,避免出现24:00这类非法时间。
  • Exit事件(可选):

    • 自动补全不完整的输入,比如只输了1会变成01:00,输123变成12:30;
    • 最终校验时间合法性,把超出范围的时间修正为最大合法值(23:59)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 11:06:22