创建一个 VCL 窗体应用程序,并在主窗体的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
类型定义如下:
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
....
TShiftState
是一个枚举集,这意味着可以有多个值。当你做if Shift = [ssCtrl]
你正在检查它是否完全等于那个。但是,可能还有其他值。
因此,请改为执行以下操作:
if ssCtrl in Shift then
...