Skip to content

Instantly share code, notes, and snippets.

@delphiapp
Created May 24, 2022 12:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save delphiapp/d9e8922cd9db8562043fb4f3ea1080f0 to your computer and use it in GitHub Desktop.
Save delphiapp/d9e8922cd9db8562043fb4f3ea1080f0 to your computer and use it in GitHub Desktop.
program SerializeErrormORMot2;
{$APPTYPE CONSOLE}
{$DEFINE VER2}
{$IFDEF FPC}
{$MODE Delphi}
{$ENDIF}
uses
{$IFDEF FPC}
Interfaces,
{$ENDIF}
SysUtils, Dialogs
{$IFNDEF VER2}
,SynCommons, mORMot
{$ELSE}
,mormot.core.base, mormot.core.data, mormot.core.rtti, mormot.rest.core, mormot.core.json, mormot.core.text
, mormot.core.os, mormot.core.variants, mormot.core.datetime
{$ENDIF}
;
const
__TRecIEC =
'TypeSynchTime:Integer ' +
'VklIEC61850:Boolean ' +
'EthCount:Integer ' +
'MACAdress1 : string ' +
'IPAdress1 : string ' +
'IPSubnet1 : string ' +
'EthTCP1 : Boolean'
;
type
TModelApp = class;
PRecModBusIEC = ^TRecIEC;
TRecIEC = packed record
TypeSynchTime:Integer;
VklIEC61850:Boolean;
EthCount:Integer;
MACAdress1 : string;
IPAdress1 : string;
IPSubnet1 : string;
EthTCP1 : Boolean;
procedure init;
end;
TModelIEC = class(TSynPersistent)
private
fRecIEC : TRecIEC;
function GetVariantRecIEC: Variant;
procedure SetVariantRecIEC(const Value: Variant);
public
procedure initvalue;
published
property VRecIEC : Variant read GetVariantRecIEC write SetVariantRecIEC;
end;
TModelUstr = class(TSynAutoCreateFields)
private
fModelIEC:TModelIEC;
published
property ModelIEC:TModelIEC read fModelIEC;
end;
TModelUstrObjArray = array of TModelUstr;
TModelApp = class(TSynAutoCreateFields)
private
fModelUstr:TModelUstrObjArray;
public
function AddUstr:Integer;
function LoadConfiguration(AFileName:string):Boolean;
procedure SaveConfiguration(AFileName:string);
published
property ModelUstr:TModelUstrObjArray read fModelUstr;
end;
function TModelIEC.GetVariantRecIEC: Variant;
var s:RawUTF8;
begin
s:=RecordSaveJSON(fRecIEC,TypeInfo(TRecIEC));
result:=_JSONFast(s);
end;
procedure TModelIEC.initvalue;
begin
fRecIEC.init;
end;
procedure TModelIEC.SetVariantRecIEC(const Value: Variant);
begin
RecordLoadJson(fRecIEC,_Safe(Value)^.ToJson,TypeInfo(TRecIEC));
end;
{ TModelApp }
function TModelApp.AddUstr: Integer;
var mu:TModelUstr;
begin
mu:=TModelUstr.Create;
mu.fModelIEC:=TModelIEC.create;
mu.ModelIEC.initvalue;
result:=ObjArrayAdd(fModelUstr,mu);
end;
function TModelApp.LoadConfiguration(AFileName: string): Boolean;
begin
JsonFileToObject(AFileName,Self,nil,{$IFDEF VER2}JSONPARSER_TOLERANTOPTIONS{$ELSE}JSONTOOBJECT_TOLERANTOPTIONS{$ENDIF});
end;
var ModelApp:TModelApp;
procedure TModelApp.SaveConfiguration(AFileName: string);
begin
ObjectToJSONFile(Self,AFileName);
end;
{ TRecIEC }
procedure TRecIEC.init;
begin
TypeSynchTime:=3;
VklIEC61850:=true;
EthCount:=2;
MACAdress1 :='';
IPAdress1 :='172.16.4.50';
IPSubnet1 :='255.255.255.0';
EthTCP1 :=True;
end;
begin
try
{$IFDEF VER2}
Rtti.RegisterFromText(TypeInfo(TRecIEC),__TRecIEC);
Rtti.RegisterObjArray(TypeInfo(TModelUstrObjArray),TModelUstr);
{$ELSE}
TJSONSerializer.RegisterCustomJSONSerializerFromText(TypeInfo(TRecIEC),__TRecIEC);
TJSONSerializer.RegisterObjArrayForJSON(TypeInfo(TModelUstrObjArray),TModelUstr);
{$ENDIF}
except
on E:ESynException do ShowMessage(E.Message);
end;
ModelApp:=TModelApp.Create;
try
ModelApp.AddUstr;
ModelApp.SaveConfiguration('SaveAll.json');
finally
ModelApp.Free;
end;
Readln;
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment