posts - 230,  comments - 526,  trackbacks - 0

 New stuff
        =========
        - Added kbmMWSmartBind.pas unit with optional kbmMWSmartBindVCL.pas and kbmMWSmartBindFMX.pas
          Provides new easy to use multiway databinding between data, controls and objects.
        - Added support for XML-RPC and JSON-RPC. Include kbmMWJSONRPCTransStream and/or kbmMWXMLRPCTransStream units
          and select JSONRPC or XMLRPC as transport stream format in request/response transports.
        - Updated TkbmMWONArray, added:
          procedure MoveAppend(const AValue:TkbmMWONArray);
          procedure MoveInsert(const AIndex:TkbmNativeInt; const AValue:TkbmMWONArray);
          procedure CopyAppend(const AValue:TkbmMWONArray);
          procedure CopyInsert(const AIndex:TkbmNativeInt; const AValue:TkbmMWONArray);
          procedure Insert(const AIndex:TkbmNativeInt; const AValues:array of variant); overload;
        - Updated TkbmMWONObject, added:
          property PropertyValueAsVariant[const AIndex:TkbmNativeInt]:variant read GetPropertyValueAsVariant write SetPropertyValueAsVariant;
        - Added function IkbmMWScheduledEvent.SyncQueued:IkbmMWScheduledEvent which works similar to Synchronized
          except it will queue the operation and not block to prevent certain deadlock scenarios.
        - Added IkbmMWScheduledEvent.AfterEnd and IkbmMWScheduledEvent.SynchronizedAfterEnd optional handlers
          which will be called when the event has run and it is never to be run again (it is truely ending).
        - Added IkbmMWScheduledEvent.Executed:boolean property that returns true if the event has been executed
          at least once.
        - Added properties OnAnonymousAfterEndProcedure:TkbmMWOnAnonymousScheduledProcedure and OnSimpleAnonymousAfterEndProcedure:TkbmMWOnSimpleAnonymousScheduledProcedure
          to IkbmMWScheduledEvent. See AfterEnd explanation.
        - Added property IkbmMWScheduledEvent.IsSynchronized which indicates if an event is running synchronized (or syncqueued).
        - Added new methods to TkbmMWRTTI:
          class function IskbmMWONCustomObject(const AVariant:variant):boolean;
          class function GetkbmMWONCustomObject(const AVariant:variant; var ACustomObject:TkbmMWONCustomObject):boolean;
          class function CompareValue(const AValue1,AValue2:TValue):integer;
          class function GetIsInteger(const AValue:TValue):boolean;
          class function GetIsInt64(const AValue:TValue):boolean;
          class function GetIsBoolean(const AValue:TValue):boolean;
          class function IsDesigntime:boolean;
        - Added TkbmMWThreadList<T>.Count property in kbmMWGlobal.pas
        - Added TkbmMWThreadDictionary<TKey,TValue> and TkbmMWThreadObjectDictionary<TKey,TValue> class
          in kbmMWGlobal.pas
        - Added function kbmMWSafeDelphiIdentifier(AIdentifier:string):string; to kbmMWGlobal.pas
        - Added new functions to TkbmMWJSONMarshal:
          class function GenerateDelphiClassFromUTF8File(const AFileName:string; const AUnitName:string; const AMainClassName:string):string;
          class function GenerateDelphiClassFromUTF16File(const AFileName:string; const AUnitName:string; const AMainClassName:string):string;
          class function GenerateDelphiClassFromUTF8Stream(const AStream:TStream; const AUnitName:string; const AMainClassName:string):string;
          class function GenerateDelphiClassFromUTF16Stream(const AStream:TStream; const AUnitName:string; const AMainClassName:string):string;
          They generate Delphi source code that is able to marshal/demarshal provided JSON data.
        - Added new functions to Use (kbmMWSmartUtils.pas):
          class function IsObject(const AVariant:Variant):boolean
          class function IsObject<T>(const AVariant:Variant):boolean
          class function IsDateTime(const AVariant:Variant)
          class function IsString(const AVariant:Variant):boolean
          class function IsDouble(const AVariant:Variant):boolean
          class function IsInteger(const AVariant:Variant):boolean
          class function IsInt64(const AVariant:Variant):boolean
        - Added new functions to TkbmMWYAMLMarshal:
          class function GenerateDelphiClassFromUTF8File(const AFileName:string; const AUnitName:string; const AMainClassName:string):string;
          class function GenerateDelphiClassFromUTF16File(const AFileName:string; const AUnitName:string; const AMainClassName:string):string;
          class function GenerateDelphiClassFromUTF8Stream(const AStream:TStream; const AUnitName:string; const AMainClassName:string):string;
          class function GenerateDelphiClassFromUTF16Stream(const AStream:TStream; const AUnitName:string; const AMainClassName:string):string;
          They generate Delphi source code that is able to marshal/demarshal provided YAML data.
        - Added TkbmMWLockFreeCountLock to kbmMWLockFree.pas
          Provides a simple way to count interests in a resource.
        - Added class function TkbmMWONCustomMarshal.GenerateDelphiClass(const AUnitName:string; const AMainClassName:string; const AON:TkbmMWONCustomObject):string;
        - Added support for ORM to detect primary key field changes and automaticaly update datastorage accordingly.
        - Added support for marshalling/demarshalling data of type variant.
        - Added new function to kbmMWHTTPUtils.pas
          function kbmMWIsMimetypeTextual(const AMimeType:string):boolean;
        - Added support for rewriting ALTER TABLE PRIMARY KEY SQL
        - Added new functions to TkbmMWXMLMarshal:
          class function FromFile<T>(const AFileName:string):T; overload;
          class function FromFile(const AFileName:string; AResultClass:TClass):TObject; overload;
            Provides easy access to marshalling and demarshalling in one line.
          class procedure SaveToFile(const AFileName:string; const AValue:TValue); overload;
          class function GenerateDelphiClassFromFile(const AFileName:string; const AUnitName:string; const AMainClassName:string):string;
          class function GenerateDelphiClassFromStream(const AStream:TStream; const AUnitName:string; const AMainClassName:string):string;
            They generate Delphi source code that is able to marshal/demarshal provided YAML data.

           Changes/minor additions
        =======================
        - Improved TkbmMWONNative.SetAsFmtString to correctly use AFormat.FormatSettings when handling decimal comma.
        - Improved TkbmMWONArray.GetAsVariant and TkbmMWONObject.GetAsVariant to allow for returning embededded kbmMW supported object/record
          as variant when needed for kbmMW SKUs supporting SmartService.
        - Improved TkbmMWONArray.GetAsValue and TkbmMWONObject.GetAsVariant to allow for returning embededded kbmMW supported object/record
          as TValue when needed for kbmMW SKUs supporting SmartService.
        - Improved TkbmMWONArray.SetAsVariant and TkbmMWONObject.SetAsVariant to handle variant embededded kbmMW supported object/record
          when needed for kbmMW SKUs supporting SmartService.
        - Improved TkbmMWONArray.SetAsValue and TkbmMWONObject.SetAsValue to handle TValue embededded kbmMW supported object/record
          when needed for kbmMW SKUs supporting SmartService.
        - Improved TkbmMWONArray.Add(const AValues:array of variant) to handle variant embededded kbmMW supported object/record
          when needed for kbmMW SKUs supporting SmartService.
        - Updated class function TkbmMWProcess.ExecuteProcess to support optional TEncoding argument.
        - Improved TkbmMWJSONStreamer to differenciate between number and integer, although JSON standard only knows about number.
          It is of interest when converting object notation to other formats.
        - Added optional argument const ABestMatch:boolean = false to TkbmMWRTTIKnownTypes.Get and GetClass functions.
          If true and no known exact type is found, it will attempt to find usable parent type.
        - Added optional const AWait:boolean = true argument to several TkbmMWScheduler.Unschedule and Clear methods.
        - Updated kbmSQLite.pas adapter to respect default Journal mode and default page size.
        - Improved updating SQLite journal mode and page size.
        - Improved TkbmMWLinqStage.AsStrings to attempt better formatting of data.
        - Improved REST transport stream format.
        - Improved kbmMWCustomServerMessagingTransport.pas to allow encrypted subscription and unsubscription
          message to be proxied without knowing key.
        - Improved TkbmMWNullableReplacementVisualizer.
        - Updated TkbmMWRESTAttribute, added Required property default false.
          Indicates if an argument is required or not.
        - Improved TkbmMWRTTI.GetQualifiedName to attempt to generate qualified names for non registered types too.

        Fixes
        =====
        - Fixed TkbmMWProcess.ExecuteProcess to terminate job on function end, if AJob handled given in arguments.
        - Fixed various bugs and some leaks in kbmMW Scheduler.
        - Fixed bugs in TkbmMWRTTI methods.
        - Fixed TkbmMWRemoteDesktopClient.Connect to unsubscribe from previous subscription if any.
        - Fixed bugs in TkbmMWOracleMetaData.
        - Fixed bugs in kbmMWGlobal.pas.
        - Fixed bugs and leaks in kbmMWORM.pas.
        - Fixed typo bug in TkbmMWORM.GenerateDelphiClass.
        - Fixed access violation when reregistering kbmMW in Delphi due to internal Delphi RTTI bug.
        - Fixed AutoCommit issue in UniDAC database adapter.
        - Fixed bugs in kbmMWCustomServerMessagingTransport.pas.

posted on 2019-05-11 22:11 xalion 阅读(...) 评论(...) 编辑 收藏