TProviderFlag = (pfInUpdate, pfInWhere, pfInKey, pfHidden);
TProviderFlags = set of TProviderFlag;
我想做这样的事情:
TMyProviderFlag = (pfInUpdate, pfInWhere, pfInKey, pfHidden, pfDummy);
TMyProviderFlags = set of TMyProviderFlag;
,此枚举类型类型。
但是,例如,也应该以某种方式获得
TMyProviderFlag.pfInUpdate
,例如(伪代码):
TProviderFlag.pfInUpdate
标准语言没有提供枚举。有解决方法可以实现类似的事情,但是所有这些都适用于特定用例,并且在其他情况下失败了。一种方法是将扩展的枚举类型声明为一种extended子范围:
:
var my: TMyProviderFlags;
my := [pfHidden, pfDummy];
Table.Field.ProviderFlag := MyInstance.pfHidden;
if pfDummy in MyInstance then ...
uweraabe的答案是正确的。
这是一个不同的解决方案,在其他一些情况下运行良好:type
TProviderFlag = (pfInUpdate, pfInWhere, pfInKey, pfHidden);
TProviderFlags = set of TProviderFlag;
const
{$R-} // otherwise compiler will complain
pfDummy = Succ(pfHidden);
type
TMyProviderFlag = pfInUpdate .. pfDummy;
TMyProviderFlags = set of TMyProviderFlag;
this叶不变,在引擎盖下,新型
type
TBaseEnum = (beOne, beTwo, beThree);
type
TExtEnum = packed record
strict private
Value: Byte;
public
class operator Implicit(const ABaseEnum: TBaseEnum): TExtEnum;
class operator Implicit(const AExtEnum: TExtEnum): TBaseEnum;
end;
{$IF SizeOf(TBaseEnum) <> SizeOf(TExtEnum)}
{$MESSAGE Fatal 'SizeOf(TBaseEnum) <> SizeOf(TExtEnum)'}
{$ENDIF}
const
beFour: TExtEnum = (Value: Succ(Ord(beThree)));
{ TExtEnum }
class operator TExtEnum.Implicit(const AExtEnum: TExtEnum): TBaseEnum;
begin
if InRange(AExtEnum.Value, Ord(Low(TBaseEnum)), Ord(High(TBaseEnum))) then
Result := TBaseEnum(AExtEnum.Value)
else
raise EConvertError.Create('TExtEnum cannot be converted to TBaseEnum.');
end;
class operator TExtEnum.Implicit(const ABaseEnum: TBaseEnum): TExtEnum;
begin
Result.Value := Ord(ABaseEnum);
end;
是超集。这与Delphi的类型系统相处得很好。如果您喜欢(字节是一个字节),则可以在两种类型之间进行不安全的铸件,但是您不必:TBaseEnum
将在两个方向上与
TExtEnum
campations compatign compatign compations::