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

时间:2016-11-19 02:36:09

标签: delphi enums subroutine delphi-10-seattle

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

问题是,我无法弄清楚如何将TShiftState枚举类型中的一个传递到此子例程中。我尝试了ByteIntegerCardinal但我不断获得Incompatible types: 'Byte' and 'Enumeration'(或者我尝试的任何类型)。将鼠标悬停在其中一个上只会显示$1类型通常所在的位置。

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;
  

注意:StrLen是一个单独的函数,它使用给定长度的空格填充字符串。

TShiftStateSystem.Classes中定义如下:

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

如何正确地将其传递到A子程序?

1 个答案:

答案 0 :(得分:7)

***755的第一个参数更改为A。然后将每个调用A更改为表单

const Sh: TShiftState

最后将条件测试转换为

A([ssShift], 'Shift');

参考。 Expressions

  

X< = Y为True,以防X的每个成员都是Y

的成员