2010-01-22 35 views
6

Tengo un esquema XML que usa enumeraciones, pero cuando miro el objeto XML generado en Delphi, la restricción de enumeración se ha eliminado. ¿Hay alguna forma de que Delphi genere la enumeración y la construya en el objeto?Uso de enumeraciones XML con Delphi XML Data Binding Wizard

XSD Fragmento:

<xs:simpleType name="enumType" final="restriction"> 
    <xs:restriction base="xs:NMTOKEN"> 
     <xs:enumeration value="Each"/> 
     <xs:enumeration value="Units"/> 
     <xs:enumeration value="Area"/> 
     <xs:enumeration value="Payroll"/> 
     <xs:enumeration value="Sales"/> 
     <xs:enumeration value="TotalCost"/> 
     <xs:enumeration value="Other"/> 
    </xs:restriction> 
</xs:simpleType> 

lo que esperaría ver en Delphi es un campo que acepte una enumeración que luego se convirtió en su corresponing cadena cuando se genera el XML, pero este campo es sólo un ordinario cuerda.

Respuesta

5

Lo que puedes hacer es crear tu propio tipo enumerado con las mismas constantes de cadena como nombres y usar la unidad TypInfo con la función GetEnumValue y GetEnumString. Esto le permite prefijar los nombres con algunas letras minúsculas como en otro tipo de código de Delphi:

Value := TMyEnum(GetEnumValue(typeinfo(TMyEnum), Prefix + AString) ) 
+0

Si usted tiene una enumeración como TMyEnum = (meFirst, meSecond, meThird), puede obtener el valor ordinal (numérico) usando EnumValue: = TMyEnum (GetEnumValue (typeinfo (TMyEnum), 'meFirst')); // el resultado será meFirst. A la inversa: Resultado: = Copiar (GetEnumName (typeinfo (TMyEnum), Ord (meSecond)), 3, MaxInt) arrojará la cadena 'Second'. Una nota: si GetEnumValue devolverá -1 si no se encuentra el valor, entonces puede agregar una prueba adicional en el resultado en lugar de convertirlo directamente a su tipo de enumeración. ¡Buena suerte! –

+0

Eso es genial, gracias – LostNomad311

2

No es posible que el asistente para hacer lo que quiera el enlace de datos XML.

La razón es que las enumeraciones en un XSD no son compatibles con identificadores delphi porque:

  1. puede contener caracteres incompatibles con un identificador de Delphi
  2. son mayúsculas y minúsculas

Básicamente enumeraciones XSD son solo cadenas con un límite de valores.

Ver the enumeration specs y an example.

Ambos son claramente incompatibles con los tipos de enumeración Delphi.

Editar: 20100125 - Delphi atributos

Here is an interesting question de lo lejos que puede ir con el nuevo atributo y el apoyo de RTTI en Delphi 2010.

--jeroen

+1

. Eso suena como una excusa para mí (no para ti, que decidiste no apoyar XML enums en Delphi, por supuesto). Hay varias soluciones al problema y en algún momento las enumeraciones reales deberían almacenarse en constantes de cadena, no hay ninguna razón para que haya un enumType. Cada opción ... es enumType_enums_Each para mí. Gracias por la conformación sin embargo. – LostNomad311

+1

Con las características de idioma actuales (atributos, constantes), podría ser posible solucionar esto. Pero recuerda que Delphi no está solo en este tipo de limitaciones. La generación de envolturas de esquemas XSD es el campo de las herramientas especializadas, incluso en el mundo de Java o .NET. Consulte las respuestas aquí para algunas herramientas que funcionan en el mundo .NET: http: // stackoverflow.com/preguntas/305796/generar de clase-para-esquema-con-de tipo complejo abstracto –

+0

Gracias por eso, añadieron a deliciious ... algo me dice que voy abeja en busca de que posteriormente – LostNomad311

Cuestiones relacionadas