Delphi:如何使用TShiftState类型变量?

Him*_*dri 9 delphi keypress

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

procedure Something(keyState : TShiftState);
Run Code Online (Sandbox Code Playgroud)

现在在这个函数中我应该检查密钥的状态吗?

if KeyState <> ssShift then begin

end;
Run Code Online (Sandbox Code Playgroud)

上面的代码显示错误.
谢谢.

Uli*_*rdt 11

IIUC你想要空集[]:

Something([ssShift]); // X
Something([ssCtrl]); // Y
Something([]); // Z
Run Code Online (Sandbox Code Playgroud)

关于你的更新:

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;
Run Code Online (Sandbox Code Playgroud)

如果你只对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;
Run Code Online (Sandbox Code Playgroud)


Bha*_*rat 5

if ssShift in keyState then
  ShowMessage('1')
else if ssCtrl in keyState then
  ShowMessage('2')
else
  ShowMessage('3')
Run Code Online (Sandbox Code Playgroud)

尝试这个