如何将匿名枚举类型传递给子例程?

How to pass an anonymous enumerated type into a subroutine?

我正在尝试创建一个方便的函数来将 System.Classes.TShiftState 转换为用户可读的字符串。为了方便起见,我做了一个子程序来执行公共代码,使功能更紧凑。

问题是,我不知道如何将 TShiftState 枚举类型之一传递到该子例程中。我尝试了 ByteIntegerCardinal,但我一直收到 Incompatible types: 'Byte' and 'Enumeration'(或我尝试的任何类型)。将鼠标悬停在其中之一上只会显示 </code> 通常类型所在的位置。</p> <pre><code>function ShiftStateStr(const Shift: TShiftState): String; procedure A(const Sh: Byte; const Str: String); begin if Sh in Shift then Result:= Result + StrLen(Str, Length(Str)+1) else Result:= Result + StrLen('', Length(Str)+1); end; begin Result:= ''; A(ssShift, 'Shift'); A(ssAlt, 'Alt'); A(ssCtrl, 'Ctrl'); A(ssLeft, 'Left'); A(ssRight, 'Right'); A(ssMiddle, 'Middle'); A(ssDouble, 'Double'); A(ssTouch, 'Touch'); A(ssPen, 'Pen'); A(ssCommand, 'Cmd'); A(System.Classes.ssHorizontal, 'Horz'); end;

NOTE: StrLen is a separate function which pads a string with spaces of a given length.

TShiftStateSystem.Classes 中定义如下:

type
  TShiftState = set of (ssShift, ssAlt, ssCtrl,
    ssLeft, ssRight, ssMiddle, ssDouble, ssTouch, ssPen, ssCommand, ssHorizontal);

我怎样才能正确地将它传递给 A 子例程?

A 的第一个参数更改为 const Sh: TShiftState。然后将对 A 的每次调用更改为

形式
A([ssShift], 'Shift');

最后条件测试成

if Sh <= Shift then

参考。 Expressions

X <= Y is True just in case every member of X is a member of Y