Moin Zusammen,
@Chewie:
Das funktioniert leider nicht.
Ohne Range Checking wird einfach weitergezählt, und mit bekommt man eine Excpetion.
@nupset:
Auch wenn Dir das nicht weiterhelfen kann, möchte ich, der Vollständigkeit halber, noch eine Variante beitragen:
In D2006 kann man sich einen entsprechenden Typen mit Hilfe von operator overloading deklarieren:
Delphi-Quellcode:
interface
type
TOneToThree =
record
var Value : integer;
class operator Implicit(Value : TOneToThree) : integer;
class operator Implicit(Value : integer) : TOneToThree;
class operator inc(Value : TOneToThree) : TOneToThree;
class operator dec(Value : TOneToThree) : TOneToThree;
end;
implementation
class operator TOneToThree.Implicit(Value: TOneToThree): integer;
begin
Result := Value.Value;
end;
class operator TOneToThree.dec(Value: TOneToThree): TOneToThree;
begin
case Value.Value
of
2,3 : Result.Value := Value.Value-1;
else Result.Value := 3;
end;
end;
class operator TOneToThree.Implicit(Value: integer): TOneToThree;
begin
if Value > 3
then begin
Result.Value := 1;
end else begin
if Value < 1
then begin
Result.Value := 3;
end else begin
Result.Value := Value;
end;
end;
end;
class operator TOneToThree.inc(Value: TOneToThree): TOneToThree;
begin
case Value.Value
of
1,2 : Result.Value := Value.Value+1;
else Result.Value := 1;
end;
end;
Deklariert man sich jetzt eine Variable vom Typ TOneToThree, so kann dieser ein beliebiger integer-Wert zugewiesen werden, der in den Bereich von 1 bis 3 gezwungen wird, ausserdem wird der Bereich bei Verwendung von inc/
dec eingehalten.
Man kann das Ganze natürlich noch erweitern, so dass, z.B., auch + und - sich entsprechend verhalten.