【发布时间】:2012-06-22 01:36:38
【问题描述】:
我需要编写一个可以传递不同枚举选择的过程。
type
TEnumOne = (eOneFlagOne, eOneFlagTwo);
TEnumTwo = (eTwoFlagOne, eTwoFlagTwo);
该方法应该采用不同的枚举:
Process([eOneFlagOne, eTwoFlagTwo]);
我正在尝试这样实现它:
// does not work!
procedure Process(const Enums: array of Variant);
var aValue; Variant
begin
for aValue in Enums do
begin
// of course, can't work...
if aValue is TEnumOne then
end;
end;
那么,我可以选择一种类型而不是 Variant 吗?或者是另一种方法,我不明白?
【问题讨论】:
-
内存不足,如果我没记错的话,您可以将枚举转换为整数,例如
I:= Integer(eOneFlagOne);和F:= TEnumOne(I);,在这种情况下,如果eOneFlagOne = 0然后eTwoFlagOne = 0也是。除非您想要更多的唯一 ID,例如 0,1/2,3 而不是 0,1/0,1,在这种情况下,我不知道。 -
或者,作为替代方案,使用常量代替,例如,
const E_ONE_FLAG_ONE = 0; E_ONE_FLAG_TWO = 1; E_TWO_FLAG_ONE = 2; E_TWO_FLAG_TWO = 3;等,并使用这些代替枚举。 -
顺便说一句,我确定 RRUZ 要求该版本可能是因为 XE2 等较新版本可能会提供更简单的方法...
-
你的设计听起来有缺陷。我不会与语言抗争,而是重新考虑设计。对于它的价值,为了编写类似 if aValue is TEnumOne 的东西,您显然需要使用类而不是枚举。这些类可以保存枚举。
-
我正在使用 Delphi XE。问题是,枚举是由 remobjects 作为接口自动生成的。所以我不能改变枚举的定义。