Как передать анонимный перечислимый тип в подпрограмму?
Я пытаюсь сделать удобную функцию для преобразования 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