我正在开发一个Delphi应用程序.
在T Image.MouseDown事件中,如果按下shift键,我想要执行X任务,如果按下控制键则执行Y任务,如果没有按下任何一个则执行Z任务.为此,我使用TShiftState变量.现在我有一个函数,我必须将此变量作为参数传递.
在T Image.MouseDown事件中,如果按下shift键,我想要执行X任务,如果按下控制键则执行Y任务,如果没有按下任何一个则执行Z任务.为此,我使用TShiftState变量.现在我有一个函数,我必须将此变量作为参数传递.
procedure Something(keyState : TShiftState);
现在在这个函数中我应该检查密钥的状态吗?
if KeyState <> ssShift then begin end;
解决方法
@H_403_15@ 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;