为什么在按下Ctrl + A时会触发TEdit.OnChange?

WeG*_*ars 5 delphi vcl delphi-xe7

我在Windows 7上运行Delphi XE7 VCL应用程序.

我观察到TEdit.OnChangeCtrl+A按下(全选)时触发事件.这是为什么?

OnChange只有当TEdit真正的文本发生变化时,我才需要可靠地触发事件.不幸的是,没有OnBeforeChange可用的事件,因此我可以比较更改前后的文本.

那么,如何实现可靠的OnChange事件TEdit呢?

Rod*_*ino 3

是的,这不是一个糟糕的基本实现:

procedure TCustomEdit.CNCommand(var Message: TWMCommand);
begin
  if (Message.NotifyCode = EN_CHANGE) and not FCreating then Change;
end;
Run Code Online (Sandbox Code Playgroud)

此消息的出现没有考虑到“A”(即触发 EN_CHANGE 的按钮)当前与 ctrl 按下的状态一起出现。

你可以做的是检查 Ctrl 是否被按下:

procedure TForm44.edt1Change(Sender: TObject);

  function IsCtrlPressed: Boolean;
  var
    State: TKeyboardState;
  begin
    GetKeyboardState(State);
    Result := ((State[VK_CONTROL] and 128) <> 0);
  end;
begin
  if IsCtrlPresed then
    Exit;

  Caption := 'Ctrl is not pressed';
end;
Run Code Online (Sandbox Code Playgroud)

为了避免读取整个键盘的状态,您可以按照 David Heffernan 的建议进行操作:

procedure TForm44.edt1Change(Sender: TObject);

  function IsCtrlPresed: Boolean;
  begin
    Result := GetKeyState(VK_CONTROL) < 0;
  end;
begin
  if IsCtrlPresed then
    Exit;

  Caption := 'Ctrl is not pressed';
end;
Run Code Online (Sandbox Code Playgroud)

  • 这里的惯用语是“GetKeyState(VK_CONTROL)&lt;0”。读取整个键盘状态很浪费。 (3认同)