2010-07-02 273 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') 

試試這個