Meine Enums haben keine Lücken, da ich diese Zuweisung 1, 2, 3 nicht benutze.
Delphi-Quellcode:
function TEnumUtils.isDefined<T>(MyValue: T): Boolean;
begin
Result := not((Ord(MyValue) < 0) or (Ord(MyValue) > Ord(High(T))));
end;
scheint ohnehin nicht zu funktionieren leider. Enums sind so ein Thema bei mir.
Deinen Link gucke ich mir gleich mal an.
Was genau macht eigentlich dieses Guard.CheckEnum?
Delphi-Quellcode:
class procedure Guard.CheckEnum<T>(const argumentValue: T;
const argumentName: string);
var
intValue: Integer;
begin
intValue := 0;
Move(argumentValue, intValue, SizeOf(T));
Guard.CheckEnum<T>(intValue, argumentName);
end;
===
Hier ist mein Ergebnis
Delphi-Quellcode:
class function TEnumUtils.IsDefined<T>(const Value: Integer): Boolean;
var
data: PTypeData;
begin
data := GetTypeData(TypeInfo(T));
Result := (Value >= data.MinValue) and (Value <= data.MaxValue);
end;
class function TEnumUtils.IsDefined<T>(const Value: T): Boolean;
var
i: Integer;
begin
i := TEnumUtils.ToInteger<T>(Value);
Result := TEnumUtils.IsDefined<T>(i);
end;
class function TEnumUtils.IsDefined<T>(const Value: string): Boolean;
begin
Result := TEnumUtils.IsDefined<T>(TEnumUtils.GetValue<T>(Value, -1));
end;
Ich habe mir noch ein IsDefined mit String-Parameter deklariert, weil ich das zusammen mit meiner Ini-Klasse benötige.