我正在尝试将System.Classes.TShiftState
转换为用户可读的字符串。为了方便起见,我做了一个子程序来执行公共代码,使函数更紧凑。
问题是,我无法弄清楚如何将TShiftState
枚举类型中的一个传递到此子例程中。我尝试了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
子程序?
答案 0 :(得分:7)
将***755
的第一个参数更改为A
。然后将每个调用A更改为表单
const Sh: TShiftState
最后将条件测试转换为
A([ssShift], 'Shift');
参考。 Expressions
X< = Y为True,以防X的每个成员都是Y
的成员