加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 04:15:45 所属栏目:大数据 来源:网络整理
导读:我正在开发一个Delphi应用程序. 在T Image.MouseDown事件中,如果按下shift键,我想要执行X任务,如果按下控制键则执行Y任务,如果没有按下任何一个则执行Z任务.为此,我使用TShiftState变量.现在我有一个函数,我必须将此变量作为参数传递. procedure Something(k
我正在开发一个Delphi应用程序.
在T Image.MouseDown事件中,如果按下shift键,我想要执行X任务,如果按下控制键则执行Y任务,如果没有按下任何一个则执行Z任务.为此,我使用TShiftState变量.现在我有一个函数,我必须将此变量作为参数传递.
procedure Something(keyState : TShiftState);

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

if KeyState <> ssShift then begin

end;

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

解决方法

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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读