From f3d8ef6968f09811b45a77dacf05224b3d46a3e6 Mon Sep 17 00:00:00 2001 From: Mark van Renswoude Date: Mon, 25 Aug 2014 18:26:12 +0000 Subject: [PATCH] Added: FS#14 - LoadFromFile/Stream methods missing for Base64Binary properties Changed: moved to Delphi XE2, changed StreamHelper to StreamWriter descendant Added: 64-bits build, for fun --- Units/DelphiXMLDataBindingGenerator.pas | 453 ++++++++++++------------ Units/DelphiXMLDataBindingResources.pas | 130 ++++--- Units/XMLDataBindingHelpers.pas | 141 +------- X2XMLDataBinding.dpr | 1 - X2XMLDataBinding.dproj | 194 +++++++--- X2XMLDataBinding.res | Bin 162184 -> 163348 bytes X2XMLDataBinding_Icon.ico | Bin 0 -> 161862 bytes 7 files changed, 468 insertions(+), 451 deletions(-) create mode 100644 X2XMLDataBinding_Icon.ico diff --git a/Units/DelphiXMLDataBindingGenerator.pas b/Units/DelphiXMLDataBindingGenerator.pas index 5ade84d..3e5c626 100644 --- a/Units/DelphiXMLDataBindingGenerator.pas +++ b/Units/DelphiXMLDataBindingGenerator.pas @@ -51,26 +51,26 @@ type function TranslateDataType(ADataType: IXMLTypeDef): String; function CreateNewGUID: String; - procedure WriteUnitHeader(AStream: TStreamHelper; const ASourceFileName, AFileName: String); - procedure WriteSection(AStream: TStreamHelper; ASection: TDelphiXMLSection; ASchemaList: TXMLSchemaList); - procedure WriteDocumentFunctions(AStream: TStreamHelper; ASection: TDelphiXMLSection; ASchemaList: TXMLSchemaList); - procedure WriteEnumerationConversions(AStream: TStreamHelper; ASection: TDelphiXMLSection; ASchemaList: TXMLSchemaList); - procedure WriteImplementationUses(AStream: TStreamHelper; ASchemaList: TXMLSchemaList); - procedure WriteDocumentation(AStream: TStreamHelper; AItem: TXMLDataBindingItem); - procedure WriteAfterConstruction(AStream: TStreamHelper; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); - function WriteInlineCollectionFields(AStream: TStreamHelper; AItem: TXMLDataBindingInterface): Boolean; + procedure WriteUnitHeader(AWriter: TNamedFormatWriter; const ASourceFileName, AFileName: String); + procedure WriteSection(AWriter: TNamedFormatWriter; ASection: TDelphiXMLSection; ASchemaList: TXMLSchemaList); + procedure WriteDocumentFunctions(AWriter: TNamedFormatWriter; ASection: TDelphiXMLSection; ASchemaList: TXMLSchemaList); + procedure WriteEnumerationConversions(AWriter: TNamedFormatWriter; ASection: TDelphiXMLSection; ASchemaList: TXMLSchemaList); + procedure WriteImplementationUses(AWriter: TNamedFormatWriter; ASchemaList: TXMLSchemaList); + procedure WriteDocumentation(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingItem); + procedure WriteAfterConstruction(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); + function WriteInlineCollectionFields(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingInterface): Boolean; - procedure WriteSchemaItem(AStream: TStreamHelper; AItem: TXMLDataBindingItem; ASection: TDelphiXMLSection); - procedure WriteSchemaInterface(AStream: TStreamHelper; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); - procedure WriteSchemaInterfaceProperties(AStream: TStreamHelper; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); - function WriteSchemaInterfaceCollectionProperties(AStream: TStreamHelper; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection): Boolean; - function WriteSchemaInterfaceProperty(AStream: TStreamHelper; AItem: TXMLDataBindingInterface; AProperty: TXMLDataBindingProperty; ASection: TDelphiXMLSection; AMember: TDelphiXMLMember; ANewLine: Boolean): Boolean; - procedure WriteSchemaEnumeration(AStream: TStreamHelper; AItem: TXMLDataBindingEnumeration; ASection: TDelphiXMLSection); - procedure WriteSchemaEnumerationArray(AStream: TStreamHelper; AItem: TXMLDataBindingEnumeration); + procedure WriteSchemaItem(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingItem; ASection: TDelphiXMLSection); + procedure WriteSchemaInterface(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); + procedure WriteSchemaInterfaceProperties(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); + function WriteSchemaInterfaceCollectionProperties(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection): Boolean; + function WriteSchemaInterfaceProperty(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingInterface; AProperty: TXMLDataBindingProperty; ASection: TDelphiXMLSection; AMember: TDelphiXMLMember; ANewLine: Boolean): Boolean; + procedure WriteSchemaEnumeration(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingEnumeration; ASection: TDelphiXMLSection); + procedure WriteSchemaEnumerationArray(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingEnumeration); - procedure WriteValidate(AStream: TStreamHelper; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); - procedure WriteEnumeratorMethod(AStream: TStreamHelper; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); - procedure WriteEnumerator(AStream: TStreamHelper; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); + procedure WriteValidate(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); + procedure WriteEnumeratorMethod(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); + procedure WriteEnumerator(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); function GetDelphiNodeType(AProperty: TXMLDataBindingProperty): TDelphiNodeType; function GetDelphiElementType(AProperty: TXMLDataBindingProperty): TDelphiElementType; @@ -147,8 +147,8 @@ end; procedure TDelphiXMLDataBindingGenerator.GenerateOutputFile(ASchemaList: TXMLSchemaList; const ASourceFileName, AUnitName: String); var - unitStream: TStreamHelper; - usesClause: String; + unitWriter: TNamedFormatWriter; + usesClause: String; begin usesClause := ''; @@ -156,38 +156,38 @@ begin if OutputType = otMultiple then usesClause := GenerateUsesClause(ASchemaList); - unitStream := TStreamHelper.Create(TFileStream.Create(AUnitName, fmCreate), soOwned); + unitWriter := TNamedFormatWriter.Create(AUnitName, False, TEncoding.ANSI); try - WriteUnitHeader(unitStream, ASourceFileName, AUnitName); + WriteUnitHeader(unitWriter, ASourceFileName, AUnitName); - unitStream.WriteNamedFmt(UnitInterface, + unitWriter.WriteNamedFmt(UnitInterface, ['UsesClause', usesClause]); - WriteSection(unitStream, dxsForward, ASchemaList); + WriteSection(unitWriter, dxsForward, ASchemaList); FProcessedItems := TX2OIHash.Create; try FProcessedItems.Clear; - WriteSection(unitStream, dxsInterface, ASchemaList); + WriteSection(unitWriter, dxsInterface, ASchemaList); FProcessedItems.Clear; - WriteSection(unitStream, dxsClass, ASchemaList); + WriteSection(unitWriter, dxsClass, ASchemaList); finally FreeAndNil(FProcessedItems); end; - WriteDocumentFunctions(unitStream, dxsInterface, ASchemaList); - WriteEnumerationConversions(unitStream, dxsInterface, ASchemaList); + WriteDocumentFunctions(unitWriter, dxsInterface, ASchemaList); + WriteEnumerationConversions(unitWriter, dxsInterface, ASchemaList); - unitStream.Write(UnitImplementation); - WriteImplementationUses(unitStream, ASchemaList); - WriteDocumentFunctions(unitStream, dxsImplementation, ASchemaList); - WriteEnumerationConversions(unitStream, dxsImplementation, ASchemaList); + unitWriter.Write(UnitImplementation); + WriteImplementationUses(unitWriter, ASchemaList); + WriteDocumentFunctions(unitWriter, dxsImplementation, ASchemaList); + WriteEnumerationConversions(unitWriter, dxsImplementation, ASchemaList); - WriteSection(unitStream, dxsImplementation, ASchemaList); + WriteSection(unitWriter, dxsImplementation, ASchemaList); - unitStream.Write(unitFooter); + unitWriter.Write(unitFooter); finally - FreeAndNil(unitStream); + FreeAndNil(unitWriter); end; end; @@ -341,7 +341,7 @@ begin { Remove unsafe characters } for charIndex := Length(Result) downto 1 do begin - if not (Result[charIndex] in SafeChars) then + if not CharInSet(Result[charIndex], SafeChars) then Delete(Result, charIndex, 1); end; @@ -349,7 +349,7 @@ begin if Length(Result) > 0 then begin { Number as the first character is not allowed } - if Result[1] in ['0'..'9'] then + if CharInSet(Result[1], ['0'..'9']) then Result := '_' + Result; @@ -424,16 +424,16 @@ begin end; -procedure TDelphiXMLDataBindingGenerator.WriteUnitHeader(AStream: TStreamHelper; const ASourceFileName, AFileName: String); +procedure TDelphiXMLDataBindingGenerator.WriteUnitHeader(AWriter: TNamedFormatWriter; const ASourceFileName, AFileName: String); begin - AStream.WriteNamedFmt(UnitHeader, + AWriter.WriteNamedFmt(UnitHeader, ['SourceFileName', ASourceFileName, 'UnitName', ChangeFileExt(ExtractFileName(AFileName), ''), 'DateTime', DateTimeToStr(Now)]); end; -procedure TDelphiXMLDataBindingGenerator.WriteSection(AStream: TStreamHelper; ASection: TDelphiXMLSection; ASchemaList: TXMLSchemaList); +procedure TDelphiXMLDataBindingGenerator.WriteSection(AWriter: TNamedFormatWriter; ASection: TDelphiXMLSection; ASchemaList: TXMLSchemaList); var schemaIndex: Integer; schema: TXMLDataBindingSchema; @@ -443,18 +443,18 @@ begin for schemaIndex := 0 to Pred(ASchemaList.Count) do begin schema := ASchemaList[schemaIndex]; - AStream.WriteLnNamedFmt(SectionComments[ASection], - ['SchemaName', schema.SchemaName]); + AWriter.WriteLineNamedFmt(SectionComments[ASection], + ['SchemaName', schema.SchemaName]); for itemIndex := 0 to Pred(schema.ItemCount) do - WriteSchemaItem(AStream, schema.Items[itemIndex], ASection); + WriteSchemaItem(AWriter, schema.Items[itemIndex], ASection); - AStream.WriteLn; + AWriter.WriteLine; end; end; -procedure TDelphiXMLDataBindingGenerator.WriteDocumentFunctions(AStream: TStreamHelper; ASection: TDelphiXMLSection; ASchemaList: TXMLSchemaList); +procedure TDelphiXMLDataBindingGenerator.WriteDocumentFunctions(AWriter: TNamedFormatWriter; ASection: TDelphiXMLSection; ASchemaList: TXMLSchemaList); var schemaIndex: Integer; schema: TXMLDataBindingSchema; @@ -485,9 +485,9 @@ begin if not hasItem then begin if ASection = dxsInterface then - AStream.Write(' '); + AWriter.Write(' '); - AStream.WriteLn('{ Document functions }'); + AWriter.WriteLine('{ Document functions }'); hasItem := True; end; @@ -501,13 +501,13 @@ begin dxsImplementation: Add(DocumentFunctionsImplementation); end; - AStream.Write(Format(['SourceName', interfaceItem.Name, + AWriter.Write(Format(['SourceName', interfaceItem.Name, 'Name', interfaceItem.TranslatedName])); finally Free; end; - AStream.WriteLn; + AWriter.WriteLine; end; end; end; @@ -515,15 +515,15 @@ begin if (ASection = dxsInterface) and hasItem then begin - AStream.WriteLn('const'); - AStream.WriteLnFmt(' TargetNamespace = ''%s'';', [nameSpace]); - AStream.WriteLn; - AStream.WriteLn; + AWriter.WriteLine('const'); + AWriter.WriteLine(' TargetNamespace = ''%s'';', [nameSpace]); + AWriter.WriteLine; + AWriter.WriteLine; end; end; -procedure TDelphiXMLDataBindingGenerator.WriteEnumerationConversions(AStream: TStreamHelper; ASection: TDelphiXMLSection; ASchemaList: TXMLSchemaList); +procedure TDelphiXMLDataBindingGenerator.WriteEnumerationConversions(AWriter: TNamedFormatWriter; ASection: TDelphiXMLSection; ASchemaList: TXMLSchemaList); var enumerations: TObjectList; schemaIndex: Integer; @@ -560,18 +560,18 @@ begin if ASection = dxsInterface then begin { Enumeration value arrays } - AStream.WriteLn('const'); + AWriter.WriteLine('const'); for itemIndex := 0 to Pred(enumerations.Count) do - WriteSchemaEnumerationArray(AStream, TXMLDataBindingEnumeration(enumerations[itemIndex])); + WriteSchemaEnumerationArray(AWriter, TXMLDataBindingEnumeration(enumerations[itemIndex])); end; { Conversion helpers } if ASection = dxsInterface then - AStream.Write(' '); + AWriter.Write(' '); - AStream.WriteLn('{ Enumeration conversion helpers }'); + AWriter.WriteLine('{ Enumeration conversion helpers }'); for itemIndex := Pred(enumerations.Count) downto 0 do @@ -603,14 +603,14 @@ begin sourceCode.AddLn; end; - AStream.Write(sourceCode.Format(['ItemName', enumerationItem.TranslatedName, + AWriter.Write(sourceCode.Format(['ItemName', enumerationItem.TranslatedName, 'DataType', PrefixClass + enumerationItem.TranslatedName])); finally FreeAndNil(sourceCode); end; end; - AStream.WriteLn; + AWriter.WriteLine; end; finally FreeAndNil(enumerations); @@ -618,17 +618,17 @@ begin end; -procedure TDelphiXMLDataBindingGenerator.WriteImplementationUses(AStream: TStreamHelper; ASchemaList: TXMLSchemaList); +procedure TDelphiXMLDataBindingGenerator.WriteImplementationUses(AWriter: TNamedFormatWriter; ASchemaList: TXMLSchemaList); begin { In ye olde days this is where we checked if XMLDataBindingUtils was required. With the introduction of the IXSDValidate, this is practically always the case. } - AStream.WriteLn('uses'); - AStream.WriteLn(' SysUtils;'); - AStream.WriteLn; + AWriter.WriteLine('uses'); + AWriter.WriteLine(' SysUtils;'); + AWriter.WriteLine; end; -procedure TDelphiXMLDataBindingGenerator.WriteDocumentation(AStream: TStreamHelper; AItem: TXMLDataBindingItem); +procedure TDelphiXMLDataBindingGenerator.WriteDocumentation(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingItem); var documentation: String; lineIndex: Integer; @@ -648,27 +648,27 @@ begin lines.Text := WrapText(documentation, 76); - AStream.WriteLn(' {'); + AWriter.WriteLine(' {'); for lineIndex := 0 to Pred(lines.Count) do - AStream.WriteLn(' ' + lines[lineIndex]); + AWriter.WriteLine(' ' + lines[lineIndex]); - AStream.WriteLn(' }'); + AWriter.WriteLine(' }'); finally FreeAndNil(lines); end; end; -procedure TDelphiXMLDataBindingGenerator.WriteSchemaItem(AStream: TStreamHelper; AItem: TXMLDataBindingItem; ASection: TDelphiXMLSection); +procedure TDelphiXMLDataBindingGenerator.WriteSchemaItem(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingItem; ASection: TDelphiXMLSection); begin case AItem.ItemType of - itInterface: WriteSchemaInterface(AStream, TXMLDataBindingInterface(AItem), ASection); - itEnumeration: WriteSchemaEnumeration(AStream, TXMLDataBindingEnumeration(AItem), ASection); + itInterface: WriteSchemaInterface(AWriter, TXMLDataBindingInterface(AItem), ASection); + itEnumeration: WriteSchemaEnumeration(AWriter, TXMLDataBindingEnumeration(AItem), ASection); end; end; -procedure TDelphiXMLDataBindingGenerator.WriteSchemaInterface(AStream: TStreamHelper; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); +procedure TDelphiXMLDataBindingGenerator.WriteSchemaInterface(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); var parent: String; @@ -681,7 +681,7 @@ begin exit; if Assigned(AItem.BaseItem) then - WriteSchemaInterface(AStream, AItem.BaseItem, ASection); + WriteSchemaInterface(AWriter, AItem.BaseItem, ASection); ProcessedItems[AItem] := 1; end; @@ -689,8 +689,8 @@ begin case ASection of dxsForward: - AStream.WriteLnNamedFmt(InterfaceItemForward, - ['Name', AItem.TranslatedName]); + AWriter.WriteLineNamedFmt(InterfaceItemForward, + ['Name', AItem.TranslatedName]); dxsInterface: begin @@ -699,21 +699,21 @@ begin else if AItem.IsCollection then begin parent := CollectionInterface; - WriteEnumerator(AStream, AItem, ASection); + WriteEnumerator(AWriter, AItem, ASection); end else parent := ItemInterface; - WriteDocumentation(AStream, AItem); - AStream.WriteLnNamedFmt(InterfaceItemInterface, - ['Name', AItem.TranslatedName, - 'ParentName', parent]); - AStream.WriteLn(' ' + CreateNewGUID); + WriteDocumentation(AWriter, AItem); + AWriter.WriteLineNamedFmt(InterfaceItemInterface, + ['Name', AItem.TranslatedName, + 'ParentName', parent]); + AWriter.WriteLine(' ' + CreateNewGUID); - WriteSchemaInterfaceProperties(AStream, AItem, ASection); + WriteSchemaInterfaceProperties(AWriter, AItem, ASection); - AStream.WriteLn(' end;'); - AStream.WriteLn; + AWriter.WriteLine(' end;'); + AWriter.WriteLine; end; dxsClass: @@ -723,7 +723,7 @@ begin else if AItem.IsCollection then begin parent := CollectionClass; - WriteEnumerator(AStream, AItem, ASection); + WriteEnumerator(AWriter, AItem, ASection); end else parent := ItemClass; @@ -732,26 +732,26 @@ begin parent := parent + ', ' + XSDValidateInterface; - AStream.WriteLnNamedFmt(InterfaceItemClass, - ['Name', AItem.TranslatedName, - 'ParentName', parent]); + AWriter.WriteLineNamedFmt(InterfaceItemClass, + ['Name', AItem.TranslatedName, + 'ParentName', parent]); - WriteSchemaInterfaceProperties(AStream, AItem, ASection); + WriteSchemaInterfaceProperties(AWriter, AItem, ASection); - AStream.WriteLn(' end;'); - AStream.WriteLn; + AWriter.WriteLine(' end;'); + AWriter.WriteLine; end; dxsImplementation: begin - WriteEnumerator(AStream, AItem, ASection); - WriteSchemaInterfaceProperties(AStream, AItem, ASection); + WriteEnumerator(AWriter, AItem, ASection); + WriteSchemaInterfaceProperties(AWriter, AItem, ASection); end; end; end; -procedure TDelphiXMLDataBindingGenerator.WriteAfterConstruction(AStream: TStreamHelper; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); +procedure TDelphiXMLDataBindingGenerator.WriteAfterConstruction(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); var hasPrototype: Boolean; @@ -763,14 +763,14 @@ var case ASection of dxsClass: begin - AStream.WriteLn(' public'); - AStream.WriteLn(' procedure AfterConstruction; override;'); + AWriter.WriteLine(' public'); + AWriter.WriteLine(' procedure AfterConstruction; override;'); end; dxsImplementation: begin - AStream.WriteLnFmt('procedure TXML%s.AfterConstruction;', [AItem.TranslatedName]); - AStream.WriteLn('begin'); + AWriter.WriteLine('procedure TXML%s.AfterConstruction;', [AItem.TranslatedName]); + AWriter.WriteLine('begin'); end; end; @@ -790,7 +790,7 @@ begin if (ASection = dxsClass) and (not AItem.IsCollection) then - WriteInlineCollectionFields(AStream, AItem); + WriteInlineCollectionFields(AWriter, AItem); hasPrototype := False; @@ -809,22 +809,22 @@ begin if propertyItem.PropertyType = ptItem then begin if propertyItem.HasTargetNamespace then - AStream.WriteLnNamedFmt(' RegisterChildNode(''%:s'', %:s, ''%:s'');', - ['ItemSourceName', propertyItem.Name, - 'ItemClass', GetDataTypeName(propertyItem, False), - 'Namespace', propertyItem.TargetNamespace]) + AWriter.WriteLineNamedFmt(' RegisterChildNode(''%:s'', %:s, ''%:s'');', + ['ItemSourceName', propertyItem.Name, + 'ItemClass', GetDataTypeName(propertyItem, False), + 'Namespace', propertyItem.TargetNamespace]) else - AStream.WriteLnNamedFmt(' RegisterChildNode(''%:s'', %:s);', - ['ItemSourceName', propertyItem.Name, - 'ItemClass', GetDataTypeName(propertyItem, False)]); + AWriter.WriteLineNamedFmt(' RegisterChildNode(''%:s'', %:s);', + ['ItemSourceName', propertyItem.Name, + 'ItemClass', GetDataTypeName(propertyItem, False)]); end; - AStream.WriteLnNamedFmt(' %:s := CreateCollection(%:s, %:s, ''%:s'') as %:s;', - ['FieldName', PrefixField + propertyItem.TranslatedName, - 'CollectionClass', PrefixClass + propertyItem.Collection.TranslatedName, - 'CollectionInterface', PrefixInterface + propertyItem.Collection.TranslatedName, - 'ItemInterface', GetDataTypeName(propertyItem, True), - 'ItemSourceName', propertyItem.Name]); + AWriter.WriteLineNamedFmt(' %:s := CreateCollection(%:s, %:s, ''%:s'') as %:s;', + ['FieldName', PrefixField + propertyItem.TranslatedName, + 'CollectionClass', PrefixClass + propertyItem.Collection.TranslatedName, + 'CollectionInterface', PrefixInterface + propertyItem.Collection.TranslatedName, + 'ItemInterface', GetDataTypeName(propertyItem, True), + 'ItemSourceName', propertyItem.Name]); end; end; @@ -848,14 +848,14 @@ begin WritePrototype; if propertyItem.HasTargetNamespace then - AStream.WriteLnNamedFmt(' RegisterChildNode(''%:s'', TXML%:s, ''%:s'');', - ['SourceName', propertyItem.Name, - 'Name', itemProperty.Item.TranslatedName, - 'Namespace', propertyItem.TargetNamespace]) + AWriter.WriteLineNamedFmt(' RegisterChildNode(''%:s'', TXML%:s, ''%:s'');', + ['SourceName', propertyItem.Name, + 'Name', itemProperty.Item.TranslatedName, + 'Namespace', propertyItem.TargetNamespace]) else - AStream.WriteLnNamedFmt(' RegisterChildNode(''%:s'', TXML%:s);', - ['SourceName', propertyItem.Name, - 'Name', itemProperty.Item.TranslatedName]); + AWriter.WriteLineNamedFmt(' RegisterChildNode(''%:s'', TXML%:s);', + ['SourceName', propertyItem.Name, + 'Name', itemProperty.Item.TranslatedName]); end; end; end; @@ -871,32 +871,32 @@ begin begin WritePrototype; if AItem.CollectionItem.HasTargetNamespace then - AStream.WriteLnNamedFmt(' RegisterChildNode(''%:s'', %:s, ''%:s'');', - ['SourceName', AItem.CollectionItem.Name, - 'DataClass', GetDataTypeName(AItem.CollectionItem, False), - 'Namespace', AItem.CollectionItem.TargetNamespace]) + AWriter.WriteLineNamedFmt(' RegisterChildNode(''%:s'', %:s, ''%:s'');', + ['SourceName', AItem.CollectionItem.Name, + 'DataClass', GetDataTypeName(AItem.CollectionItem, False), + 'Namespace', AItem.CollectionItem.TargetNamespace]) else - AStream.WriteLnNamedFmt(' RegisterChildNode(''%:s'', %:s);', - ['SourceName', AItem.CollectionItem.Name, - 'DataClass', GetDataTypeName(AItem.CollectionItem, False)]); + AWriter.WriteLineNamedFmt(' RegisterChildNode(''%:s'', %:s);', + ['SourceName', AItem.CollectionItem.Name, + 'DataClass', GetDataTypeName(AItem.CollectionItem, False)]); - AStream.WriteLn; - AStream.WriteLnFmt(' ItemTag := ''%s'';', [AItem.CollectionItem.Name]); - AStream.WriteLnFmt(' ItemInterface := %s;', [GetDataTypeName(AItem.CollectionItem, True)]); - AStream.WriteLn; + AWriter.WriteLine; + AWriter.WriteLine(' ItemTag := ''%s'';', [AItem.CollectionItem.Name]); + AWriter.WriteLine(' ItemInterface := %s;', [GetDataTypeName(AItem.CollectionItem, True)]); + AWriter.WriteLine; end; end; if hasPrototype and (ASection = dxsImplementation) then begin - AStream.WriteLn(' inherited;'); - AStream.WriteLn('end;'); - AStream.WriteLn; + AWriter.WriteLine(' inherited;'); + AWriter.WriteLine('end;'); + AWriter.WriteLine; end; end; -function TDelphiXMLDataBindingGenerator.WriteInlineCollectionFields(AStream: TStreamHelper; AItem: TXMLDataBindingInterface): Boolean; +function TDelphiXMLDataBindingGenerator.WriteInlineCollectionFields(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingInterface): Boolean; var propertyIndex: Integer; collectionProperty: TXMLDataBindingProperty; @@ -913,19 +913,19 @@ begin begin if not Result then begin - AStream.WriteLn(' private'); + AWriter.WriteLine(' private'); Result := True; end; - AStream.WriteLnNamedFmt(' %:s: %:s;', - ['PropertyName', PrefixField + collectionProperty.TranslatedName, - 'DataInterface', PrefixInterface + collectionProperty.Collection.TranslatedName]); + AWriter.WriteLineNamedFmt(' %:s: %:s;', + ['PropertyName', PrefixField + collectionProperty.TranslatedName, + 'DataInterface', PrefixInterface + collectionProperty.Collection.TranslatedName]); end; end; end; -procedure TDelphiXMLDataBindingGenerator.WriteSchemaInterfaceProperties(AStream: TStreamHelper; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); +procedure TDelphiXMLDataBindingGenerator.WriteSchemaInterfaceProperties(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); var propertyIndex: Integer; itemProperty: TXMLDataBindingProperty; @@ -938,14 +938,14 @@ begin Exit; if ASection in [dxsClass, dxsImplementation] then - WriteAfterConstruction(AStream, AItem, ASection); + WriteAfterConstruction(AWriter, AItem, ASection); if ASection = dxsClass then - AStream.WriteLn(' protected'); + AWriter.WriteLine(' protected'); - WriteValidate(AStream, AItem, ASection); - WriteEnumeratorMethod(AStream, AItem, ASection); - hasMembers := WriteSchemaInterfaceCollectionProperties(AStream, AItem, ASection); + WriteValidate(AWriter, AItem, ASection); + WriteEnumeratorMethod(AWriter, AItem, ASection); + hasMembers := WriteSchemaInterfaceCollectionProperties(AWriter, AItem, ASection); for member := Low(TDelphiXMLMember) to High(TDelphiXMLMember) do begin @@ -955,7 +955,7 @@ begin begin itemProperty := AItem.Properties[propertyIndex]; - if WriteSchemaInterfaceProperty(AStream, AItem, itemProperty, ASection, member, + if WriteSchemaInterfaceProperty(AWriter, AItem, itemProperty, ASection, member, hasMembers and firstMember and (ASection in [dxsInterface, dxsClass])) then begin firstMember := False; @@ -966,7 +966,7 @@ begin end; -function TDelphiXMLDataBindingGenerator.WriteSchemaInterfaceCollectionProperties(AStream: TStreamHelper; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection): Boolean; +function TDelphiXMLDataBindingGenerator.WriteSchemaInterfaceCollectionProperties(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection): Boolean; var dataIntfName: String; dataTypeName: String; @@ -1092,7 +1092,7 @@ begin Result := (sourceCode.Count > 0); if Result then - AStream.Write(sourceCode.Format(['Name', AItem.TranslatedName, + AWriter.Write(sourceCode.Format(['Name', AItem.TranslatedName, 'ItemName', AItem.CollectionItem.TranslatedName, 'ItemSourceName', AItem.CollectionItem.Name, 'DataType', dataTypeName, @@ -1104,12 +1104,12 @@ begin end; -function TDelphiXMLDataBindingGenerator.WriteSchemaInterfaceProperty(AStream: TStreamHelper; AItem: TXMLDataBindingInterface; AProperty: TXMLDataBindingProperty; ASection: TDelphiXMLSection; AMember: TDelphiXMLMember; ANewLine: Boolean): Boolean; +function TDelphiXMLDataBindingGenerator.WriteSchemaInterfaceProperty(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingInterface; AProperty: TXMLDataBindingProperty; ASection: TDelphiXMLSection; AMember: TDelphiXMLMember; ANewLine: Boolean): Boolean; procedure WriteNewLine; begin if ANewLine then - AStream.WriteLn; + AWriter.WriteLine; end; @@ -1140,6 +1140,7 @@ var fieldName: String; writeStream: Boolean; typeMapping: TTypeMapping; + elementType: TDelphiElementType; begin Result := False; @@ -1157,7 +1158,7 @@ begin AProperty.IsOptional; writeStream := False; - if (AMember = dxmPropertyGet) and (AProperty.PropertyType = ptSimple) then + if (AMember = dxmPropertyMethods) and (AProperty.PropertyType = ptSimple) then begin if GetDataTypeMapping(TXMLDataBindingSimpleProperty(AProperty).DataType, typeMapping) then writeStream := (typeMapping.Conversion = tcBase64); @@ -1227,12 +1228,6 @@ begin if writeTextProp then sourceCode.Add(PropertyIntfMethodGetText); - if writeStream then - begin - sourceCode.Add(PropertyIntfMethodStream); - sourceCode.Add(PropertyIntfMethodFile); - end; - sourceCode.Add(PropertyIntfMethodGet); end; @@ -1250,6 +1245,15 @@ begin sourceCode.Add(PropertyIntfMethodSet); end; + dxmPropertyMethods: + if writeStream then + begin + sourceCode.Add(PropertyIntfMethodLoadFromStream); + sourceCode.Add(PropertyIntfMethodLoadFromFile); + sourceCode.Add(PropertyIntfMethodSaveToStream); + sourceCode.Add(PropertyIntfMethodSaveToFile); + end; + dxmPropertyDeclaration: if ASection = dxsInterface then begin @@ -1286,28 +1290,23 @@ begin case AMember of dxmPropertyGet: begin + elementType := GetDelphiElementType(AProperty); WriteNewLine; if writeOptional then if AProperty.IsAttribute then sourceCode.Add(PropertyImplMethodGetOptionalAttr) else - sourceCode.Add(PropertyImplMethodGetOptional[GetDelphiElementType(AProperty)]); + sourceCode.Add(PropertyImplMethodGetOptional[elementType]); if writeNil then - sourceCode.Add(PropertyImplMethodGetNil[GetDelphiElementType(AProperty)]); + sourceCode.Add(PropertyImplMethodGetNil[elementType]); if writeTextProp then if AProperty.IsAttribute then sourceCode.Add(PropertyImplMethodGetTextAttr) else - sourceCode.Add(PropertyImplMethodGetText[GetDelphiElementType(AProperty)]); - - if writeStream then - begin - sourceCode.Add(PropertyImplMethodStream[GetDelphiElementType(AProperty)]); - sourceCode.Add(PropertyImplMethodFile[GetDelphiElementType(AProperty)]); - end; + sourceCode.Add(PropertyImplMethodGetText[elementType]); sourceCode.Add('function TXML%:s.Get%:s: %:s;'); @@ -1322,7 +1321,7 @@ begin sourceCode.Add(XMLToNativeDataType('Result', '%:s', TXMLDataBindingSimpleProperty(AProperty).DataType, - GetDelphiNodeType(AProperty), + elementType, AProperty.TargetNamespace)); ptItem: @@ -1363,19 +1362,21 @@ begin sourceCode.AddLn; end; + dxmPropertySet: if not IsReadOnly(AProperty) then begin + elementType := GetDelphiElementType(AProperty); WriteNewLine; if writeNil then - sourceCode.Add(PropertyImplMethodSetNil[GetDelphiElementType(AProperty)]); + sourceCode.Add(PropertyImplMethodSetNil[elementType]); if writeTextProp then if AProperty.IsAttribute then sourceCode.Add(PropertyImplMethodSetTextAttr) else - sourceCode.Add(PropertyImplMethodSetText[GetDelphiElementType(AProperty)]); + sourceCode.Add(PropertyImplMethodSetText[elementType]); sourceCode.Add('procedure TXML%:s.Set%:s(const Value: %:s);'); value := '%:s'; @@ -1383,7 +1384,7 @@ begin if Assigned(propertyItem) and (propertyItem.ItemType = itEnumeration) then begin sourceCode.Add(NativeDataTypeToXML(value, '%:sValues[Value]', nil, - GetDelphiNodeType(AProperty), + elementType, AProperty.TargetNamespace)); end else begin @@ -1392,12 +1393,22 @@ begin sourceCode.Add(NativeDataTypeToXML(value, 'Value', TXMLDataBindingSimpleProperty(AProperty).DataType, - GetDelphiNodeType(AProperty), + elementType, AProperty.TargetNamespace)); end; sourceCode.AddLn; end; + + dxmPropertyMethods: + if writeStream then + begin + elementType := GetDelphiElementType(AProperty); + sourceCode.Add(PropertyImplMethodLoadFromStream[elementType]); + sourceCode.Add(PropertyImplMethodLoadFromFile[elementType]); + sourceCode.Add(PropertyImplMethodSaveToStream[elementType]); + sourceCode.Add(PropertyImplMethodSaveToFile[elementType]); + end; end; end; end; @@ -1408,7 +1419,7 @@ begin Result := (sourceCode.Count > 0); if Result then - AStream.Write(sourceCode.Format(['Name', AItem.TranslatedName, + AWriter.Write(sourceCode.Format(['Name', AItem.TranslatedName, 'PropertySourceName', AProperty.Name, 'PropertyName', AProperty.TranslatedName, 'PropertyItemName', propertyItemName, @@ -1421,7 +1432,7 @@ begin end; -procedure TDelphiXMLDataBindingGenerator.WriteSchemaEnumeration(AStream: TStreamHelper; AItem: TXMLDataBindingEnumeration; ASection: TDelphiXMLSection); +procedure TDelphiXMLDataBindingGenerator.WriteSchemaEnumeration(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingEnumeration; ASection: TDelphiXMLSection); var memberIndex: Integer; enumStart: String; @@ -1433,25 +1444,25 @@ begin enumStart := NamedFormat(' TXML%:s = (', ['Name', AItem.TranslatedName]); - AStream.Write(enumStart); + AWriter.Write(enumStart); lineIndent := StringOfChar(' ', Length(enumStart)); for memberIndex := 0 to Pred(AItem.MemberCount) do begin if memberIndex > 0 then - AStream.Write(lineIndent); + AWriter.Write(lineIndent); - AStream.Write(AItem.Members[memberIndex].TranslatedName); + AWriter.Write(AItem.Members[memberIndex].TranslatedName); if memberIndex < Pred(AItem.MemberCount) then - AStream.WriteLn(',') + AWriter.WriteLine(',') else - AStream.WriteLn(');'); + AWriter.WriteLine(');'); end; end; -procedure TDelphiXMLDataBindingGenerator.WriteSchemaEnumerationArray(AStream: TStreamHelper; AItem: TXMLDataBindingEnumeration); +procedure TDelphiXMLDataBindingGenerator.WriteSchemaEnumerationArray(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingEnumeration); var memberIndex: Integer; enumStart: String; @@ -1462,31 +1473,31 @@ begin exit; enumStart := NamedFormat(' %:sValues: ', ['Name', AItem.TranslatedName]); - AStream.WriteLn(enumStart + NamedFormat('array[TXML%:s] of WideString =', + AWriter.WriteLine(enumStart + NamedFormat('array[TXML%:s] of WideString =', ['Name', AItem.TranslatedName])); lineIndent := StringOfChar(' ', Length(enumStart)); - AStream.WriteLn(lineIndent + '('); + AWriter.WriteLine(lineIndent + '('); for memberIndex := 0 to Pred(AItem.MemberCount) do begin - AStream.Write(NamedFormat('%:s ''%:s''', + AWriter.Write(NamedFormat('%:s ''%:s''', ['Indent', lineIndent, 'Name', AItem.Members[memberIndex].Name])); if memberIndex < Pred(AItem.MemberCount) then - AStream.WriteLn(',') + AWriter.WriteLine(',') else - AStream.WriteLn; + AWriter.WriteLine; end; - AStream.WriteLn(lineIndent + ');'); - AStream.WriteLn; + AWriter.WriteLine(lineIndent + ');'); + AWriter.WriteLine; end; -procedure TDelphiXMLDataBindingGenerator.WriteValidate(AStream: TStreamHelper; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); +procedure TDelphiXMLDataBindingGenerator.WriteValidate(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); var propertyIndex: Integer; propertyItem: TXMLDataBindingProperty; @@ -1503,11 +1514,11 @@ begin case ASection of dxsInterface, dxsClass: - AStream.WriteLn(XSDValidateDocumentMethodInterface); + AWriter.WriteLine(XSDValidateDocumentMethodInterface); dxsImplementation: - AStream.WriteLnNamedFmt(XSDValidateDocumentMethodImplementation, - ['Name', AItem.TranslatedName]); + AWriter.WriteLineNamedFmt(XSDValidateDocumentMethodImplementation, + ['Name', AItem.TranslatedName]); end; end; @@ -1517,14 +1528,14 @@ begin dxsInterface, dxsClass: begin - AStream.WriteLn(XSDValidateMethodInterface); - AStream.WriteLn(''); + AWriter.WriteLine(XSDValidateMethodInterface); + AWriter.WriteLine(''); end; dxsImplementation: begin - AStream.WriteLnNamedFmt(XSDValidateMethodImplementationBegin, - ['Name', AItem.TranslatedName]); + AWriter.WriteLineNamedFmt(XSDValidateMethodImplementationBegin, + ['Name', AItem.TranslatedName]); elementSortOrder := ''; elementSortCount := 0; @@ -1571,8 +1582,8 @@ begin { For Item properties, we call our getter property. This ensures the child element exists, but also that it is created using our binding implementation. Otherwise there will be no IXSDValidate interface to call on the newly created node. } - AStream.WriteLnNamedFmt(XSDValidateMethodImplementationComplex, - ['Name', propertyItem.TranslatedName]); + AWriter.WriteLineNamedFmt(XSDValidateMethodImplementationComplex, + ['Name', propertyItem.TranslatedName]); end; end; end; @@ -1582,33 +1593,33 @@ begin if elementRequiredCount > 0 then begin Delete(elementRequired, 1, 2); - AStream.WriteLnNamedFmt(XSDValidateMethodImplementationRequired, - ['RequiredElements', elementRequired]); + AWriter.WriteLineNamedFmt(XSDValidateMethodImplementationRequired, + ['RequiredElements', elementRequired]); end; if attributeRequiredCount > 0 then begin Delete(attributeRequired, 1, 2); - AStream.WriteLnNamedFmt(XSDValidateMethodImplementationAttrib, - ['RequiredAttributes', attributeRequired]); + AWriter.WriteLineNamedFmt(XSDValidateMethodImplementationAttrib, + ['RequiredAttributes', attributeRequired]); end; if elementSortCount > 1 then begin Delete(elementSortOrder, 1, 2); - AStream.WriteLnNamedFmt(XSDValidateMethodImplementationSort, - ['SortOrder', elementSortOrder]); + AWriter.WriteLineNamedFmt(XSDValidateMethodImplementationSort, + ['SortOrder', elementSortOrder]); end; - AStream.WriteLn(XSDValidateMethodImplementationEnd); + AWriter.WriteLine(XSDValidateMethodImplementationEnd); end; end; end; end; -procedure TDelphiXMLDataBindingGenerator.WriteEnumeratorMethod(AStream: TStreamHelper; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); +procedure TDelphiXMLDataBindingGenerator.WriteEnumeratorMethod(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); begin if not AItem.IsCollection then Exit; @@ -1617,22 +1628,22 @@ begin dxsInterface, dxsClass: begin - AStream.WriteLnNamedFmt(EnumeratorMethodInterface, - ['Name', AItem.TranslatedName]); - AStream.WriteLn(''); + AWriter.WriteLineNamedFmt(EnumeratorMethodInterface, + ['Name', AItem.TranslatedName]); + AWriter.WriteLine(''); end; dxsImplementation: begin - AStream.WriteLnNamedFmt(EnumeratorMethodImplementation, - ['Name', AItem.TranslatedName]); + AWriter.WriteLineNamedFmt(EnumeratorMethodImplementation, + ['Name', AItem.TranslatedName]); end; end; end; -procedure TDelphiXMLDataBindingGenerator.WriteEnumerator(AStream: TStreamHelper; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); +procedure TDelphiXMLDataBindingGenerator.WriteEnumerator(AWriter: TNamedFormatWriter; AItem: TXMLDataBindingInterface; ASection: TDelphiXMLSection); begin if not AItem.IsCollection then Exit; @@ -1642,26 +1653,26 @@ begin case ASection of dxsInterface: begin - AStream.WriteLnNamedFmt(EnumeratorInterface, - ['Name', AItem.TranslatedName, - 'DataType', GetDataTypeName(AItem.CollectionItem, True), - 'GUID', CreateNewGUID]); - AStream.WriteLn(''); + AWriter.WriteLineNamedFmt(EnumeratorInterface, + ['Name', AItem.TranslatedName, + 'DataType', GetDataTypeName(AItem.CollectionItem, True), + 'GUID', CreateNewGUID]); + AWriter.WriteLine(''); end; dxsClass: begin - AStream.WriteLnNamedFmt(EnumeratorClass, - ['Name', AItem.TranslatedName, - 'DataType', GetDataTypeName(AItem.CollectionItem, True)]); - AStream.WriteLn(''); + AWriter.WriteLineNamedFmt(EnumeratorClass, + ['Name', AItem.TranslatedName, + 'DataType', GetDataTypeName(AItem.CollectionItem, True)]); + AWriter.WriteLine(''); end; dxsImplementation: begin - AStream.WriteLnNamedFmt(EnumeratorImplementation, - ['Name', AItem.TranslatedName, - 'DataType', GetDataTypeName(AItem.CollectionItem, True)]); + AWriter.WriteLineNamedFmt(EnumeratorImplementation, + ['Name', AItem.TranslatedName, + 'DataType', GetDataTypeName(AItem.CollectionItem, True)]); end; end; end; diff --git a/Units/DelphiXMLDataBindingResources.pas b/Units/DelphiXMLDataBindingResources.pas index f61b650..07bec9e 100644 --- a/Units/DelphiXMLDataBindingResources.pas +++ b/Units/DelphiXMLDataBindingResources.pas @@ -5,7 +5,7 @@ unit DelphiXMLDataBindingResources; interface type TDelphiXMLSection = (dxsForward, dxsInterface, dxsClass, dxsImplementation); - TDelphiXMLMember = (dxmPropertyGet, dxmPropertySet, dxmPropertyDeclaration); + TDelphiXMLMember = (dxmPropertyGet, dxmPropertySet, dxmPropertyMethods, dxmPropertyDeclaration); TDelphiAccessor = (daGet, daSet); TDelphiNodeType = (dntElement, dntElementNS, dntAttribute, dntNodeValue, dntCustom); TDelphiElementType = dntElement..dntElementNS; @@ -138,23 +138,25 @@ const ' Result := (inherited GetCurrent as %:s);' + CrLf + 'end;' + CrLf; - PropertyIntfMethodGetOptional = ' function GetHas%:s: Boolean;'; - PropertyIntfMethodGetNil = ' function Get%:sIsNil: Boolean;'; - PropertyIntfMethodGetText = ' function Get%:sText: WideString;'; - PropertyIntfMethodGet = ' function Get%:s: %:s;'; - PropertyIntfMethodSetNil = ' procedure Set%:sIsNil(const Value: Boolean);'; - PropertyIntfMethodSetText = ' procedure Set%:sText(const Value: WideString);'; - PropertyIntfMethodSet = ' procedure Set%:s(const Value: %:s);'; - PropertyIntfMethodStream = ' procedure Save%:sToStream(AStream: TStream);'; - PropertyIntfMethodFile = ' procedure Save%:sToFile(const AFileName: string);'; + PropertyIntfMethodGetOptional = ' function GetHas%:s: Boolean;'; + PropertyIntfMethodGetNil = ' function Get%:sIsNil: Boolean;'; + PropertyIntfMethodGetText = ' function Get%:sText: WideString;'; + PropertyIntfMethodGet = ' function Get%:s: %:s;'; + PropertyIntfMethodSetNil = ' procedure Set%:sIsNil(const Value: Boolean);'; + PropertyIntfMethodSetText = ' procedure Set%:sText(const Value: WideString);'; + PropertyIntfMethodSet = ' procedure Set%:s(const Value: %:s);'; + PropertyIntfMethodLoadFromStream = ' procedure Load%:sFromStream(AStream: TStream);'; + PropertyIntfMethodLoadFromFile = ' procedure Load%:sFromFile(const AFileName: string);'; + PropertyIntfMethodSaveToStream = ' procedure Save%:sToStream(AStream: TStream);'; + PropertyIntfMethodSaveToFile = ' procedure Save%:sToFile(const AFileName: string);'; - PropertyInterfaceOptional = ' property Has%:s: Boolean read GetHas%:s;'; - PropertyInterfaceNilReadOnly = ' property %:sIsNil: Boolean read Get%:sIsNil;'; - PropertyInterfaceNil = ' property %:sIsNil: Boolean read Get%:sIsNil write Set%:sIsNil;'; - PropertyInterfaceTextReadOnly = ' property %:sText: WideString read Get%:sText;'; - PropertyInterfaceReadOnly = ' property %:s: %:s read Get%:s;'; - PropertyInterfaceText = ' property %:sText: WideString read Get%:sText write Set%:sText;'; - PropertyInterface = ' property %:s: %:s read Get%:s write Set%:s;'; + PropertyInterfaceOptional = ' property Has%:s: Boolean read GetHas%:s;'; + PropertyInterfaceNilReadOnly = ' property %:sIsNil: Boolean read Get%:sIsNil;'; + PropertyInterfaceNil = ' property %:sIsNil: Boolean read Get%:sIsNil write Set%:sIsNil;'; + PropertyInterfaceTextReadOnly = ' property %:sText: WideString read Get%:sText;'; + PropertyInterfaceReadOnly = ' property %:s: %:s read Get%:s;'; + PropertyInterfaceText = ' property %:sText: WideString read Get%:sText write Set%:sText;'; + PropertyInterface = ' property %:s: %:s read Get%:s write Set%:s;'; PropertyImplMethodGetOptional: array[TDelphiElementType] of string = ( @@ -259,39 +261,73 @@ const 'end;' + CrLf + '' + CrLf; - PropertyImplMethodStream: array[TDelphiElementType] of string = - ( - { dntElement } - 'procedure TXML%:s.Save%:sToStream(AStream: TStream);' + CrLf + - 'begin' + CrLf + - ' Base64DecodeToStream(Trim(ChildNodes[''%:s''].Text), AStream);' + CrLf + - 'end;' + CrLf + - '' + CrLf, + PropertyImplMethodLoadFromStream: array[TDelphiElementType] of string = + ( + { dntElement } + 'procedure TXML%:s.Load%:sFromStream(AStream: TStream);' + CrLf + + 'begin' + CrLf + + ' ChildNodes[''%:s''].NodeValue := Base64EncodeFromStream(AStream);' + CrLf + + 'end;' + CrLf + + '' + CrLf, - { dntElementNS } - 'procedure TXML%:s.Save%:sToStream(AStream: TStream);' + CrLf + - 'begin' + CrLf + - ' Base64DecodeToStream(Trim(ChildNodesNS[''%:s'', ''%:s''].Text), AStream);' + CrLf + - 'end;' + CrLf + - '' + CrLf - ); + { dntElementNS } + 'procedure TXML%:s.Load%:sFromStream(AStream: TStream);' + CrLf + + 'begin' + CrLf + + ' ChildNodesNS[''%:s'', ''%:s''].NodeValue := Base64EncodeFromStream(AStream);' + CrLf + + 'end;' + CrLf + + '' + CrLf + ); - PropertyImplMethodFile: array[TDelphiElementType] of string = - ( - { dntElement } - 'procedure TXML%:s.Save%:sToFile(const AFileName: string);' + CrLf + - 'begin' + CrLf + - ' Base64DecodeToFile(Trim(ChildNodes[''%:s''].Text), AFileName);' + CrLf + - 'end;' + CrLf + - '' + CrLf, + PropertyImplMethodLoadFromFile: array[TDelphiElementType] of string = + ( + { dntElement } + 'procedure TXML%:s.Load%:sFromFile(const AFileName: string);' + CrLf + + 'begin' + CrLf + + ' ChildNodes[''%:s''].NodeValue := Base64EncodeFromFile(AFileName);' + CrLf + + 'end;' + CrLf + + '' + CrLf, - { dntElementNS } - 'procedure TXML%:s.Save%:sToFile(const AFileName: string);' + CrLf + - 'begin' + CrLf + - ' Base64DecodeToFile(Trim(ChildNodesNS[''%:s'', ''%:s''].Text), AFileName);' + CrLf + - 'end;' + CrLf + - '' + CrLf - ); + { dntElementNS } + 'procedure TXML%:s.Load%:sFromFile(const AFileName: string);' + CrLf + + 'begin' + CrLf + + ' ChildNodesNS[''%:s'', ''%:s''].NodeValue := Base64EncodeFromFile(AFileName);' + CrLf + + 'end;' + CrLf + + '' + CrLf + ); + + PropertyImplMethodSaveToStream: array[TDelphiElementType] of string = + ( + { dntElement } + 'procedure TXML%:s.Save%:sToStream(AStream: TStream);' + CrLf + + 'begin' + CrLf + + ' Base64DecodeToStream(Trim(ChildNodes[''%:s''].Text), AStream);' + CrLf + + 'end;' + CrLf + + '' + CrLf, + + { dntElementNS } + 'procedure TXML%:s.Save%:sToStream(AStream: TStream);' + CrLf + + 'begin' + CrLf + + ' Base64DecodeToStream(Trim(ChildNodesNS[''%:s'', ''%:s''].Text), AStream);' + CrLf + + 'end;' + CrLf + + '' + CrLf + ); + + PropertyImplMethodSaveToFile: array[TDelphiElementType] of string = + ( + { dntElement } + 'procedure TXML%:s.Save%:sToFile(const AFileName: string);' + CrLf + + 'begin' + CrLf + + ' Base64DecodeToFile(Trim(ChildNodes[''%:s''].Text), AFileName);' + CrLf + + 'end;' + CrLf + + '' + CrLf, + + { dntElementNS } + 'procedure TXML%:s.Save%:sToFile(const AFileName: string);' + CrLf + + 'begin' + CrLf + + ' Base64DecodeToFile(Trim(ChildNodesNS[''%:s'', ''%:s''].Text), AFileName);' + CrLf + + 'end;' + CrLf + + '' + CrLf + ); SectionComments: array[TDelphiXMLSection] of String = ( diff --git a/Units/XMLDataBindingHelpers.pas b/Units/XMLDataBindingHelpers.pas index 5a46342..43aa904 100644 --- a/Units/XMLDataBindingHelpers.pas +++ b/Units/XMLDataBindingHelpers.pas @@ -2,35 +2,14 @@ unit XMLDataBindingHelpers; interface uses - Classes; + System.Classes; + type - TStreamHelper = class(TObject) - private - FOwnership: TStreamOwnership; - FStream: TStream; + TNamedFormatWriter = class(TStreamWriter) public - constructor Create(AStream: TStream; AOwnership: TStreamOwnership = soReference); - destructor Destroy; override; - - function ReadString(ASize: Integer = -1): String; - function ReadInteger: Integer; - function ReadDateTime: TDateTime; - function ReadBoolean: Boolean; - - procedure Write(const ASource: String); - procedure WriteLn(const ASource: String = ''); - - procedure WriteFmt(const ASource: String; const AParams: array of const); - procedure WriteLnFmt(const ASource: String; const AParams: array of const); - procedure WriteNamedFmt(const ASource: String; const AParams: array of const); - procedure WriteLnNamedFmt(const ASource: String; const AParams: array of const); - - procedure WriteString(const ASource: String); - procedure WriteInteger(const ASource: Integer); - procedure WriteDateTime(const ASource: TDateTime); - procedure WriteBoolean(const ASource: Boolean); + procedure WriteLineNamedFmt(const ASource: String; const AParams: array of const); end; @@ -41,120 +20,16 @@ uses X2UtNamedFormat; -{ TStreamHelper } -constructor TStreamHelper.Create(AStream: TStream; AOwnership: TStreamOwnership); -begin - FOwnership := AOwnership; - FStream := AStream; - - inherited Create; -end; - - -destructor TStreamHelper.Destroy; -begin - if FOwnership = soOwned then - FreeAndNil(FStream); - - inherited; -end; - - -function TStreamHelper.ReadString(ASize: Integer): String; -var - iSize: Integer; - -begin - if ASize = -1 then - iSize := ReadInteger - else - iSize := ASize; - - SetLength(Result, iSize); - FStream.Read(PChar(Result)^, iSize); -end; - - -function TStreamHelper.ReadInteger: Integer; -begin - FStream.Read(Result, SizeOf(Integer)); -end; - - -function TStreamHelper.ReadDateTime: TDateTime; -begin - FStream.Read(Result, SizeOf(TDateTime)); -end; - - -function TStreamHelper.ReadBoolean: Boolean; -begin - FStream.Read(Result, SizeOf(Boolean)); -end; - - -procedure TStreamHelper.Write(const ASource: String); -begin - FStream.Write(PChar(ASource)^, Length(ASource)); -end; - - -procedure TStreamHelper.WriteLn(const ASource: String); -begin - Write(ASource + #13#10); -end; - - -procedure TStreamHelper.WriteFmt(const ASource: String; const AParams: array of const); -begin - Write(Format(ASource, AParams)); -end; - - -procedure TStreamHelper.WriteLnFmt(const ASource: String; const AParams: array of const); -begin - WriteLn(Format(ASource, AParams)); -end; - - -procedure TStreamHelper.WriteNamedFmt(const ASource: String; const AParams: array of const); +{ TNamedFormatWriter } +procedure TNamedFormatWriter.WriteNamedFmt(const ASource: String; const AParams: array of const); begin Write(NamedFormat(ASource, AParams)); end; -procedure TStreamHelper.WriteLnNamedFmt(const ASource: String; const AParams: array of const); +procedure TNamedFormatWriter.WriteLineNamedFmt(const ASource: String; const AParams: array of const); begin - WriteLn(NamedFormat(ASource, AParams)); -end; - - -procedure TStreamHelper.WriteString(const ASource: String); -var - iSize: Integer; - -begin - iSize := Length(ASource); - WriteInteger(iSize); - FStream.Write(PChar(ASource)^, iSize); -end; - - -procedure TStreamHelper.WriteInteger(const ASource: Integer); -begin - FStream.Write(ASource, SizeOf(Integer)); -end; - - -procedure TStreamHelper.WriteDateTime(const ASource: TDateTime); -begin - FStream.Write(ASource, SizeOf(TDateTime)); -end; - - -procedure TStreamHelper.WriteBoolean(const ASource: Boolean); -begin - FStream.Write(ASource, SizeOf(Boolean)); + WriteLine(NamedFormat(ASource, AParams)); end; end. diff --git a/X2XMLDataBinding.dpr b/X2XMLDataBinding.dpr index a8200bc..dd03bb1 100644 --- a/X2XMLDataBinding.dpr +++ b/X2XMLDataBinding.dpr @@ -3,7 +3,6 @@ program X2XMLDataBinding; {$WARN SYMBOL_PLATFORM OFF} uses - VistaManAsInvoker, Forms, MainFrm in 'Forms\MainFrm.pas' {MainForm}, XMLDataBindingGenerator in 'Units\XMLDataBindingGenerator.pas', diff --git a/X2XMLDataBinding.dproj b/X2XMLDataBinding.dproj index 2ee5776..e50547d 100644 --- a/X2XMLDataBinding.dproj +++ b/X2XMLDataBinding.dproj @@ -1,49 +1,145 @@ - - - {983dfcaf-23ca-48a0-a147-d96769428a71} - X2XMLDataBinding.dpr - Debug - AnyCPU - DCC32 - bin\X2XMLDataBinding.exe - - - 7.0 - False - False - 0 - 3 - RELEASE - - - 7.0 - 3 - DEBUG - bin - Lib - Lib - Lib - - - Delphi.Personality - - -FalseTrueFalse"P:\updateserver\xsd\ads111.xsd"FalseFalse1000FalseFalseFalseFalseFalse104312521.0.0.01.0.0.0X2XMLDataBinding.dpr - - - - - MainSource - - -
MainForm
-
- - - - - - - -
-
\ No newline at end of file + + + {983dfcaf-23ca-48a0-a147-d96769428a71} + X2XMLDataBinding.dpr + Debug + DCC32 + bin\X2XMLDataBinding.exe + VCL + 13.4 + True + Build + Win64 + 3 + Application + + + true + + + true + Base + true + + + true + Base + true + + + true + Base + true + + + true + Cfg_2 + true + true + + + bin + X2XMLDataBinding_Icon.ico + Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;Winapi;Xml.Win;System.Win;$(DCC_Namespace) + CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments= + lib + 1043 + $(BDS)\bin\default_app.manifest + + + true + Data.Win;Datasnap.Win;Web.Win;Soap.Win;$(DCC_Namespace) + bin64 + lib64 + 1033 + + + Data.Win;Datasnap.Win;Web.Win;Soap.Win;Bde;$(DCC_Namespace) + "P:\updateserver\xsd\ads111.xsd" + 1033 + + + 7.0 + 3 + DEBUG;$(DCC_Define) + Lib + Lib + + + true + 1033 + + + Delphi.Personality.12 + + + + + False + True + False + "P:\updateserver\xsd\ads111.xsd" + + + False + False + 1 + 0 + 0 + 0 + False + False + False + False + False + 1043 + 1252 + + + + + 1.0.0.0 + + + + + + 1.0.0.0 + + + + X2XMLDataBinding.dpr + + + + True + True + + + 12 + + + + + MainSource + + +
MainForm
+
+ + + + + + + + + Cfg_2 + Base + + + Base + +
+ +
diff --git a/X2XMLDataBinding.res b/X2XMLDataBinding.res index fa031c61599cdd661e09f6753164125e75318898..2f784beceb7bbfdeda9cef2caa30eaef5a507345 100644 GIT binary patch delta 1236 zcmZuxy>HV%6n}0bQC9+W0yZoQ7NmT&X`z)v8v3P(7OFNaBXaFaYGL06-#Kk0q=>1E zAXVzxtz(54m=I$n{sdT&7#SE?5as72PEzPuckk}K_j{k`d;L>C{H?z+*t|w$5YhSh z1SSp`Inq;|4VHPWfOVTT=^54~+Q6f7#K=Q2{~BViw>s4j@NkFr4Ub0~3-2S^yc3JY}Gh zOadm>Ux$_;mm+dVF~oln_Ah7=hBRo|fF-U5p%LAtxGYsjZMc;P-9|ElAoSF?)LY}a zroX#)kka(`pHe3}Nd4N`1W5MQ*&UEyiz^R7N(U!Zkndm54mJJYw4r@CZH#PyUXTw0QOoE zRpzP3U9l%K3nB;vPcI0rLgC8}q>JcRWG0h~zadd0+VMT-5o=Y&bB3DDOwUg5%oOs4 zg5%WkZf!`_Z`-^c*>yO-JH&2;!eLU1upBzOo??!Q!j4KdNj{s@<6`z!pWmyKrNT(6 z3a^RF+tBXyVbF#tGw~sr6NRYWpspc%5urWIT@Ssc=d(JKeId%;7ccDts&HXeS(EvL z>Kle1Gm54yE4+#7gzcfM4I}c(PMmnrtl7R~W|D4Pax2?6|DSg&dm&aU+s_)|S=r<| r;6Q}?P8R0*`8a;u$yF-jSBsyQ4O+vl47!5Xpo#~mJBFXBQLz33u!k}a delta 82 zcmbR8hqL1|=LChx4UA%p!kecvwzB{!dA8-8K6P|Qy7KY`HL90^A|CNaxe=B2v1M1Vrm2cb>13P diff --git a/X2XMLDataBinding_Icon.ico b/X2XMLDataBinding_Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..24f96f392a5f3758c5546d688e033140502a18d5 GIT binary patch literal 161862 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

)DLJZ&)Ni8zLfSK^(4QKcVj03 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