0

创建一个 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 键,不使用其他修饰键,然后单击表单。不显示任何消息。为什么现在?

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

4

2 回答 2

8

TShiftState类型定义如下:

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

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

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

如果你想测试修饰键的状态,你需要屏蔽掉所有不是修饰键的东西。使用*设置交集的运算符执行此操作。这使您可以将信息缩减为仅感兴趣的枚举值。

if Shift*[ssShift, ssAlt, ssCtrl] = [ssCtrl] then
  ....
于 2017-02-03T15:28:58.500 回答
2

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

因此,请执行以下操作:

if ssCtrl in Shift then
  ...
于 2017-02-03T15:13:11.910 回答