仅按下CTRL键时移位值?

时间:2017-02-03 15:02:45

标签: delphi delphi-10.1-berlin modifier-key

创建一个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具有哪个值?

2 个答案:

答案 0 :(得分:5)

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
  ....

答案 1 :(得分:1)

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

相反,请执行此操作:

if ssCtrl in Shift then
  ...