Fixed: reference to an enumeration is resolved as a simple type and turns into a Variant instead of a properly typed enumeration

This commit is contained in:
Mark van Renswoude 2011-10-12 10:47:37 +00:00
parent 66ce9ae1c9
commit 23d6e7e18e
3 changed files with 44 additions and 42 deletions

View File

@ -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

View File

@ -23,7 +23,7 @@ uses
cxTextEdit,
DataBindingHintsXML,
XMLDataBindingGenerator, cxGraphics, cxLookAndFeelPainters;
XMLDataBindingGenerator, cxGraphics, cxLookAndFeelPainters, cxClasses;
type

View File

@ -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;