Wenn es in Pascal sein soll, dann kann man (abgesehn von der
ASM-Variante) maximal noch Funktionen wie BinToInt verwenden oder Dergleichen.
Die Delphi-Syntax hat da leider nichts zu bieten
[add]
Zitat von
Aphton:
Interessant wäre noch die Möglichkeit, Variablen < Byte (so wie in
C++) definieren zu können, anstatt mit Bitoperationen rumzufuchteln.
Über einen kleinen Umweg geht auch soetwas ab D2006.
Und vom internen Code her dürfte es wohl auf ein ähnliches Ergebnis kommen, wie in C++.
Halt nur mit ein bischen mehr Arbeit verbunden.
Delphi-Quellcode:
Type
TDateFields = packed Record
Private
_Value: LongInt;
Function GetWeekDay: Byte; Inline;
Procedure SetWeekDay(x: Byte); Inline;
Function GetDay: Byte; Inline;
Procedure SetDay (x: Byte); Inline;
Function GetMonth: Byte; Inline;
Procedure SetMonth (x: Byte); Inline;
Function GetYear: Byte; Inline;
Procedure SetYear (x: Byte); Inline;
Public
Property Value: LongInt Read _Value Write _Value;
Property WeekDay: Byte Read GetWeekDay Write SetWeekDay;
Property Day: Byte Read GetDay Write SetDay;
Property Month: Byte Read GetMonth Write SetMonth;
Property Year: Byte Read GetYear Write SetYear;
End;
Function TDateFields.GetWeekDay: Byte;
Begin
Result := _Value {shr 0} and $07;
End;
Procedure TDateFields.SetWeekDay(x: Byte);
Begin
_Value := (_Value and not $07) or ((x and $07) {shr 0});
End;
Function TDateFields.GetDay: Byte;
Begin
Result := _Value shr 3 and $31;
End;
Procedure TDateFields.SetDay(x: Byte);
Begin
_Value := (_Value and not $31) or ((x and $31) shr 3);
End;
Function TDateFields.GetMonth: Byte;
Begin
Result := _Value shr 9 and $15;
End;
Procedure TDateFields.SetMonth(x: Byte);
Begin
_Value := (_Value and not $15) or ((x and $15) shr 9);
End;
Function TDateFields.GetYear: Byte;
Begin
Result := _Value shr 14 {and $255};
End;
Procedure TDateFields.SetYear(x: Byte);
Begin
_Value := (_Value and not $255) or ((x {and $255}) shr 14);
End;
Aber eigentlich wäre soetwas doch eine gute erweiterung für Delphi?
So als neue Syntax für die Property
Property Day: Byte Read _Value : 3 : 5 Write _Value : 3 : 5;
oder irgendwie so (Variable : ab welchem Bit : für vieviele Bits)