From 23d6e7e18eea80f72ffb7971d4321ed34592bf15 Mon Sep 17 00:00:00 2001 From: Mark van Renswoude Date: Wed, 12 Oct 2011 10:47:37 +0000 Subject: [PATCH] Fixed: reference to an enumeration is resolved as a simple type and turns into a Variant instead of a properly typed enumeration --- Forms/MainFrm.dfm | 6 +-- Forms/MainFrm.pas | 2 +- Units/XMLDataBindingGenerator.pas | 78 +++++++++++++++++-------------- 3 files changed, 44 insertions(+), 42 deletions(-) diff --git a/Forms/MainFrm.dfm b/Forms/MainFrm.dfm index e4b1f54..88c8557 100644 --- a/Forms/MainFrm.dfm +++ b/Forms/MainFrm.dfm @@ -82,10 +82,6 @@ object MainForm: TMainForm TabOrder = 2 object spFile: TTabSheet TabVisible = False - ExplicitLeft = 0 - ExplicitTop = 0 - ExplicitWidth = 0 - ExplicitHeight = 0 object lblFile: TLabel Left = 8 Top = 7 @@ -200,10 +196,10 @@ object MainForm: TMainForm Style.HotTrack = False Left = 264 Top = 60 + PixelsPerInch = 96 end object LookAndFeel: TcxLookAndFeelController Kind = lfFlat - NativeStyle = True Left = 368 Top = 60 end diff --git a/Forms/MainFrm.pas b/Forms/MainFrm.pas index f43e9a9..a3149de 100644 --- a/Forms/MainFrm.pas +++ b/Forms/MainFrm.pas @@ -23,7 +23,7 @@ uses cxTextEdit, DataBindingHintsXML, - XMLDataBindingGenerator, cxGraphics, cxLookAndFeelPainters; + XMLDataBindingGenerator, cxGraphics, cxLookAndFeelPainters, cxClasses; type diff --git a/Units/XMLDataBindingGenerator.pas b/Units/XMLDataBindingGenerator.pas index 40973d5..1112d76 100644 --- a/Units/XMLDataBindingGenerator.pas +++ b/Units/XMLDataBindingGenerator.pas @@ -812,46 +812,49 @@ begin enumerationObject := TXMLDataBindingEnumeration.Create(Self, AElement, AElement.DataType.Enumerations, AElement.Name, False); ASchema.AddItem(enumerationObject); Result := enumerationObject; - end else if AElement.DataType.IsComplex then + end else begin - { Interface } - interfaceObject := TXMLDataBindingInterface.Create(Self, AElement, AElement.Name); - if Assigned(AElement.DataType.BaseType) then - interfaceObject.BaseName := AElement.DataType.BaseTypeName; - - ASchema.AddItem(interfaceObject); - Result := interfaceObject; - end; - - if Assigned(interfaceObject) then - begin - for elementIndex := 0 to Pred(AElement.ChildElements.Count) do - ProcessChildElement(ASchema, AElement.ChildElements[elementIndex], interfaceObject); - - for attributeIndex := 0 to Pred(AElement.AttributeDefs.Count) do - ProcessAttribute(ASchema, AElement.AttributeDefs[attributeIndex], interfaceObject); - end else if AElement.IsGlobal then - begin - { Non-anonymous non-complex type. Assume somewhere in there is a - built-in type. - - This code probably isn't correct, but it works for the files I got. } - typeDef := AElement.DataType; - - while Assigned(typeDef) do + if AElement.DataType.IsComplex then begin - if Supports(typeDef, IXMLSimpleTypeDef, simpleTypeDef) and (simpleTypeDef.IsBuiltInType) then + { Interface } + interfaceObject := TXMLDataBindingInterface.Create(Self, AElement, AElement.Name); + if Assigned(AElement.DataType.BaseType) then + interfaceObject.BaseName := AElement.DataType.BaseTypeName; + + ASchema.AddItem(interfaceObject); + Result := interfaceObject; + end; + + if Assigned(interfaceObject) then + begin + for elementIndex := 0 to Pred(AElement.ChildElements.Count) do + ProcessChildElement(ASchema, AElement.ChildElements[elementIndex], interfaceObject); + + for attributeIndex := 0 to Pred(AElement.AttributeDefs.Count) do + ProcessAttribute(ASchema, AElement.AttributeDefs[attributeIndex], interfaceObject); + end else if AElement.IsGlobal then + begin + { Non-anonymous non-complex type. Assume somewhere in there is a + built-in type. + + This code probably isn't correct, but it works for the files I got. } + typeDef := AElement.DataType; + + while Assigned(typeDef) do begin - { The element is global, but only references a simple type. } - simpleAliasItem := TXMLDataBindingSimpleTypeAliasItem.Create(Self, AElement, AElement.Name); - simpleAliasItem.DataType := typeDef; - ASchema.AddItem(simpleAliasItem); + if Supports(typeDef, IXMLSimpleTypeDef, simpleTypeDef) and (simpleTypeDef.IsBuiltInType) then + begin + { The element is global, but only references a simple type. } + simpleAliasItem := TXMLDataBindingSimpleTypeAliasItem.Create(Self, AElement, AElement.Name); + simpleAliasItem.DataType := typeDef; + ASchema.AddItem(simpleAliasItem); - Result := simpleAliasItem; - Break; + Result := simpleAliasItem; + Break; + end; + + typeDef := typeDef.BaseType; end; - - typeDef := typeDef.BaseType; end; end; end; @@ -1177,7 +1180,10 @@ begin end; itUnresolved: - ResolveItem(ASchema, TXMLDataBindingUnresolvedItem(item)); + begin + ResolveItem(ASchema, TXMLDataBindingUnresolvedItem(item)); + FreeAndNil(item); + end; end; end; end;