WeG*_*ars 5 delphi vcl delphi-xe7
我在Windows 7上运行Delphi XE7 VCL应用程序.
我观察到TEdit.OnChange
当Ctrl+A按下(全选)时触发事件.这是为什么?
OnChange
只有当TEdit
真正的文本发生变化时,我才需要可靠地触发事件.不幸的是,没有OnBeforeChange
可用的事件,因此我可以比较更改前后的文本.
那么,如何实现可靠的OnChange
事件TEdit
呢?
是的,这不是一个糟糕的基本实现:
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)