仅按下CTRL键时移位值?

use*_*348 -1 delphi modifier-key delphi-10.1-berlin

创建一个VCL Forms应用程序并在主窗体的OnMouseDown事件处理程序中写入:

procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if Shift = [ssCtrl] then
    ShowMessage('CTRL pressed');
end;
Run Code Online (Sandbox Code Playgroud)

然后运行应用程序,按住CTRL键,没有其他修饰键,然后单击表单.没有显示任何消息.为什么现在?

那么Shift在这种情况下,当只按下CTRL键时,哪个值有效?

Dav*_*nan 5

TShiftState类型定义如下:

type
  TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble, 
    ssTouch, ssPen, ssCommand, ssHorizontal);
Run Code Online (Sandbox Code Playgroud)

如您所见,包含的信息不仅仅是修饰键状态.

当您按住CTRL键并单击表单时,Shift具有以下值:[ssCtrl,ssLeft].这告诉您CTRL键已关闭,鼠标左键已关闭.请注意,使用调试器很容易获得此信息.学习如何在执行期间使用调试来检查程序的状态是一项非常重要的技能.

如果您希望测试修改键的状态,则需要屏蔽掉不是修饰键的所有内容.使用*设置交叉点的运算符执行此操作.这允许您将信息减少到只有感兴趣的枚举值.

if Shift*[ssShift, ssAlt, ssCtrl] = [ssCtrl] then
  ....
Run Code Online (Sandbox Code Playgroud)

  • 原始问题询问*"在这种情况下只有CTRL键被按下时Shift会有哪些值?*",它没有提及任何其他修饰键.测试ssctrl满足原始问题. (3认同)