Как передать анонимный перечислимый тип в подпрограмму?

Я пытаюсь сделать удобную функцию для преобразования System.Classes.TShiftState в удобочитаемую строку. Чтобы упростить задачу, я создал подпрограмму для выполнения общего кода, чтобы сделать функцию более компактной.

Проблема в том, что я не могу понять, как пройти один из TShiftState enum вводит в эту подпрограмму. Я старался Byte, Integer, а также Cardinal но я продолжаю получать 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 это отдельная функция, которая дополняет строку пробелами заданной длины.

TShiftState определяется в System.Classes вот так:

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

Как я могу правильно передать это в A подпрограмма?

1 ответ

Решение

Изменить первый параметр A в const Sh: TShiftState, Затем измените каждый вызов A в форму

A([ssShift], 'Shift');

и, наконец, условие проверки в

if Sh <= Shift then

Ссылка Выражения

X <= Y Истина на всякий случай, если каждый член X является членом Y

Другие вопросы по тегам