From: <tw...@us...> - 2024-04-06 15:10:10
|
Revision: 4228 http://sourceforge.net/p/gexperts/code/4228 Author: twm Date: 2024-04-06 15:10:08 +0000 (Sat, 06 Apr 2024) Log Message: ----------- updated to current dzlib version Modified Paths: -------------- trunk/ExternalSource/dzlib/t_NullableNumber.tpl trunk/ExternalSource/dzlib/u_dzClassUtils.pas trunk/ExternalSource/dzlib/u_dzConvertUtils.pas trunk/ExternalSource/dzlib/u_dzFileUtils.pas trunk/ExternalSource/dzlib/u_dzGraphicsUtils.pas trunk/ExternalSource/dzlib/u_dzMiscUtils.pas trunk/ExternalSource/dzlib/u_dzNullableExtended.pas trunk/ExternalSource/dzlib/u_dzNullableTimespan.pas trunk/ExternalSource/dzlib/u_dzNullableTypesUtils.pas trunk/ExternalSource/dzlib/u_dzOsUtils.pas trunk/ExternalSource/dzlib/u_dzStringArrayUtils.pas trunk/ExternalSource/dzlib/u_dzStringUtils.pas trunk/ExternalSource/dzlib/u_dzTranslator.pas trunk/ExternalSource/dzlib/u_dzTypes.pas trunk/ExternalSource/dzlib/u_dzVclUtils.pas Modified: trunk/ExternalSource/dzlib/t_NullableNumber.tpl =================================================================== --- trunk/ExternalSource/dzlib/t_NullableNumber.tpl 2024-04-06 14:46:33 UTC (rev 4227) +++ trunk/ExternalSource/dzlib/t_NullableNumber.tpl 2024-04-06 15:10:08 UTC (rev 4228) @@ -21,9 +21,9 @@ {$IFNDEF __DZ_NULLABLE_NUMBER_TEMPLATE_SECOND_PASS__} type - _NULLABLE_NUMBER_ = record + TdzNullableNumber = record private - FIsValid: IInterface; + FIsValid: INullableTypesFlagInterface; FValue: _NULLABLE_TYPE_BASE_; public procedure Invalidate; @@ -45,55 +45,55 @@ function Abs: _NULLABLE_TYPE_BASE_; function Format(const _FormatStr: string): string; overload; function Format(const _FormatStr: string; const _Settings: TFormatSettings): string; overload; - class operator Negative(_a: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; - class operator Positive(_a: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; - class operator Inc(_a: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; - class operator Dec(_a: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; + class operator Negative(_a: TdzNullableNumber): TdzNullableNumber; + class operator Positive(_a: TdzNullableNumber): TdzNullableNumber; + class operator Inc(_a: TdzNullableNumber): TdzNullableNumber; + class operator Dec(_a: TdzNullableNumber): TdzNullableNumber; - class operator Add(_a, _b: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; - class operator Add(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): _NULLABLE_NUMBER_; - class operator Add(_a: _NULLABLE_TYPE_BASE_; _b: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; + class operator Add(_a, _b: TdzNullableNumber): TdzNullableNumber; + class operator Add(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): TdzNullableNumber; + class operator Add(_a: _NULLABLE_TYPE_BASE_; _b: TdzNullableNumber): TdzNullableNumber; - class operator Subtract(_a, _b: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; - class operator Subtract(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): _NULLABLE_NUMBER_; - class operator Subtract(_a: _NULLABLE_TYPE_BASE_; _b: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; + class operator Subtract(_a, _b: TdzNullableNumber): TdzNullableNumber; + class operator Subtract(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): TdzNullableNumber; + class operator Subtract(_a: _NULLABLE_TYPE_BASE_; _b: TdzNullableNumber): TdzNullableNumber; - class operator Multiply(_a, _b: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; - class operator Multiply(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): _NULLABLE_NUMBER_; - class operator Multiply(_a: _NULLABLE_TYPE_BASE_; _b: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; + class operator Multiply(_a, _b: TdzNullableNumber): TdzNullableNumber; + class operator Multiply(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): TdzNullableNumber; + class operator Multiply(_a: _NULLABLE_TYPE_BASE_; _b: TdzNullableNumber): TdzNullableNumber; - class operator Divide(_a, _b: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; - class operator Divide(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): _NULLABLE_NUMBER_; - class operator Divide(_a: _NULLABLE_TYPE_BASE_; _b: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; + class operator Divide(_a, _b: TdzNullableNumber): TdzNullableNumber; + class operator Divide(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): TdzNullableNumber; + class operator Divide(_a: _NULLABLE_TYPE_BASE_; _b: TdzNullableNumber): TdzNullableNumber; - class operator Implicit(_Value: _NULLABLE_TYPE_BASE_): _NULLABLE_NUMBER_; - class operator Implicit(_a: _NULLABLE_NUMBER_): _NULLABLE_TYPE_BASE_; + class operator Implicit(_Value: _NULLABLE_TYPE_BASE_): TdzNullableNumber; + class operator Implicit(_a: TdzNullableNumber): _NULLABLE_TYPE_BASE_; - class operator Explicit(const _s: string): _NULLABLE_NUMBER_; - class operator Explicit(_a: _NULLABLE_NUMBER_): string; + class operator Explicit(const _s: string): TdzNullableNumber; + class operator Explicit(_a: TdzNullableNumber): string; - class operator LessThan(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): Boolean; - class operator LessThanOrEqual(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): Boolean; - class operator GreaterThan(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): Boolean; - class operator GreaterThanOrEqual(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): Boolean; - class operator Equal(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): Boolean; - class operator NotEqual(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): Boolean; + class operator LessThan(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): Boolean; + class operator LessThanOrEqual(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): Boolean; + class operator GreaterThan(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): Boolean; + class operator GreaterThanOrEqual(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): Boolean; + class operator Equal(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): Boolean; + class operator NotEqual(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): Boolean; - class operator LessThan(_a, _b: _NULLABLE_NUMBER_): Boolean; - class operator LessThanOrEqual(_a, _b: _NULLABLE_NUMBER_): Boolean; - class operator GreaterThan(_a, _b: _NULLABLE_NUMBER_): Boolean; - class operator GreaterThanOrEqual(_a, _b: _NULLABLE_NUMBER_): Boolean; - class operator Equal(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_NUMBER_): Boolean; - class operator NotEqual(_a, _b: _NULLABLE_NUMBER_): Boolean; + class operator LessThan(_a, _b: TdzNullableNumber): Boolean; + class operator LessThanOrEqual(_a, _b: TdzNullableNumber): Boolean; + class operator GreaterThan(_a, _b: TdzNullableNumber): Boolean; + class operator GreaterThanOrEqual(_a, _b: TdzNullableNumber): Boolean; + class operator Equal(_a: TdzNullableNumber; _b: TdzNullableNumber): Boolean; + class operator NotEqual(_a, _b: TdzNullableNumber): Boolean; /// <summary> invalid values are considered smaller than any valid values /// and equal to each other </summary> - class function Compare(_a, _b: _NULLABLE_NUMBER_): Integer; static; + class function Compare(_a, _b: TdzNullableNumber): Integer; static; /// <summary> invalid values are considered equal to each other </summary> - class function IsSame(_a, _b: _NULLABLE_NUMBER_): Boolean; static; - class function Invalid: _NULLABLE_NUMBER_; static; - class function FromVariant(_a: Variant): _NULLABLE_NUMBER_; static; - class function FromStr(const _s: string): _NULLABLE_NUMBER_; static; + class function IsSame(_a, _b: TdzNullableNumber): Boolean; static; + class function Invalid: TdzNullableNumber; static; + class function FromVariant(_a: Variant): TdzNullableNumber; static; + class function FromStr(const _s: string): TdzNullableNumber; static; end; {$ENDIF __DZ_NULLABLE_NUMBER_TEMPLATE_SECOND_PASS__} @@ -113,29 +113,29 @@ {$IFDEF __DZ_NULLABLE_NUMBER_TEMPLATE_SECOND_PASS__} -{ _NULLABLE_NUMBER_ } +{ TdzNullableNumber } -class operator _NULLABLE_NUMBER_.Negative(_a: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; +class operator TdzNullableNumber.Negative(_a: TdzNullableNumber): TdzNullableNumber; begin Result := -_a.Value; end; -class operator _NULLABLE_NUMBER_.Positive(_a: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; +class operator TdzNullableNumber.Positive(_a: TdzNullableNumber): TdzNullableNumber; begin Result := _a.Value; end; -class operator _NULLABLE_NUMBER_.Inc(_a: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; +class operator TdzNullableNumber.Inc(_a: TdzNullableNumber): TdzNullableNumber; begin Result := _a.Value + 1; end; -class operator _NULLABLE_NUMBER_.Dec(_a: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; +class operator TdzNullableNumber.Dec(_a: TdzNullableNumber): TdzNullableNumber; begin Result := _a.Value - 1; end; -class operator _NULLABLE_NUMBER_.Add(_a, _b: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; +class operator TdzNullableNumber.Add(_a, _b: TdzNullableNumber): TdzNullableNumber; begin if not _a.IsValid or not _b.IsValid then raise EInvalidValue.Create(_('Cannot add two nullable values if one of them is not valid.')); @@ -142,7 +142,7 @@ Result := _a.Value + _b.Value; end; -class operator _NULLABLE_NUMBER_.Add(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): _NULLABLE_NUMBER_; +class operator TdzNullableNumber.Add(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): TdzNullableNumber; begin if not _a.IsValid then raise EInvalidValue.Create(_('Cannot add to a nullable value if it is not valid')); @@ -149,7 +149,7 @@ Result := _a.Value + _b; end; -class operator _NULLABLE_NUMBER_.Add(_a: _NULLABLE_TYPE_BASE_; _b: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; +class operator TdzNullableNumber.Add(_a: _NULLABLE_TYPE_BASE_; _b: TdzNullableNumber): TdzNullableNumber; begin if not _b.IsValid then raise EInvalidValue.Create(_('Cannot add to a nullable value if it is not valid')); @@ -156,7 +156,7 @@ Result := _a + _b.Value; end; -class operator _NULLABLE_NUMBER_.Subtract(_a, _b: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; +class operator TdzNullableNumber.Subtract(_a, _b: TdzNullableNumber): TdzNullableNumber; begin if not _a.IsValid or not _b.IsValid then raise EInvalidValue.Create(_('Cannot subtract two nullable values if one of them is not valid')); @@ -163,7 +163,7 @@ Result := _a.Value - _b.Value; end; -class operator _NULLABLE_NUMBER_.Subtract(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): _NULLABLE_NUMBER_; +class operator TdzNullableNumber.Subtract(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): TdzNullableNumber; begin if not _a.IsValid then raise EInvalidValue.Create(_('Cannot subtract from a nullable value if it is not valid')); @@ -170,7 +170,7 @@ Result := _a.Value - _b; end; -class operator _NULLABLE_NUMBER_.Subtract(_a: _NULLABLE_TYPE_BASE_; _b: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; +class operator TdzNullableNumber.Subtract(_a: _NULLABLE_TYPE_BASE_; _b: TdzNullableNumber): TdzNullableNumber; begin if not _b.IsValid then raise EInvalidValue.Create(_('Cannot subtract from a value if it is not valid')); @@ -177,7 +177,7 @@ Result := _a - _b.Value; end; -class operator _NULLABLE_NUMBER_.Multiply(_a, _b: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; +class operator TdzNullableNumber.Multiply(_a, _b: TdzNullableNumber): TdzNullableNumber; begin if not _a.IsValid or not _b.IsValid then raise EInvalidValue.Create(_('Cannot multiply two nullable values if one of them is not valid')); @@ -184,7 +184,7 @@ Result := _a.Value * _b.Value; end; -class operator _NULLABLE_NUMBER_.Multiply(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): _NULLABLE_NUMBER_; +class operator TdzNullableNumber.Multiply(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): TdzNullableNumber; begin if not _a.IsValid then raise EInvalidValue.Create(_('Cannot multiply a nullable value if it is not valid')); @@ -191,7 +191,7 @@ Result := _a.Value * _b; end; -class operator _NULLABLE_NUMBER_.Multiply(_a: _NULLABLE_TYPE_BASE_; _b: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; +class operator TdzNullableNumber.Multiply(_a: _NULLABLE_TYPE_BASE_; _b: TdzNullableNumber): TdzNullableNumber; begin if not _b.IsValid then raise EInvalidValue.Create(_('Cannot multiply a nullable value if it is not valid')); @@ -198,7 +198,7 @@ Result := _a * _b.Value; end; -class operator _NULLABLE_NUMBER_.Divide(_a, _b: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; +class operator TdzNullableNumber.Divide(_a, _b: TdzNullableNumber): TdzNullableNumber; var Res: _NULLABLE_TYPE_BASE_; begin @@ -208,7 +208,7 @@ Result := Res; end; -class operator _NULLABLE_NUMBER_.Divide(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): _NULLABLE_NUMBER_; +class operator TdzNullableNumber.Divide(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): TdzNullableNumber; var Res: _NULLABLE_TYPE_BASE_; begin @@ -218,7 +218,7 @@ Result := Res; end; -class operator _NULLABLE_NUMBER_.Divide(_a: _NULLABLE_TYPE_BASE_; _b: _NULLABLE_NUMBER_): _NULLABLE_NUMBER_; +class operator TdzNullableNumber.Divide(_a: _NULLABLE_TYPE_BASE_; _b: TdzNullableNumber): TdzNullableNumber; var Res: _NULLABLE_TYPE_BASE_; begin @@ -228,7 +228,7 @@ Result := Res; end; -procedure _NULLABLE_NUMBER_.AssignStr(const _s: string; const _FormatSettings: TFormatSettings); +procedure TdzNullableNumber.AssignStr(const _s: string; const _FormatSettings: TFormatSettings); begin if SameText('NULL', _s) then FIsValid := nil @@ -238,7 +238,7 @@ FIsValid := nil; end; -procedure _NULLABLE_NUMBER_.AssignStr(const _s: string; _DecSeparator: Char); +procedure TdzNullableNumber.AssignStr(const _s: string; _DecSeparator: Char); var FormatSettings: TFormatSettings; begin @@ -257,12 +257,12 @@ end; end; -procedure _NULLABLE_NUMBER_.AssignStr(const _s: string); +procedure TdzNullableNumber.AssignStr(const _s: string); begin AssignStr(_s, UserLocaleFormatSettings^); end; -class operator _NULLABLE_NUMBER_.Explicit(const _s: string): _NULLABLE_NUMBER_; +class operator TdzNullableNumber.Explicit(const _s: string): TdzNullableNumber; begin if TryStrToNumber(_s, Result.FValue, UserLocaleFormatSettings^) then Result.FIsValid := GetNullableTypesFlagInterface @@ -270,7 +270,7 @@ Result.FIsValid := nil; end; -class operator _NULLABLE_NUMBER_.Explicit(_a: _NULLABLE_NUMBER_): string; +class operator TdzNullableNumber.Explicit(_a: TdzNullableNumber): string; begin if _a.IsValid then Result := NumberToStr(_a.Value) @@ -278,28 +278,28 @@ Result := ''; end; -class function _NULLABLE_NUMBER_.FromVariant(_a: Variant): _NULLABLE_NUMBER_; +class function TdzNullableNumber.FromVariant(_a: Variant): TdzNullableNumber; begin Result.AssignVariant(_a); end; -class function _NULLABLE_NUMBER_.FromStr(const _s: string): _NULLABLE_NUMBER_; +class function TdzNullableNumber.FromStr(const _s: string): TdzNullableNumber; begin Result.AssignStr(_s); end; -class operator _NULLABLE_NUMBER_.Implicit(_Value: _NULLABLE_TYPE_BASE_): _NULLABLE_NUMBER_; +class operator TdzNullableNumber.Implicit(_Value: _NULLABLE_TYPE_BASE_): TdzNullableNumber; begin Result.FValue := _Value; Result.FIsValid := GetNullableTypesFlagInterface; end; -class operator _NULLABLE_NUMBER_.Implicit(_a: _NULLABLE_NUMBER_): _NULLABLE_TYPE_BASE_; +class operator TdzNullableNumber.Implicit(_a: TdzNullableNumber): _NULLABLE_TYPE_BASE_; begin Result := _a.Value; end; -procedure _NULLABLE_NUMBER_.AssignVariant(_a: Variant); +procedure TdzNullableNumber.AssignVariant(_a: Variant); begin if TryVar2Number(_a, FValue) then FIsValid := GetNullableTypesFlagInterface @@ -307,7 +307,7 @@ FIsValid := nil; end; -class function _NULLABLE_NUMBER_.Compare(_a, _b: _NULLABLE_NUMBER_): Integer; +class function TdzNullableNumber.Compare(_a, _b: TdzNullableNumber): Integer; begin if _a.IsValid then begin if _b.IsValid then @@ -320,7 +320,7 @@ Result := -1; end; -class function _NULLABLE_NUMBER_.IsSame(_a, _b: _NULLABLE_NUMBER_): Boolean; +class function TdzNullableNumber.IsSame(_a, _b: TdzNullableNumber): Boolean; begin if _a.IsValid then begin if _b.IsValid then @@ -335,12 +335,12 @@ end; end; -function _NULLABLE_NUMBER_.Dump: string; +function TdzNullableNumber.Dump: string; begin Result := ToString('<invalid>'); // do not translate end; -function _NULLABLE_NUMBER_.ToString(const _Default: string): string; +function TdzNullableNumber.ToString(const _Default: string): string; begin if IsValid then Result := NumberToStr(FValue) @@ -348,22 +348,22 @@ Result := _Default; end; -function _NULLABLE_NUMBER_.Abs: _NULLABLE_TYPE_BASE_; +function TdzNullableNumber.Abs: _NULLABLE_TYPE_BASE_; begin Result := System.Abs(Value); end; -function _NULLABLE_NUMBER_.Format(const _FormatStr: string): string; +function TdzNullableNumber.Format(const _FormatStr: string): string; begin Result := SysUtils.Format(_FormatStr, [Value]); end; -function _NULLABLE_NUMBER_.Format(const _FormatStr: string; const _Settings: TFormatSettings): string; +function TdzNullableNumber.Format(const _FormatStr: string; const _Settings: TFormatSettings): string; begin Result := SysUtils.Format(_FormatStr, [Value], _Settings); end; -function _NULLABLE_NUMBER_.ToVariant: Variant; +function TdzNullableNumber.ToVariant: Variant; begin if IsValid then Result := Value @@ -371,7 +371,7 @@ Result := Variants.Null; end; -function _NULLABLE_NUMBER_.GetValue(out _Value: _NULLABLE_TYPE_BASE_): Boolean; +function TdzNullableNumber.GetValue(out _Value: _NULLABLE_TYPE_BASE_): Boolean; begin Result := IsValid; if Result then @@ -378,67 +378,67 @@ _Value := FValue; end; -procedure _NULLABLE_NUMBER_.Invalidate; +procedure TdzNullableNumber.Invalidate; begin FIsValid := nil; end; -function _NULLABLE_NUMBER_.IsValid: Boolean; +function TdzNullableNumber.IsValid: Boolean; begin Result := FIsValid <> nil; end; -class operator _NULLABLE_NUMBER_.LessThan(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): Boolean; +class operator TdzNullableNumber.LessThan(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): Boolean; begin Result := CompareValue(_a.Value, _b) < 0; end; -class operator _NULLABLE_NUMBER_.LessThanOrEqual(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): Boolean; +class operator TdzNullableNumber.LessThanOrEqual(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): Boolean; begin Result := CompareValue(_a.Value, _b) <= 0; end; -class operator _NULLABLE_NUMBER_.GreaterThan(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): Boolean; +class operator TdzNullableNumber.GreaterThan(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): Boolean; begin Result := CompareValue(_a.Value, _b) > 0; end; -class operator _NULLABLE_NUMBER_.GreaterThanOrEqual(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): Boolean; +class operator TdzNullableNumber.GreaterThanOrEqual(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): Boolean; begin Result := CompareValue(_a.Value, _b) >= 0; end; -class operator _NULLABLE_NUMBER_.Equal(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): Boolean; +class operator TdzNullableNumber.Equal(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): Boolean; begin Result := SameValue(_a.Value, _b); end; -class operator _NULLABLE_NUMBER_.NotEqual(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_TYPE_BASE_): Boolean; +class operator TdzNullableNumber.NotEqual(_a: TdzNullableNumber; _b: _NULLABLE_TYPE_BASE_): Boolean; begin Result := not SameValue(_a.Value, _b); end; -class operator _NULLABLE_NUMBER_.LessThan(_a, _b: _NULLABLE_NUMBER_): Boolean; +class operator TdzNullableNumber.LessThan(_a, _b: TdzNullableNumber): Boolean; begin Result := (Compare(_a, _b) < 0); end; -class operator _NULLABLE_NUMBER_.LessThanOrEqual(_a, _b: _NULLABLE_NUMBER_): Boolean; +class operator TdzNullableNumber.LessThanOrEqual(_a, _b: TdzNullableNumber): Boolean; begin Result := (Compare(_a, _b) <= 0); end; -class operator _NULLABLE_NUMBER_.GreaterThan(_a, _b: _NULLABLE_NUMBER_): Boolean; +class operator TdzNullableNumber.GreaterThan(_a, _b: TdzNullableNumber): Boolean; begin Result := (Compare(_a, _b) > 0); end; -class operator _NULLABLE_NUMBER_.GreaterThanOrEqual(_a, _b: _NULLABLE_NUMBER_): Boolean; +class operator TdzNullableNumber.GreaterThanOrEqual(_a, _b: TdzNullableNumber): Boolean; begin Result := (Compare(_a, _b) >= 0); end; -class operator _NULLABLE_NUMBER_.Equal(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_NUMBER_): Boolean; +class operator TdzNullableNumber.Equal(_a: TdzNullableNumber; _b: TdzNullableNumber): Boolean; begin if _a.IsValid then begin if _b.IsValid then begin @@ -459,17 +459,17 @@ end; end; -class operator _NULLABLE_NUMBER_.NotEqual(_a: _NULLABLE_NUMBER_; _b: _NULLABLE_NUMBER_): Boolean; +class operator TdzNullableNumber.NotEqual(_a: TdzNullableNumber; _b: TdzNullableNumber): Boolean; begin Result := not (_a = _b); end; -class function _NULLABLE_NUMBER_.Invalid: _NULLABLE_NUMBER_; +class function TdzNullableNumber.Invalid: TdzNullableNumber; begin Result.Invalidate; end; -function _NULLABLE_NUMBER_.Value: _NULLABLE_TYPE_BASE_; +function TdzNullableNumber.Value: _NULLABLE_TYPE_BASE_; begin if not IsValid then raise EInvalidValue.CreateFmt(_('%s is invalid'), [_NULLABLE_TYPE_NAME_]); Modified: trunk/ExternalSource/dzlib/u_dzClassUtils.pas =================================================================== --- trunk/ExternalSource/dzlib/u_dzClassUtils.pas 2024-04-06 14:46:33 UTC (rev 4227) +++ trunk/ExternalSource/dzlib/u_dzClassUtils.pas 2024-04-06 15:10:08 UTC (rev 4228) @@ -410,7 +410,7 @@ function TIniFile_TryReadFloat(const _Filename: string; const _Section, _Ident: string; out _Value: Extended): Boolean; overload; function TIniFile_TryReadFloat(const _Filename: string; const _Section, _Ident: string; out _Value: Double): Boolean; overload; function TIniFile_TryReadFloat(const _Filename: string; const _Section, _Ident: string; out _Value: Single): Boolean; overload; -function TIniFile_ReadFloat(_Ini: TCustomIniFile; const _Section, _Ident: string; out _Value: Extended): Boolean; overload deprecated; // use TryReadFloat instead +function TIniFile_ReadFloat(_Ini: TCustomIniFile; const _Section, _Ident: string; out _Value: Extended): Boolean; overload; deprecated; // use TryReadFloat instead function TIniFile_ReadFloat(_Ini: TCustomIniFile; const _Section, _Ident: string): Extended; overload; function TIniFile_ReadFloat(const _Filename: string; const _Section, _Ident: string): Extended; overload; Modified: trunk/ExternalSource/dzlib/u_dzConvertUtils.pas =================================================================== --- trunk/ExternalSource/dzlib/u_dzConvertUtils.pas 2024-04-06 14:46:33 UTC (rev 4227) +++ trunk/ExternalSource/dzlib/u_dzConvertUtils.pas 2024-04-06 15:10:08 UTC (rev 4228) @@ -290,7 +290,6 @@ /// variable DecimalSeparator in SysUtils. </summary> function TryStr2Float(const _s: string; out _flt: Extended; _DecSeparator: Char = '.'): Boolean; overload; -{$IF SizeOf(Extended) <> SizeOf(Double)} ///<summary> /// tries to convert a string to a float, returns false if it fails /// @param s is the string to convert @@ -301,7 +300,6 @@ /// NOTE: This is not thread safe in Delphi 6 because there it changes the global /// variable DecimalSeparator in SysUtils. </summary> function TryStr2Float(const _s: string; out _flt: Double; _DecSeparator: Char = '.'): Boolean; overload; -{$IFEND} function TryStr2Float(const _s: string; out _flt: Single; _DecSeparator: Char = '.'): Boolean; overload; ///<summary> @@ -455,6 +453,9 @@ function Bool2Str(_b: Boolean): string; type + TBitGrouping = (bgNone, bgNibble, bgByte, bgWord, bgLongWord); + +type TBitNumber64 = 0..63; TByteNumber64 = 0..7; @@ -480,6 +481,7 @@ class function Create(_Value: TValue): TBits64; static; class function AllSet: TBits64; static; class function NoneSet: TBits64; static; + function Dump: string; procedure Init(_Value: TValue); function IsBitSet(_BitNo: TBitNumber): Boolean; procedure SetBit(_BitNo: TBitNumber; _BitValue: Boolean); @@ -492,7 +494,7 @@ function Value: TValue; function GetByte(_ByteNo: TByteNumber): Byte; procedure SetByte(_ByteNo: TByteNumber; _Value: Byte); - function AsString: string; + function AsString(_Grouped: TBitGrouping = bgNone): string; class operator BitwiseAnd(_a, _b: TBits64): TBits64; class operator BitwiseOr(_a, _b: TBits64): TBits64; class operator BitwiseXor(_a, _b: TBits64): TBits64; @@ -528,6 +530,7 @@ class function Create(_Value: TValue): TBits32; static; class function AllSet: TBits32; static; class function NoneSet: TBits32; static; + function Dump: string; procedure Init(_Value: TValue); function IsBitSet(_BitNo: TBitNumber): Boolean; procedure SetBit(_BitNo: TBitNumber; _BitValue: Boolean); @@ -540,7 +543,7 @@ function Value: TValue; function GetByte(_ByteNo: TByteNumber): Byte; procedure SetByte(_ByteNo: TByteNumber; _Value: Byte); - function AsString: string; + function AsString(_Grouped: TBitGrouping = bgNone): string; class operator BitwiseAnd(_a, _b: TBits32): TBits32; class operator BitwiseOr(_a, _b: TBits32): TBits32; class operator BitwiseXor(_a, _b: TBits32): TBits32; @@ -576,6 +579,7 @@ class function Create(_Value: TValue): TBits16; static; class function AllSet: TBits16; static; class function NoneSet: TBits16; static; + function Dump: string; procedure Init(_Value: TValue); function IsBitSet(_BitNo: TBitNumber): Boolean; function IsAnyBitSet: Boolean; @@ -589,7 +593,7 @@ function Value: TValue; function GetByte(_ByteNo: TByteNumber): Byte; procedure SetByte(_ByteNo: TByteNumber; _Value: Byte); - function AsString: string; + function AsString(_Grouped: TBitGrouping = bgNone): string; class operator BitwiseAnd(_a, _b: TBits16): TBits16; class operator BitwiseOr(_a, _b: TBits16): TBits16; class operator BitwiseXor(_a, _b: TBits16): TBits16; @@ -623,6 +627,7 @@ class function Create(_Value: TValue): TBits8; static; class function AllSet: TBits8; static; class function NoneSet: TBits8; static; + function Dump: string; procedure Init(_Value: TValue); function IsBitSet(_BitNo: TBitNumber): Boolean; function IsAnyBitSet: Boolean; @@ -636,7 +641,7 @@ function Value: TValue; function GetByte(_ByteNo: TByteNumber): Byte; procedure SetByte(_ByteNo: TByteNumber; _Value: Byte); - function AsString: string; + function AsString(_Grouped: TBitGrouping = bgNone): string; // according to the documentation: // > For a logical operator and a bitwise operator using the same symbol, // > the logical operator is used only when the operands are booleans. @@ -1241,7 +1246,6 @@ {$IFEND} end; -{$IF SizeOf(Extended) <> SizeOf(Double)} function TryStr2Float(const _s: string; out _flt: Double; _DecSeparator: Char = '.'): Boolean; var flt: Extended; @@ -1250,7 +1254,6 @@ if Result then _flt := flt; end; -{$IFEND} function TryStr2Float(const _s: string; out _flt: Single; _DecSeparator: Char = '.'): Boolean; var @@ -1507,14 +1510,42 @@ Bytes[_ByteNo] := _Value; end; -function TBits64.AsString: string; +function TBits64.Dump: string; +begin + Result := AsString(bgByte); +end; + +procedure GroupBits(var _s: string; _Grouped: TBitGrouping); var i: Integer; + Step: Integer; begin + case _Grouped of + bgNibble: Step := 4; + bgByte: Step := 8; + bgWord: Step := 16; + bgLongWord: Step := 32; + else + Step := 64; + end; + + i := Length(_s) - Step + 1; + while i > 1 do begin + Insert(' ', _s, i); + Dec(i, Step); + end; +end; + +function TBits64.AsString(_Grouped: TBitGrouping = bgNone): string; +var + i: Integer; +begin Result := DupeString('0', Bits); - for i := High downto Low do + for i := High downto Low do begin if IsBitSet(i) then Result[Bits - i] := '1'; + end; + GroupBits(Result, _Grouped); end; class operator TBits64.BitwiseAnd(_a, _b: TBits64): TBits64; @@ -1549,14 +1580,21 @@ Result.Init($FFFFFFFF); end; -function TBits32.AsString: string; +function TBits32.Dump: string; +begin + Result := AsString(bgByte); +end; + +function TBits32.AsString(_Grouped: TBitGrouping = bgNone): string; var i: Integer; begin Result := DupeString('0', Bits); - for i := High downto Low do + for i := High downto Low do begin if IsBitSet(i) then Result[Bits - i] := '1'; + end; + GroupBits(Result, _Grouped); end; class function TBits32.Create(_Value: TValue): TBits32; @@ -1662,14 +1700,21 @@ Result.Init($FFFF); end; -function TBits16.AsString: string; +function TBits16.Dump: string; +begin + Result := AsString(bgByte); +end; + +function TBits16.AsString(_Grouped: TBitGrouping = bgNone): string; var i: Integer; begin Result := DupeString('0', Bits); - for i := High downto Low do + for i := High downto Low do begin if IsBitSet(i) then Result[Bits - i] := '1'; + end; + GroupBits(Result, _Grouped); end; class function TBits16.Create(_Value: TValue): TBits16; @@ -1775,14 +1820,21 @@ { TBits8 } -function TBits8.AsString: string; +function TBits8.Dump: string; +begin + Result := AsString(bgByte); +end; + +function TBits8.AsString(_Grouped: TBitGrouping = bgNone): string; var i: Integer; begin Result := DupeString('0', Bits); - for i := High downto Low do + for i := High downto Low do begin if IsBitSet(i) then Result[Bits - i] := '1'; + end; + GroupBits(Result, _Grouped); end; class function TBits8.AllSet: TBits8; @@ -1990,6 +2042,21 @@ Result := True; end; +{$IFDEF DEBUG} +procedure AssertBitsDump; +var + bits64: TBits64; + bits32: TBits32; + bits16: TBits16; + bits8: TBits8; +begin + bits64.Dump; + bits32.Dump; + bits16.Dump; + bits8.Dump; +end; +{$ENDIF DEBUG} + initialization {$IF Declared(TFormatSettings)} DZ_FORMAT_DECIMAL_POINT := u_dzStringUtils.GetUserDefaultLocaleSettings; @@ -1996,8 +2063,11 @@ DZ_FORMAT_DECIMAL_POINT.DecimalSeparator := '.'; DZ_FORMAT_DECIMAL_POINT.ThousandSeparator := #0; {$IFEND} - +{$IFDEF DEBUG} Assert(AssertYNStringLength); Assert(AssertSwap32); Assert(AssertBitReverse32); + + AssertBitsDump; +{$ENDIF DEBUG} end. Modified: trunk/ExternalSource/dzlib/u_dzFileUtils.pas =================================================================== --- trunk/ExternalSource/dzlib/u_dzFileUtils.pas 2024-04-06 14:46:33 UTC (rev 4227) +++ trunk/ExternalSource/dzlib/u_dzFileUtils.pas 2024-04-06 15:10:08 UTC (rev 4228) @@ -1270,7 +1270,7 @@ /// if Rewrite fails, File is zeroed /// @raise exception, if rewrite fails </summary> procedure TextFile_AssignAndRewrite(var _File: TextFile; const _Filename: string); -function TextFile_IsOpen(const _File: TextFile): Boolean; +function TextFile_IsOpen(var _File: TextFile): Boolean; procedure TextFile_Close(var _File: TextFile); implementation @@ -1981,6 +1981,15 @@ end; end; +{$if not declared(MOVEFILE_WRITE_THROUGH)} +const + MOVEFILE_WRITE_THROUGH = $00000008; +{$ifend} +{$if not declared(MOVEFILE_FAIL_IF_NOT_TRACKABLE)} +const + MOVEFILE_FAIL_IF_NOT_TRACKABLE = $00000020; +{$ifend} + class function TFileSystem.MoveFileEx(const _Source, _Dest: string; _Flags: TMoveFileExFlagSet; _ErrorHandling: TErrorHandlingEnum = ehRaiseException): Boolean; var @@ -3418,7 +3427,7 @@ end; end; -function TextFile_IsOpen(const _File: TextFile): Boolean; +function TextFile_IsOpen(var _File: TextFile): Boolean; begin Result := (TTextRec(_File).Mode <> 0); end; Modified: trunk/ExternalSource/dzlib/u_dzGraphicsUtils.pas =================================================================== --- trunk/ExternalSource/dzlib/u_dzGraphicsUtils.pas 2024-04-06 14:46:33 UTC (rev 4227) +++ trunk/ExternalSource/dzlib/u_dzGraphicsUtils.pas 2024-04-06 15:10:08 UTC (rev 4228) @@ -128,52 +128,34 @@ function GetRgbBrightness(_Red, _Green, _Blue: Byte; _Channel: TRgbBrightnessChannelEnum): Byte; function CalcBytesPerPixel(_PixelFormat: TPixelFormat): Integer; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} function CalcBytesPerLine(_Width, _BytesPerPixel: Integer): Integer; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} + function CalcBytesPerLine(_Width: Integer; _PixelFormat: TPixelFormat): Integer; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} + function CalcBytesPerLine(_Width: Integer; _bmp: TBitmap): Integer; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} procedure IncPtr(var _Ptr: Pointer; _Offset: IntPtr); -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} function AddToPtr(const _Ptr: Pointer; _Offset: IntPtr): Pointer; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} function PtrDiff(const _Ptr1, _Ptr2: Pointer): IntPtr; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} function TdzRgbTriple_GetFastLuminance(const _Triple: TdzRgbTriple): Byte; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} procedure TdzRgbTriple_SetColor(var _Triple: TdzRgbTriple; _Color: TColor); -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} function GetFastLuminance(const _Red, _Green, _Blue: Byte): Byte; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} type TdzRgbTripleArray = packed array[0..MaxInt div SizeOf(TdzRgbTriple) - 1] of TdzRgbTriple; @@ -206,15 +188,11 @@ ///<summary> Returns the bounding box of the active clipping region </summary> function TCanvas_GetClipRect(_Canvas: TCanvas): TRect; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> Sets a clipping rect, returns true, if the region is not empty, false if it is empty </summary> function TCanvas_SetClipRect(_Canvas: TCanvas; _Rect: TRect): Boolean; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} type TDrawTextFlags = ( @@ -267,36 +245,24 @@ /// If dtfBottomSingle or dtfVCenterSingle is specified, the return value is the offset /// from Rect.top to the bottom of the drawn text. </summary> function TCanvas_DrawText(_Canvas: TCanvas; const _Text: string; var _Rect: TRect; _Flags: TDrawTextFlagSet): Integer; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} function TCanvas_DrawTextSingleLine(_Canvas: TCanvas; const _Text: string; var _Rect: TRect; _HAlign: TDrawTextHorizontalAlignment; _VAlign: TDrawTextVerticalAlignment; _Flags: TDrawTextFlagSetNoAlign): Integer; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} procedure TCanvas_DrawLine(_cnv: TCanvas; _x1, _y1, _x2, _y2: Integer); overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} procedure TCanvas_DrawLine(_cnv: TCanvas; _pnt1, _pnt2: TPoint); overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} procedure TCanvas_DrawHorizontalLine(_cnv: TCanvas; _x1, _x2, _y: Integer); -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} procedure TCanvas_DrawVerticalLine(_cnv: TCanvas; _x, _y1, _y2: Integer); -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> calls Windows.SaveDC and returns an interface which will automatically call /// Windows.RestoreDC when destroyed </summary> @@ -311,95 +277,70 @@ /// @param Tip is the coordinates of the vertex point /// @param Height is the height of the triangle, if negative, the triangle is painted upside down </summary> procedure TCanvas_DrawTriangle(_Canvas: TCanvas; _Tip: TPoint; _Height: Integer); -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} function TCanvas_BitBlt(_Canvas: TCanvas; _DestPos: TPoint; _Size: TPoint; _Src: TBitmap; _SrcPos: TPoint; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} function TCanvas_BitBlt(_Canvas: TCanvas; _DestPos: TPoint; _Size: TPoint; _Src: TBitmap; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} function TCanvas_BitBlt(_Canvas: TCanvas; _DestRect: TRect; _Src: TBitmap; _SrcPos: TPoint; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} function TCanvas_BitBlt(_Canvas: TCanvas; _DestPos: TPoint; _Src: TBitmap; _SrcPos: TPoint; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} function TCanvas_BitBlt(_Canvas: TCanvas; _DestPos: TPoint; _Src: TBitmap; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> abbreviation for StretchBlt that takes TCanvas and TPoint values. </summary> function dzStretchBlt(_DestCnv: TCanvas; _DestTopLeft: TPoint; _DestSize: TPoint; _SrcCnv: TCanvas; _SrcTopLeft: TPoint; _SrcSize: TPoint; _Rop: DWORD = SRCCOPY): BOOL; overload; -{$IFDEF SUPPORTS_INLINE}inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} function dzStretchBlt(_DestCnv: TCanvas; _DestLeft, _DestTop: Integer; _DestSize: TPoint; _SrcCnv: TCanvas; _SrcTopLeft: TPoint; _SrcSize: TPoint; _Rop: DWORD = SRCCOPY): BOOL; overload; -{$IFDEF SUPPORTS_INLINE}inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> abbreviation for StretchBlt that takes TCanvas, TBitmap and TPoint values. </summary> function dzStretchBlt(_DestCnv: TCanvas; _DestTopLeft: TPoint; _DestSize: TPoint; _SrcBmp: TBitmap; _SrcTopLeft: TPoint; _SrcSize: TPoint; _Rop: DWORD = SRCCOPY): BOOL; overload; -{$IFDEF SUPPORTS_INLINE}inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> abbreviation for StretchBlt that takes TCanvas, TBitmap and TPoint values. </summary> function dzStretchBlt(_DestCnv: TCanvas; _DestLeft, _DestTop: Integer; _DestSize: TPoint; _SrcBmp: TBitmap; _SrcTopLeft: TPoint; _SrcSize: TPoint; _Rop: DWORD = SRCCOPY): BOOL; overload; -{$IFDEF SUPPORTS_INLINE}inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> abbreviation for StretchBlt that takes two TBitmap and TPoint values. </summary> function dzStretchBlt(_DestBmp: TBitmap; _DestTopLeft: TPoint; _DestSize: TPoint; _SrcBmp: TBitmap; _SrcTopLeft: TPoint; _SrcSize: TPoint; _Rop: DWORD = SRCCOPY): BOOL; overload; -{$IFDEF SUPPORTS_INLINE}inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> abbreviation for StretchBlt that takes TRect </summary> function dzStretchBlt(_DestHandle: Hdc; _DestRect: TRect; _SrcHandle: Hdc; _SrcRect: TRect; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> abbreviation for StretchBlt that takes TCanvas and TRect </summary> function dzStretchBlt(_DestCnv: TCanvas; _DestRect: TRect; _SrcHandle: Hdc; _SrcRect: TRect; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> abbreviation for StretchBlt that takes TRect and TBitmap </summary> function dzStretchBlt(_DestHandle: Hdc; _DestRect: TRect; _Src: TBitmap; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> abbreviation for StretchBlt that takes TCanvas, TRect and TBitmap </summary> function dzStretchBlt(_DestCnv: TCanvas; _DestRect: TRect; _Src: TBitmap; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> /// Abbreviation for StretchBlt that takes two TBitmap, resizes and keeps the spect ratio, @@ -407,89 +348,64 @@ /// The original stretchmode and the brush origin are preserved. /// https://msdn.microsoft.com/en-us/library/windows/desktop/dd145089(v=vs.85).aspx </summary> function dzStretchBlt(_DestBmp, _SrcBmp: TBitmap; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> abbreviation for BitBlt that takes TPoint / TRect and TBitmap parameters </summary> function dzBitBlt(_DestHandle: Hdc; _DestPos: TPoint; _Size: TPoint; _Src: TBitmap; _SrcPos: TPoint; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} function dzBitBlt(_DestHandle: Hdc; _DestPos: TPoint; _Size: TPoint; _Src: TBitmap; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} function dzBitBlt(_DestHandle: Hdc; _DestRect: TRect; _Src: TBitmap; _SrcPos: TPoint; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} function dzBitBlt(_DestHandle: Hdc; _DestPos: TPoint; _Src: TBitmap; _SrcPos: TPoint; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} function dzBitBlt(_DestHandle: Hdc; _DestPos: TPoint; _Src: TBitmap; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} procedure TBitmap_SetSize(_bmp: TBitmap; _Width, _Height: Integer); -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} function TBitmap_BitBlt(_DestBmp: TBitmap; _DestPos: TPoint; _Size: TPoint; _Src: TBitmap; _SrcPos: TPoint; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} + function TBitmap_BitBlt(_DestBmp: TBitmap; _DestPos: TPoint; _Size: TPoint; _Src: TBitmap; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} + function TBitmap_BitBlt(_DestBmp: TBitmap; _DestRect: TRect; _Src: TBitmap; _SrcPos: TPoint; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} + function TBitmap_BitBlt(_DestBmp: TBitmap; _DestPos: TPoint; _Src: TBitmap; _SrcPos: TPoint; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} + function TBitmap_BitBlt(_DestBmp: TBitmap; _DestPos: TPoint; _Src: TBitmap; _Rop: DWORD = SRCCOPY): LongBool; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> load a jpeg file and assign it to the bitmap </summary> procedure TBitmap_LoadJpg(_bmp: TBitmap; const _JpgFn: string); overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} + {$IF Declared(TBitmap32)} procedure TBitmap_LoadJpg(_bmp: TBitmap32; const _JpgFn: string); overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} {$IFEND} ///<summary> save a bitmap as a jpeg file </summary> procedure TBitmap_SaveJpg(_bmp: TBitmap; const _JpgFn: string); -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> /// Assign a buffer containg a bitmap in BGR 8 format to the TBitmap </summary> @@ -547,24 +463,19 @@ ///<summary> /// converts a pf24bit or pf32bit monochrome bitmap to a pf8bit monochrome bitmap </summary> function TBitmap_MonoToMono8(_bmp: TBitmap): TBitmap; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} + procedure TBitmap_MonoToMono8(_InBmp, _OutBmp: TBitmap); overload; ///<summary> /// Makes the given bitmap pf8Bit grayscale </summary> procedure TBitmap_MakeMono8(_bmp: TBitmap); -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> /// Create an empty Mono8 TBitmap </summary> function TBitmap_CreateMono8: TBitmap; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> /// Calculates the positive y coordinate for the given x coordinate for an ellipse @@ -574,9 +485,7 @@ /// @param y returns the y coordinate if it can be calculated /// @returns true if the x coordinate was inside the ellipse, false if not </summary> function TryCalcEllipsePoint(_a, _b, _x: Extended; out _y: Extended): Boolean; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> /// Calculates both y coordinates for the given x coordinate for an ellipse @@ -587,9 +496,7 @@ /// @param y1, y2 return the y coordinates if they can be calculated /// @returns true if the x coordinate was inside the ellipse, false if not </summary> function TryCalcEllipsePoints(_x0, _y0, _a, _b, _x: Extended; out _y1, _y2: Extended): Boolean; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> /// Blurs a rectangular area in the given bitmap. @@ -615,9 +522,7 @@ procedure TBitmap8_Sharpen(_SrcBmp, _DstBmp: TBitmap; _Alpha: Single); overload; procedure TBitmap24_Sharpen(_SrcBmp, _DstBmp: TBitmap; _Alpha: Single); overload; procedure TBitmap_Sharpen(_SrcBmp, _DstBmp: TBitmap; _Alpha: Single); overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> /// Sharpens a bitmap, pixelformat must be pf24bit @@ -629,9 +534,7 @@ procedure TBitmap8_Sharpen(_SrcBmp, _DstBmp: TBitmap; const _AlphaMap: TSingleMatrix); overload; procedure TBitmap24_Sharpen(_SrcBmp, _DstBmp: TBitmap; const _AlphaMap: TSingleMatrix); overload; procedure TBitmap_Sharpen(_SrcBmp, _DstBmp: TBitmap; const _AlphaMap: TSingleMatrix); overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> /// Balances the brightness of the SrcBmp bitmap and returns the result in the DstBmp bitmap @@ -784,10 +687,8 @@ FHighCutOff: Byte; FDivisor: Integer; procedure StretchColor(var _Color: Byte); -{$IFDEF SUPPORTS_INLINE} - inline; -{$ENDIF} - public +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} + public constructor Create(_LowCutoff, _HighCutoff: Byte); procedure FilterCallback(_x, _y: Integer; var _Pixel: TdzRgbTriple); overload; procedure FilterCallback(_x, _y: Integer; var _Pixel: Byte); overload; @@ -798,10 +699,8 @@ private FMoveBy: Integer; procedure MoveColor(var _Color: Byte); -{$IFDEF SUPPORTS_INLINE} - inline; -{$ENDIF} - public +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} + public constructor Create(_MoveBy: Integer); procedure FilterCallback(_x, _y: Integer; var _Pixel: TdzRgbTriple); overload; procedure FilterCallback(_x, _y: Integer; var _Pixel: Byte); overload; @@ -815,15 +714,11 @@ ///<summary> // Calculates the (perceived) brightness of an RGB color value (luminance) </summary> function ColorBrightness(_Red, _Green, _Blue: Byte): Byte; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> // Calculates the (perceived) brightness of a TColor value (luminance) </summary> function ColorBrightness(_Color: TColor): Byte; overload; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> /// @returns clWhite or clBlack depending on the brightness (luminance) of the color </summary> @@ -835,7 +730,7 @@ ///<summary> /// @param Hue is a value between 0 and 1 </summary> function RainbowColor(_Hue: Double): TColor; overload; -{{*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} ///<summary> /// @param Hue is a value between 0 and 1 </summary> @@ -845,18 +740,17 @@ ///<summary> /// @param Brightness is a grayscale value </summary> function RainbowColor(_Brightness: Byte): TColor; overload; -{{*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} procedure RainbowColor(_Brightness: Byte; out _Red, _Green, _Blue: Byte); overload; -{{*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} procedure RainbowColor(_Brightness: Byte; out _Pixel: TdzRgbTriple); overload; -{{*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} function RainbowColor(_MinHue, _MaxHue, _Hue: Integer): TColor; overload; -{{*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} - function TryStr2Color(const _s: string; out _Color: TColor): Boolean; function TPicture_TryLoadMatchingFile(_pic: TPicture; const _FileMask: string): Boolean; @@ -876,9 +770,7 @@ u_dzFileUtils; function _(const _s: string): string; -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} begin Result := dzDGetText(_s, 'dzlib'); end; @@ -1708,9 +1600,7 @@ {$ENDIF} procedure TBitmap_SetSize(_bmp: TBitmap; _Width, _Height: Integer); -{$IFDEF SUPPORTS_INLINE} -inline; -{$ENDIF} +{(*}{$IFDEF SUPPORTS_INLINE}inline;{$ENDIF}{*)} begin {$IFDEF SUPPPORTS_BITMAP_SETSIZE} _bmp.SetSize(_Width, _Height); @@ -2614,14 +2504,16 @@ BytesPerLine: Integer; begin Assert(Assigned(_SrcBmp)); + Assert(Assigned(_DstBmp)); _SrcBmp.PixelFormat := pf24bit; - _DstBmp.PixelFormat := pf24bit; w := _SrcBmp.Width; h := _SrcBmp.Height; + + _DstBmp.PixelFormat := pf24bit; TBitmap_SetSize(_DstBmp, w, h); - if h = 0 then + if (h = 0) or (w = 0) then Exit; //==> BytesPerLine := ((w * 8 * BytesPerPixel + 31) and not 31) div 8; @@ -2660,16 +2552,17 @@ BytesPerLine: Integer; begin Assert(Assigned(_SrcBmp)); + Assert(Assigned(_DstBmp)); _SrcBmp.PixelFormat := pf8bit; + w := _SrcBmp.Width; + h := _SrcBmp.Height; _DstBmp.Assign(nil); _DstBmp.PixelFormat := pf8bit; - w := _SrcBmp.Width; - h := _SrcBmp.Height; _DstBmp.Palette := MakeGrayPalette; TBitmap_SetSize(_DstBmp, w, h); - if h = 0 then + if (h = 0) or (w = 0) then Exit; //==> BytesPerLine := ((w * 8 * BytesPerPixel + 31) and not 31) div 8; Modified: trunk/ExternalSource/dzlib/u_dzMiscUtils.pas =================================================================== --- trunk/ExternalSource/dzlib/u_dzMiscUtils.pas 2024-04-06 14:46:33 UTC (rev 4227) +++ trunk/ExternalSource/dzlib/u_dzMiscUtils.pas 2024-04-06 15:10:08 UTC (rev 4228) @@ -271,17 +271,22 @@ function HKeyToString(_HKey: HKey): string; begin - case _HKey of - HKEY_CLASSES_ROOT: Result := 'HKEY_CLASSES_ROOT'; // do not translate - HKEY_CURRENT_USER: Result := 'HKEY_CURRENT_USER'; // do not translate - HKEY_LOCAL_MACHINE: Result := 'HKEY_LOCAL_MACHINE'; // do not translate - HKEY_USERS: Result := 'HKEY_USERS'; // do not translate - HKEY_PERFORMANCE_DATA: Result := 'HKEY_PERFORMANCE_DATA'; // do not translate - HKEY_CURRENT_CONFIG: Result := 'HKEY_CURRENT_CONFIG'; // do not translate - HKEY_DYN_DATA: Result := 'HKEY_DYN_DATA'; // do not translate + if _HKey = HKEY_CLASSES_ROOT then + Result := 'HKEY_CLASSES_ROOT' // do not translate + else if _HKey = HKEY_CURRENT_USER then + Result := 'HKEY_CURRENT_USER' // do not translate + else if _HKey = HKEY_LOCAL_MACHINE then + Result := 'HKEY_LOCAL_MACHINE' // do not translate + else if _HKey = HKEY_USERS then + Result := 'HKEY_USERS' // do not translate + else if _HKey = HKEY_PERFORMANCE_DATA then + Result := 'HKEY_PERFORMANCE_DATA' // do not translate + else if _HKey = HKEY_CURRENT_CONFIG then + Result := 'HKEY_CURRENT_CONFIG' // do not translate + else if _HKey = HKEY_DYN_DATA then + Result := 'HKEY_DYN_DATA' // do not translate else Result := Format(_('unknown Registry Root Key %x'), [_HKey]); - end; end; function RegDataTypeToString(_DataType: TRegDataType): string; Modified: trunk/ExternalSource/dzlib/u_dzNullableExtended.pas =================================================================== --- trunk/ExternalSource/dzlib/u_dzNullableExtended.pas 2024-04-06 14:46:33 UTC (rev 4227) +++ trunk/ExternalSource/dzlib/u_dzNullableExtended.pas 2024-04-06 15:10:08 UTC (rev 4228) @@ -28,7 +28,7 @@ {$INCLUDE 't_NullableNumber.tpl'} type - TNullableExtended = _NULLABLE_NUMBER_; + TNullableExtended = TdzNullableNumber; TdzNullableExtended = TNullableExtended deprecated; {$ENDIF DELPHI2007_UP} @@ -39,6 +39,18 @@ {$INCLUDE 't_NullableNumber.tpl'} +{$IFDEF DEBUG} +procedure AssertDumpAvailable; +var + e: TNullableExtended; +begin + e.Dump; +end; + +initialization + AssertDumpAvailable; +{$ENDIF DEBUG} {$ENDIF DELPHI2007_UP} end. + Modified: trunk/ExternalSource/dzlib/u_dzNullableTimespan.pas =================================================================== --- trunk/ExternalSource/dzlib/u_dzNullableTimespan.pas 2024-04-06 14:46:33 UTC (rev 4227) +++ trunk/ExternalSource/dzlib/u_dzNullableTimespan.pas 2024-04-06 15:10:08 UTC (rev 4228) @@ -13,22 +13,24 @@ uses SysUtils, u_dzTranslator, + u_dzNullableTypesUtils, u_dzNullableExtended; type TNullableTimespan = record private - FIsValid: IInterface; + FIsValid: INullableTypesFlagInterface; ///<summary> - /// Note: This used to be a double, encoded like in TDateTime but since that turned out - /// to have rather severe rounding errors I now use an Int64 each for days and - /// Microseconds. The actual timespan is always the sum of both. - /// They should always have the same sign. </summary> + /// @NOTE: This used to be a double, encoded like in TDateTime but since that turned out + /// to have rather severe rounding errors I now use an Int64 each for days and + /// Microseconds. The actual timespan is always the sum of both. + /// They should always have the same sign. </summary> FFullDays: Int64; FMicroSeconds: Int64; procedure CheckIsValid; procedure SetDaysAndMicroseconds(_FullDays: Int64; _MicroSeconds: Int64); inline; public + function Dump: string; procedure Invalidate; function IsValid: Boolean; function InDays: Double; @@ -75,23 +77,33 @@ function GetMilliSeconds(out _MilliSeconds: Integer): Boolean; overload; deprecated; // use TryGetMillSeconds procedure GetDaysHoursMinutesSeconds(out _Days, _Hours, _Minutes, _Seconds: Int64); overload; procedure GetDaysHoursMinutesSeconds(out _Days, _Hours, _Minutes: Int64; out _Seconds: Double); overload; - ///<summary> Generates a string of the form 'hh<separator>mm' - /// @param Separator is used to separate the hour and minute part, - /// if Separator is #0, no separator is used. - /// @param NullValue is the value used if the TNullableTimespan value is not valid. </summary> + ///<summary> + /// Generates a string of the form 'hh<separator>mm' + /// @param Separator is used to separate the hour and minute part, + /// if Separator is #0, no separator will be used. + /// @param NullValue is the value used if the TNullableTimespan value is not valid. </summary> function ToHHmm(_Separator: Char = #0; const _NullValue: string = ''): string; - ///<summary> Converts the value to a string representation of InHours with the given - /// number of decimals. Returns an NullValue, if invalid.</summary> + ///<summary> + /// Converts the value to a string representation of InHours with the given + /// number of decimals. Returns NullValue, if invalid.</summary> function ToHourStr(_Decimals: Integer = 1; const _NullValue: string = ''): string; - function ForDisplay: string; - ///<summary> Calculates the value from the given Days, Hours, Minutes, Seconds and - /// Milliseconds. All these values can be higher than the usual maximum value - /// eg. you could passs 26 hours and 100 seconds and still get a valid - /// result of 1 day, 2 hours, 1 Minute and 40 seconds. - /// Note: you cannot assign month's or years because they vary in length </summary> + ///<summary> + /// Generates a string for displaying the value. + /// @param Full defines whether the string should only use the two most significant values (False) + /// or all values (True). Defaults to False. + /// Most significatn means that it will contain the days and hours, if days is > 0, + /// hours and minutes if hours > 0, minutes and seconds otherwise. </summary> + function ForDisplay(_Full: Boolean = False): string; + ///<summary> + /// Calculates the value from the given Days, Hours, Minutes, Seconds and Milliseconds. + /// All these values can be higher than the usual maximum value e.g. you could passs + /// 26 hours and 100 seconds and still get a valid esult of 1 day, 2 hours, 1 Minute + /// and 40 seconds. + /// @NOTE: you cannot assign month's or years because they vary in length </summary> procedure Assign(_Days, _Hours, _Minutes, _Seconds, _MilliSeconds: Word); - ///<summary> Note that Days is not a TDateTime value representing a date but just a number - /// of days with possibly fractions. </summary> + ///<summary> + /// @Note: Days is not a TDateTime value representing a date but just a number + /// of days with possibly fractions. </summary> procedure AssignDays(_Days: Double); procedure AssignHours(_Hours: Extended); overload; procedure AssignHours(_Hours: TNullableExtended); overload; @@ -151,8 +163,7 @@ Math, DateUtils, u_dzConvertUtils, - u_dzDateUtils, - u_dzNullableTypesUtils; + u_dzDateUtils; function _(const _s: string): string; inline; begin @@ -316,7 +327,7 @@ procedure TNullableTimespan.Assign(_Days, _Hours, _Minutes, _Seconds, _MilliSeconds: Word); begin SetDaysAndMicroseconds(_Days, _Hours * MicrosecondsPerHour + _Minutes * MicrosecondsPerMinute - + _Seconds + MicrosecondsPerSecond + _MilliSeconds * MicrosecondsPerMillisecond); + + _Seconds * MicrosecondsPerSecond + _MilliSeconds * MicrosecondsPerMillisecond); end; function TNullableTimespan.TryGetDays(out _Days: Double): Boolean; @@ -598,7 +609,7 @@ Result := Result + _ToAppend; end; -function TNullableTimespan.ForDisplay: string; +function TNullableTimespan.ForDisplay(_Full: Boolean = False): string; var d: Int64; h: Int64; @@ -606,16 +617,20 @@ s: Double; begin if IsValid then begin - Result := ''; GetDaysHoursMinutesSeconds(d, h, m, s); - if d > 0 then - Result := AppendToStr(Result, Format(_('%d days'), [d])); - if h > 0 then - Result := AppendToStr(Result, Format(_('%d hours'), [h])); - if (d = 0) then - Result := AppendToStr(Result, Format(_('%d minutes'), [m])); - if (d = 0) and (h = 0) then - Result := AppendToStr(Result, Format(_('%.2f seconds'), [s])); + if _Full then begin + Result := Format(_('%d days %d hours %d minutes %.3f seconds'), [d, h, m, s]); + end else begin + Result := ''; + if d > 0 then + Result... [truncated message content] |