仅按下 CTRL 键时移动值?

Shift value when only CTRL key is pressed?

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

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

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

那么在这种情况下,当只按下 CTRL 键时,Shift 的值是多少?

TShiftState 是一个枚举集,意味着可以有多个值。当您执行 if Shift = [ssCtrl] 时,您正在检查它是否 完全 等于。但是,可能还有其他值。

所以,改为这样做:

if ssCtrl in Shift then
  ...

TShiftState类型定义如下:

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

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

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

如果您想测试修改键的状态,您需要屏蔽掉所有不是修改键的内容。使用设置交集的 * 运算符来执行此操作。这允许您将信息缩减为感兴趣的枚举值。

if Shift*[ssShift, ssAlt, ssCtrl] = [ssCtrl] then
  ....