2010-07-02 286 views
6

我正在开发一个Delphi应用程序。
关于TImage.MouseDown事件我想做X任务,如果按Shift键,Y任务如果控制键被按下,Z任务,如果他们中的任何一个没有按下。为此,我正在使用TShiftState变量。现在我有一个函数,我必须通过这个变量作为参数。Delphi:如何使用TShiftState类型变量?

procedure Something(keyState : TShiftState); 

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

if KeyState <> ssShift then begin 

end; 

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

回答

9

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感兴趣,而其他值(步加,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; 
+0

请看我编辑的问题.. – Himadri 2010-07-02 09:22:53

+0

谢谢...你提供了我所需要的一切。 – Himadri 2010-07-02 09:39:01

4
if ssShift in keyState then 
    ShowMessage('1') 
else if ssCtrl in keyState then 
    ShowMessage('2') 
else 
    ShowMessage('3') 

试试这个