我正在Windows 7上运行Delphi XE7 VCL应用程序。
我观察到当按下 Ctrl + A (全选)时会触发TEdit.OnChange
事件。那是为什么?
只有当OnChange
中的文本真正发生变化时,才需要可靠地触发TEdit
事件。遗憾的是,没有OnBeforeChange
事件可用,因此我可以比较更改前后的文本。
那么,如何为OnChange
实现可靠的TEdit
事件?
答案 0 :(得分:3)
是的,这不是一个糟糕的基础实施:
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;