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

前端之家收集整理的这篇文章主要介绍了delphi – 为什么在按下Ctrl A时会触发TEdit.OnChange?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在 Windows 7上运行Delphi XE7 VCL应用程序.

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

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

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

解决方法

是的,这不是一个糟糕的基础实现:
procedure TCustomEdit.CNCommand(var Message: TWMCommand);
begin
  if (Message.NotifyCode = EN_CHANGE) and not FCreating then Change;
end;

此消息没有考虑到’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;

为了避免阅读整个键盘的状态,你可以做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;

猜你在找的Delphi相关文章