Delphi:如何使用TShift状态类型变量?

Delphi:如何使用TShift状态类型变量?,delphi,keypress,Delphi,Keypress,我正在开发一个Delphi应用程序。 在TImage.MouseDown事件中,如果按下shift键,我想执行X任务;如果按下控制键,我想执行Y任务;如果未按下任何键,我想执行Z任务。为此,我使用了TShiftState变量。现在我有一个函数,在其中我必须传递这个变量作为参数 procedure Something(keyState : TShiftState); 现在在这个函数中,我应该正确地检查键的状态是什么 if KeyState <> ssShift then begin

我正在开发一个Delphi应用程序。
在TImage.MouseDown事件中,如果按下shift键,我想执行
X
任务;如果按下控制键,我想执行
Y
任务;如果未按下任何键,我想执行
Z
任务。为此,我使用了
TShiftState
变量。现在我有一个函数,在其中我必须传递这个变量作为参数

procedure Something(keyState : TShiftState);
现在在这个函数中,我应该正确地检查键的状态是什么

if KeyState <> ssShift then begin

end;
如果键状态为ssShift,则开始
结束;
上述代码显示错误。

谢谢。

IIUC您想要空位
[]

Something([ssShift]); // X
Something([ssCtrl]); // Y
Something([]); // Z
关于您的更新:

procedure Something(keyState : TShiftState);
begin
  if ssShift in KeyState then // KeyState contains ssShift (and maybe more)
    X;
  if ssCtrl in KeyState then // KeyState contains ssCtrl (and maybe more)
    Y;
  if [ssShift, ssCtrl] * KeyState = [] then // KeyState contains neither ssShift nor ssCtrl
    Z;
end;
如果您只对ssShift和ssCtrl感兴趣,而其他值(ssAlt、ssLeft等)无关紧要,则可以忽略后一个值:

procedure Something(keyState : TShiftState);
var
  MaskedKeyState : TShiftState
begin
  MaskedKeyState := KeyState * [ssShift, ssCtrl];
  if ssShift in MaskedKeyState then // MaskedKeyState contains ssShift
    X;
  if ssCtrl in MaskedKeyState then // MaskedKeyState contains ssCtrl
    Y;
  if MaskedKeyState = [] then // MaskedKeyState contains neither ssShift nor ssCtrl
    Z;
end;

试试这个

谢谢。。。你提供了我所需要的一切。
if ssShift in keyState then
  ShowMessage('1')
else if ssCtrl in keyState then
  ShowMessage('2')
else
  ShowMessage('3')