delphi – 为什么在按下Ctrl A时会触发TEdit.OnChange?
发布时间:2020-12-15 04:11:41 所属栏目:大数据 来源:网络整理
导读:我在 Windows 7上运行Delphi XE7 VCL应用程序. 我观察到当按下Ctrl A(全选)时触发TEdit.OnChange事件.这是为什么? 只有当TEdit中的文本真正发生变化时,才需要可靠地触发OnChange事件.不幸的是,没有OnBeforeChange事件可用,因此我可以比较更改前后的文本. 那
我在
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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |