{$MODE OBJFPC}
{$MODESWITCH TYPEHELPERS}
program TestHelper;
uses SysUtils, DateUtils;
type
TCharHelper = type helper for Char
public
const
Size = SizeOf( Char );
MinValue = Char( Low( Char ) );
MaxValue = Char( High( Char ) );
public
function ToString :String;
// IsSymbol, IsControl, IsDigit, IsNumber, IsPunctuation, IsSeparator
// IsLowSurrogate, IsHighSurrogate, IsSurrogate, IsSurrogatePair
// IsLetter, IsLetterOrDigit, IsWhiteSpace, IsLower, IsUpper
// ToLower, ToUpper
end;
TCurrencyHelper = type helper for Currency
public
const
Size = SizeOf( Currency );
MinValue = Currency( -922337203685477.5808 ); // Low ?
MaxValue = Currency( 922337203685477.5807 ); // High ?
public
function ToString :String;
end;
TDateHelper = type helper for TDateTime
public
const
Size = SizeOf( TDateTime );
MinValue = TDateTime( -6.9359300000000000E+005 ); // EncodeDate( 1, 1, 1 ) + EncodeTime( 0, 0, 0, 0 );
MaxValue = TDateTime( 2.9584659999999884E+006 ); // EncodeDate( 9999, 12, 31 ) + EncodeTime( 23, 59, 59, 999 ); // predicted end of the world
public
function ToString :String;
function Year :Word;
function Month :Word;
function Week :Word;
function Day :Word;
function Hour :Word;
function Minute :Word;
function Second :Word;
function MilliSecond :Word;
end;
function TCharHelper.ToString :String;
begin
result := self;
end;
function TCurrencyHelper.ToString :String;
begin
result := FormatFloat( '#,##0.0000', self );
end;
function TDateHelper.ToString :String;
begin
result := FormatDateTime( 'YYYY-MM-DD HH:mm:ss:zzz', self );
end;
function TDateHelper.Year :Word;
begin
result := YearOf( self );
end;
function TDateHelper.Month :Word;
begin
result := MonthOf( self );
end;
function TDateHelper.Week :Word;
begin
result := WeekOf( self );
end;
function TDateHelper.Day :Word;
begin
result := DayOf( self );
end;
function TDateHelper.Hour :Word;
begin
result := HourOf( self );
end;
function TDateHelper.Minute :Word;
begin
result := MinuteOf( self );
end;
function TDateHelper.Second :Word;
begin
result := SecondOf( self );
end;
function TDateHelper.MilliSecond :Word;
begin
result := MilliSecondOf( self );
end;
var
VBoolean :Boolean;
VChar :Char;
VByte :Byte;
VUInt8 :UInt8;
VUInt16 :UInt16;
VUInt32 :UInt32;
VUInt64 :UInt64;
VNativeUInt :NativeUInt;
VInt8 :Int8;
VInt16 :Int16;
VInt32 :Int32;
VInt64 :Int64;
VNativeInt :NativeInt;
VSingle :Single;
VDouble :Double;
VExtended :Extended;
VCurrency :Currency;
VDateTime :TDateTime;
VGuid :TGuid;
VString :String;
VPointer :Pointer;
begin
WriteLn( 'Types Value Not Initialize = Ordinal Value' );
WriteLn( '----------- ----------------------------------------------' );
WriteLn( 'Boolean : ', VBoolean, ' = ', Ord( VBoolean ), ' : ', true, ' = ', Ord( true ) );
WriteLn( 'Char : ', VChar, ' = ', Ord( VChar ) );
WriteLn( 'Byte : ', VByte, ' = ', Ord( VByte ) );
WriteLn( 'UInt8 : ', VUInt8, ' = ', Ord( VUInt8 ) );
WriteLn( 'UInt16 : ', VUInt16, ' = ', Ord( VUInt16 ) );
WriteLn( 'UInt32 : ', VUInt32, ' = ', Ord( VUInt32 ) );
WriteLn( 'UInt64 : ', VUInt64, ' = ', Ord( VUInt64 ) );
WriteLn( 'NativeUInt : ', VNativeUInt, ' = ', Ord( VNativeUInt ) );
WriteLn( 'Int8 : ', VInt8, ' = ', Ord( VInt8 ) );
WriteLn( 'Int16 : ', VInt16, ' = ', Ord( VInt16 ) );
WriteLn( 'Int32 : ', VInt32, ' = ', Ord( VInt32 ) );
WriteLn( 'Int64 : ', VInt64, ' = ', Ord( VInt64) );
WriteLn( 'NativeInt : ', VNativeInt, ' = ', Ord( VNativeInt ) );
WriteLn( 'Single : ', VSingle, ' = none' );
WriteLn( 'Double : ', VDouble, ' = none' );
WriteLn( 'Extended : ', VExtended, ' = none' );
WriteLn( 'Currency : ', VCurrency, ' = none' );
WriteLn( 'TDateTime : ', VDateTime, ' = none' );
WriteLn( 'TGuid : ', VGuid.ToString, ' = none' );
WriteLn( 'String : ', VString, ' = none' );
Write ( 'Pointer : ' );
if VPointer = nil then WriteLn( 'nil = none' );
WriteLn;
WriteLn( 'Types Size = SizeOf : MinValue .. MaxValue : Low .. High');
WriteLn( '----------- ----------------------------------------------' );
WriteLn( 'Boolean : ', Boolean.Size, ' = ', SizeOf( Boolean ), ' : 0 - 1', ' : ', Low( Boolean ), ' .. ', High( Boolean ) );
WriteLn( 'Char : ', Char.Size, ' = ', SizeOf( Char ), ' : ', Char.MinValue, ' .. ', Char.MaxValue, ' : ', Low( Char ), ' .. ', High( Char ) );
WriteLn( 'Byte : ', Byte.Size, ' = ', SizeOf( Byte ), ' : ', Byte.MinValue, ' .. ', Byte.MaxValue, ' : ', Low( Byte ), ' .. ', High( Byte ) );
WriteLn( 'UInt8 : ', UInt8.Size, ' = ', SizeOf( UInt8 ), ' : ', UInt8.MinValue, ' .. ', UInt8.MaxValue, ' : ', Low( UInt8 ), ' .. ', High( UInt8 ) );
WriteLn( 'UInt16 : ', UInt16.Size, ' = ', SizeOf( UInt16 ), ' : ', UInt16.MinValue, ' .. ', UInt16.MaxValue, ' : ', Low( UInt16 ), ' .. ', High( UInt16 ) );
WriteLn( 'UInt32 : ', UInt32.Size, ' = ', SizeOf( UInt32 ), ' : ', UInt32.MinValue, ' .. ', UInt32.MaxValue, ' : ', Low( UInt32 ), ' .. ', High( UInt32 ) );
WriteLn( 'UInt64 : ', UInt64.Size, ' = ', SizeOf( UInt64 ), ' : ', UInt64.MinValue, ' .. ', UInt64.MaxValue, ' : ', Low( UInt64 ), ' .. ', High( UInt64 ) );
WriteLn( 'NativeUInt : ', NativeUInt.Size, ' = ', SizeOf( NativeUint ), ' : ', NativeUInt.MinValue, ' .. ', NativeUInt.MaxValue, ' : ', Low( NativeUInt ),' .. ', High( NativeUInt ) );
WriteLn( 'Int8 : ', Int8.Size, ' = ', SizeOf( Int8 ), ' : ', Int8.MinValue, ' .. ', Int8.MaxValue, ' : ', Low( Int8 ), ' .. ', High( Int8 ) );
WriteLn( 'Int16 : ', Int16.Size, ' = ', SizeOf( Int16 ), ' : ', Int16.MinValue, ' .. ', Int16.MaxValue, ' : ', Low( Int16 ), ' .. ', High( Int16 ) );
WriteLn( 'Int32 : ', Int32.Size, ' = ', SizeOf( Int32 ), ' : ', Int32.MinValue, ' .. ', Int32.MaxValue, ' : ', Low( Int32 ), ' .. ', High( Int32 ) );
WriteLn( 'Int64 : ', Int64.Size, ' = ', SizeOf( Int64 ), ' : ', Int64.MinValue, ' .. ', Int64.MaxValue, ' : ', Low( Int64 ), ' .. ', High( Int64 ) );
WriteLn( 'NativeInt : ', NativeInt.Size, ' = ', SizeOf( NativeInt ), ' : ', NativeInt.MinValue, ' .. ', NativeInt.MaxValue, ' : ', Low( NativeInt ), ' .. ', High( NativeInt ) );
WriteLn( 'Single : ', Single.Size, ' = ', SizeOf( Single ), ' : ', Single.MinValue, ' .. ', Single.MaxValue, ' : type mismatch ' );
WriteLn( 'Double : ', Double.Size, ' = ', SizeOf( Double ), ' : ', Double.MinValue, ' .. ', Double.MaxValue, ' : type mismatch ' );
WriteLn( 'Extended : ', Extended.Size, ' = ', SizeOf( Extended ), ' : ', Extended.MinValue, ' .. ', Extended.MaxValue, ' : type mismatch ' );
WriteLn( 'Currency : ', Currency.Size, ' = ', SizeOf( Currency ), ' : ', Currency.MinValue, ' .. ', Currency.MaxValue, ' : type mismatch ' );
WriteLn( 'TDateTime : ', TDateTime.Size, ' = ', SizeOf( TDateTime ), ' : ', TDateTime.MinValue, ' .. ', TDateTime.MaxValue, ' : ', TDateTime.MinValue.ToString, ' - ', TDateTime.MaxValue.ToString );
WriteLn( 'TGuid : ', ' none ' );
WriteLn( 'String : ', ' none' );
Write ( 'Pointer : ' );
if VPointer = nil then WriteLn( 'nil none' );
WriteLn;
WriteLn( 'Types ToString Not Initialize' );
WriteLn( '----------- ----------------------------------------------' );
WriteLn( 'Boolean : ', VBoolean.ToString );
WriteLn( 'Char : ', VChar.ToString );
WriteLn( 'Byte : ', VByte.ToString );
WriteLn( 'UInt8 : ', VUInt8.ToString );
WriteLn( 'UInt16 : ', VUInt16.ToString );
WriteLn( 'UInt32 : ', VUInt32.ToString );
WriteLn( 'UInt64 : ', VUInt64.ToString );
WriteLn( 'NativeUInt : ', VNativeUInt.ToString );
WriteLn( 'Int8 : ', VInt8.ToString );
WriteLn( 'Int16 : ', VInt16.ToString );
WriteLn( 'Int32 : ', VInt32.ToString );
WriteLn( 'Int64 : ', VInt64.ToString );
WriteLn( 'NativeInt : ', VNativeInt.ToString );
WriteLn( 'Single : ', VSingle.ToString );
WriteLn( 'Double : ', VDouble.ToString );
WriteLn( 'Extended : ', VExtended.ToString );
WriteLn( 'Currency : ', VCurrency.ToString );
WriteLn( 'TDateTime : ', VDateTime.ToString );
WriteLn( 'TGuid : ', VGuid.ToString );
WriteLn( 'String : ', VString );
WriteLn( 'Pointer : ', HexStr( VPointer ) );
VBoolean := Low( Boolean );
VChar := Char.MinValue;
VByte := Byte.MinValue;
VUInt8 := UInt8.MinValue;
VUInt16 := UInt16.MinValue;
VUInt32 := UInt32.MinValue;
VUInt64 := UInt64.MinValue;
VNativeUInt := NativeUInt.MinValue;
VInt8 := Int8.MinValue;
VInt16 := Int16.MinValue;
VInt32 := Int32.MinValue;
VInt64 := Int64.MinValue;
VNativeInt := NativeInt.MinValue;
VSingle := Single.MinValue;
VDouble := Double.MinValue;
VExtended := Extended.MinValue;
VCurrency := Currency.MinValue;
VDateTime := TDateTime.MinValue;
VGuid := GUID_NULL; // TGUID.NullGuid ?
VString := ''; // TString.Empty ?
VPointer := nil;
WriteLn;
WriteLn( 'Types ToString MinValue' );
WriteLn( '----------- ----------------------------------------------' );
WriteLn( 'Boolean : ', VBoolean.ToString );
WriteLn( 'Char : ', VChar.ToString );
WriteLn( 'Byte : ', VByte.ToString );
WriteLn( 'UInt8 : ', VUInt8.ToString );
WriteLn( 'UInt16 : ', VUInt16.ToString );
WriteLn( 'UInt32 : ', VUInt32.ToString );
WriteLn( 'UInt64 : ', VUInt64.ToString );
WriteLn( 'NativeUInt : ', VNativeUInt.ToString );
WriteLn( 'Int8 : ', VInt8.ToString );
WriteLn( 'Int16 : ', VInt16.ToString );
WriteLn( 'Int32 : ', VInt32.ToString );
WriteLn( 'Int64 : ', VInt64.ToString );
WriteLn( 'NativeInt : ', VNativeInt.ToString );
WriteLn( 'Single : ', VSingle.ToString );
WriteLn( 'Double : ', VDouble.ToString );
WriteLn( 'Extended : ', VExtended.ToString );
WriteLn( 'Currency : ', VCurrency.ToString );
WriteLn( 'TDateTime : ', VDateTime.ToString );
WriteLn( 'TGuid : ', VGuid.ToString );
WriteLn( 'String : ', VString );
WriteLn( 'Pointer : ', HexStr( VPointer ) );
VBoolean := High( Boolean );
VChar := Char.MaxValue;
VByte := Byte.MaxValue;
VUInt8 := UInt8.MaxValue;
VUInt16 := UInt16.MaxValue;
VUInt32 := UInt32.MaxValue;
VUInt64 := UInt64.MaxValue;
VNativeUInt := NativeUInt.MaxValue;
VInt8 := Int8.MaxValue;
VInt16 := Int16.MaxValue;
VInt32 := Int32.MaxValue;
VInt64 := Int64.MaxValue;
VNativeInt := NativeInt.MaxValue;
VSingle := Single.MaxValue;
VDouble := Double.MaxValue;
VExtended := Extended.MaxValue;
VCurrency := Currency.MaxValue;
VDateTime := TDateTime.MaxValue;
VGuid := TGuid.NewGuid;
VString := 'abc'; // add TString.ToBase64 and TString.ToHexString and other encoding ...
VPointer := Addr( VGuid );
WriteLn;
WriteLn( 'Types ToString MaxValue' );
WriteLn( '----------- ----------------------------------------------' );
WriteLn( 'Boolean : ', VBoolean.ToString );
WriteLn( 'Char : ', VChar.ToString );
WriteLn( 'Byte : ', VByte.ToString );
WriteLn( 'UInt8 : ', VUInt8.ToString );
WriteLn( 'UInt16 : ', VUInt16.ToString );
WriteLn( 'UInt32 : ', VUInt32.ToString );
WriteLn( 'UInt64 : ', VUInt64.ToString );
WriteLn( 'NativeUInt : ', VNativeUInt.ToString );
WriteLn( 'Int8 : ', VInt8.ToString );
WriteLn( 'Int16 : ', VInt16.ToString );
WriteLn( 'Int32 : ', VInt32.ToString );
WriteLn( 'Int64 : ', VInt64.ToString );
WriteLn( 'NativeInt : ', VNativeInt.ToString );
WriteLn( 'Single : ', VSingle.ToString );
WriteLn( 'Double : ', VDouble.ToString );
WriteLn( 'Extended : ', VExtended.ToString );
WriteLn( 'Currency : ', VCurrency.ToString );
WriteLn( 'TDateTime : ', VDateTime.ToString );
WriteLn( 'TGuid : ', VGuid.ToString );
WriteLn( 'String : ', VString );
WriteLn( 'Pointer : ', HexStr( VPointer ) );
VDateTime := Now;
WriteLn( 'Now : ', VDateTime.Year, '-', VDateTime.Month, '-', VDateTime.Day, ' ',
VDateTime.Hour, ':', VDateTime.Minute, ':', VDateTime.Second, '.', VDateTime.MilliSecond, ' = ',
VDateTime.ToString );
end.