停止编辑框中的某些键

Mat*_*ggs 6 browser delphi

所以我已经有了代码.但是当它运行时它不允许退格键,我需要它来允许退格键并删除空格键,因为我不想要空格.

procedure TForm1.AEditAKeyPress(Sender: TObject; var Key: Char);
var s:string;
begin
s := ('1 2 3 4 5 6 7 8 9 0 .'); //Add chars you want to allow
if pos(key,s) =0 then begin Key:=#0;
showmessage('Invalid Char');
end;
Run Code Online (Sandbox Code Playgroud)

需要帮助谢谢:D

Ser*_*yuz 7

请注意代码中已有的注释:

procedure TForm1.AEditKeyPress(Sender: TObject; var Key: Char);
var s:string;
begin
  s := ('1234567890.'#8); //Add chars you want to allow
  if pos(key,s) =0 then begin
    Key:=#0;
    showmessage('Invalid Char');
  end;
end;
Run Code Online (Sandbox Code Playgroud)


Mar*_*dor 5

最好将允许键作为常量放入集合中(速度、优化):

更新#2只允许一个小数字符并正确处理 DecimalSeparator。

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
const
  Backspace = #8;
  AllowKeys: set of Char = ['0'..'9', Backspace];
begin
  if Key = '.' then Key := DecimalSeparator;
  if not ((Key in AllowKeys) or
    (Key = DecimalSeparator) and (Pos(Key, Edit1.Text) = 0)) then
  begin
    ShowMessage('Invalid key: ' + Key);
    Key := #0;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

为了获得更好的结果,请查看 DevExpress、JVCL、EhLib、RxLib 和许多其他库中包含的 TNumericEdit 组件。

  • 就个人而言,我会在这里使用一个集合,假设我们使用的是“AnsiChar”而不是“Char”。但我会这样做,因为代码读起来好多了。性能问题与 KeyPress 处理程序无关。获得这样的代码的可读性和清晰度更为重要。优化稍后进行,并应用于瓶颈。如果您优化了这段代码,比如将其转换为 asm,那么这将是一个可怕的想法,因为您现在的代码仍然需要有效的零时间来运行,但现在它是不可读的! (4认同)
  • 很难想象用户能够以 Pos 性能至关重要的速度进行按键操作。而且我不确定 set 真的会比 Pos 更快。 (3认同)
  • 这完全是无稽之谈。从按下按键到消息到达应用程序消息队列所需的 CPU 周期数比调用“Pos”所需的时间大多个数量级。 (3认同)