哪种方式是"正确"一个在Delphi中定义快捷方式?

时间:2016-03-26 17:41:30

标签: delphi keyboard-shortcuts

有很多关于如何在Delphi程序中定义ShortCut的例子,但是 他们归结为两种不同的方式:

  1. 将任何scCtrl,scShift和scAlt常量添加到键的Ord()
  2. 使用Menus.ShortCut功能
  3. e.g。

    Action.ShortCut := scCtrl + scShift + Ord('K');
    // vs
    Action.ShortCut := Menus.ShortCut(Word('K'), [ssCtrl, ssShift]);
    

    这两种方式中的一种更可取吗?如果是,哪一个和为什么?

2 个答案:

答案 0 :(得分:14)

代码几乎完全相同,但ShortCut还有一些额外的检查:

function ShortCut(Key: Word; Shift: TShiftState): TShortCut;
begin
  Result := 0;
  if HiByte(Key) <> 0 then Exit; // if Key is national character then it can't be used as shortcut
  Result := Key;
  if ssShift in Shift then Inc(Result, scShift); // this is identical to "+" scShift
  if ssCtrl in Shift then Inc(Result, scCtrl);
  if ssAlt in Shift then Inc(Result, scAlt);
end;

由于RegisterHotKey函数使用Virtual key codes(其值为$ 00到$ FE),因此这项附加检查非常重要。

注意,而不是Ord文档,真正的Ord函数返回smallint(签名Word),因此使用国家字符可以更改包含在内的修饰符ShortCut值的高字节。

因此,更优选使用ShortCut函数。

答案 1 :(得分:5)

我会说只要有一个功能来完成这项工作,最好使用这个功能。

因为将来有机会发生变化,有一个函数会给你一个调用的“硬链接”,所以如果函数被弃用,你会收到通知,如果函数逻辑发生变化,你会得到更新默默。

否则,你不会从中受益。

现在在这个特殊情况下,在未来10到20年内定义快捷方式的可能性有多大? 可能没有。但是我仍然提倡函数调用(如果不是为了任何东西,但你不必记住逻辑(它是添加还是逻辑ORing?后来可能会问自己)