在Delphi中定义快捷方式的“正确”方法是哪一种?

11

如何在Delphi程序中定义快捷键有很多例子,但归结为只有两种不同的方法:

  1. 将 scCtrl、scShift 和 scAlt 常量之一添加到按键的 Ord() 函数中
  2. 使用 Menus.ShortCut 函数

例如:

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

这两种方法中有哪一种更可取?如果是,那么哪一种,为什么?

2个回答

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函数使用虚拟键代码(其值从$00到$FE),因此进行额外检查非常重要。

注意,实际的Ord函数返回小整数(有符号的Word),而不是Ord文档中所述的内容,因此使用国家字符可能会更改包含在ShortCut值的Hi-byte中的修饰符。

因此,更好的方法是使用ShortCut函数。


5
每当有一个函数可以完成任务时,最好使用该函数。因为在将来可能会发生变化的情况下,拥有一个函数可以给您一个“硬链接”到调用,因此如果该函数被弃用,则会收到通知,如果函数逻辑发生更改,则会静默更新。否则,您将无法从中受益。
现在,在这种特殊情况下,未来10-20年内快捷方式的定义可能会发生变化的机会有多大?可能没有。但我仍然主张调用函数(即使不是为了任何事情,但您不必记住逻辑(它是加法还是逻辑ORing?以后可能会问自己)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接