为什么按下 Ctrl+A 时 TEdit.OnChange 会触发?
Why does TEdit.OnChange trigger when Ctrl+A is pressed?
我是 运行 Delphi XE7 VCL 应用程序 Windows 7.
我观察到 TEdit.OnChange
事件在按下 Ctrl+A(select 全部)时触发。这是为什么?
我需要仅在 TEdit
中的文本真正发生变化时才可靠地触发 OnChange
事件。不幸的是,没有可用的 OnBeforeChange
事件,因此我可以比较更改前后的文本。
那么,如何为 TEdit
实施可靠的 OnChange
事件?
是的,基础实现不错:
procedure TCustomEdit.CNCommand(var Message: TWMCommand);
begin
if (Message.NotifyCode = EN_CHANGE) and not FCreating then Change;
end;
此消息未考虑触发 EN_CHANGE 的按钮 'A' 当前与按下 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 XE7 VCL 应用程序 Windows 7.
我观察到 TEdit.OnChange
事件在按下 Ctrl+A(select 全部)时触发。这是为什么?
我需要仅在 TEdit
中的文本真正发生变化时才可靠地触发 OnChange
事件。不幸的是,没有可用的 OnBeforeChange
事件,因此我可以比较更改前后的文本。
那么,如何为 TEdit
实施可靠的 OnChange
事件?
是的,基础实现不错:
procedure TCustomEdit.CNCommand(var Message: TWMCommand);
begin
if (Message.NotifyCode = EN_CHANGE) and not FCreating then Change;
end;
此消息未考虑触发 EN_CHANGE 的按钮 'A' 当前与按下 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;