I have declared the following enum type in which I want the first member to have the ordinal value of 1 (one) rather than the usual 0 (zero):
type
TMyEnum = (
meFirstValue = 1,
meSecondValue,
meThirdValue
);
If I call TypeInfo(), e.g. as part of a call to GetEnumName(), I get a compiler error:
GetEnumName(TypeInfo(TMyEnum), Ord(aValue));
ERROR: "E2134: Type 'TMyEnum' has no typeinfo"
Why is this?
I know that classes only have typeinfo if they are compiled with the $M compiler option enabled or (derive from some class which was, such as TPersistent) but I didn't think there were any special conditions for having typeinfo for enum types.
Discontiguous enumerations, and enumerations which don't start at zero, don't have typeinfo. For typeinfo to be implemented, it would need to be in a different format from the existing tkEnumeration
, owing to backward compatibility issues.
I considered implementing a tkDiscontiguousEnumeration
(or possibly better named member) for Delphi 2010, but the benefit seemed small considering their relative scarcity and the difficulties in enumeration - how do you encode the ranges efficiently? Some encodings are better for some scenarios, worse for others.