在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
相关产品推荐
相关产品推荐

