delphi 在用户键入时将字符插入TEEdit

vvppvyoh  于 2023-04-05  发布在  其他
关注(0)|答案(2)|浏览(170)

我想添加一个分隔符在一个指定的位置在一个TEEdit作为用户正在键入。
例如,当用户输入一个四位数的信用卡到期日期时,我想在第二位和第三位数字之间添加一个斜线。当他们输入'06/10'时,它应该显示为'06/10',以获得美观的MM/YY外观。
我希望这能起作用:

procedure TForm1.Edit1ChangeTracking(Sender: TObject);
begin
if (Edit1.Text.Length = 2) then Edit1.Text := Edit1.Text + '/';
end;

但是输出'06/10/'而不是'06/10',因为指针停留在斜杠后面。我如何改变这一点?

qc6wkl3g

qc6wkl3g1#

添加'/'字符后,TEdit.CaretPosition属性仍在当前位置,即字符的左侧。更新CaretPosition以将插入符号移动到字符的右侧,例如:

procedure TForm1.Edit1ChangeTracking(Sender: TObject);
begin
  if (Edit1.Text.Length = 2) then
  begin
    Edit1.Text := Edit1.Text + '/';
    Edit1.CaretPosition := Edit1.Text.Length;
    // or: Edit1.GoToTextEnd();
  end;
end;
5vf7fwbs

5vf7fwbs2#

Tom Brunberg正确地识别出代码属于OnTyping事件处理程序,而不是OnChangeTracking。我遇到的一个后续错误是用户不能退格到“/”后面来更正错误(因为每次他们删除“/”,都会自动插入一个新的)。下面是我用来修复该错误并获得完全预期效果的完整代码:
WriteExpiry是一个TEEdit。

procedure TForm1.WriteExpiryTyping(Sender: TObject);
begin

//INSERTS A '/' AFTER THE FIRST TWO DIGITS OF THE EXPIRY DATE
 if (WriteExpiry.Text.Length = 2) then
 begin
 WriteExpiry.Text := WriteExpiry.Text + '/';
 WriteExpiry.CaretPosition := WriteExpiry.Text.Length;
 end;

//PROTECTS AGAINST USER TYPING '/' THEMSELVES AND CREATING '//'
 if (WriteExpiry.Text.Length = 4)then
 begin
 if WriteExpiry.Text[4] = '/' then
  begin
  WriteExpiry.Text := WriteExpiry.Text[1] + WriteExpiry.Text[2] + WriteExpiry.Text[3];
  WriteExpiry.CaretPosition := WriteExpiry.Text.Length;
   end;
 end;

procedure TForm1.WriteExpiryKeyDown(Sender: TObject; var Key: Word;
  var KeyChar: Char; Shift: TShiftState);
begin
//ALLOWS THE USER TO BACKSPACE PAST THE INSERTED '/'
if (Key = vkBack) and (WriteExpiry.Text.Length = 3) then
  begin
  WriteExpiry.Text := WriteExpiry.Text[1] + WriteExpiry.Text[2];
  WriteExpiry.CaretPosition := WriteExpiry.Text.Length;
  end;
end;

相关问题