2010-01-22 7 views
6

Ich habe ein XML-Schema, das Aufzählungen verwendet, aber wenn ich das generierte XML-Objekt in Delphi anschaue, wurde die Aufzählungsbeschränkung verworfen. Gibt es eine Möglichkeit, Delphi dazu zu bringen, das Enum zu generieren und es in das Objekt zu integrieren?Verwenden von XML-Enumerationen mit dem XML-Datenbindungsassistenten von Delphi

XSD Snippet:

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

Was würde ich erwarten, in Delphi zu sehen, ist ein Feld, das eine Enum akzeptiert, die dann in dieses umgewandelt wird ist corresponing Zeichenfolge, wenn die XML generiert wird, aber das Feld ist nur ein gewöhnlicher Zeichenfolge.

Antwort

5

Sie können einen eigenen Aufzählungstyp mit denselben String-Konstanten wie Namen erstellen und die Unit TypInfo mit der Funktion GetEnumValue und GetEnumString verwenden. Auf diese Weise können Sie die Namen mit einigen Kleinbuchstaben wie in anderen Delphi-Code Präfix:

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

gehen könnte Wenn Sie eine Aufzählung wie TMyEnum = haben (meFirst, meSecond, meThird), Sie können den ordinalen (numerischen) Wert mit EnumValue erhalten: = TMyEnum (GetEnumValue (typeinfo (TMyEnum), 'meFirst')); // Ergebnis wird meFirst sein. Andersherum: Ergebnis: = Kopieren (GetEnumName (typeinfo (TMyEnum), Ord (meSecond)), 3, MaxInt) liefert die Zeichenkette 'Second'. Ein Hinweis: Wenn GetEnumValue -1 zurückgibt, wenn der Wert nicht gefunden wird, können Sie einen zusätzlichen Test für das Ergebnis hinzufügen, anstatt es direkt auf Ihren Aufzählungstyp zu werfen. Viel Glück! –

+0

Das ist ziemlich cool, danke – LostNomad311

2

Es ist nicht möglich, dass die XML-Daten-Assistenten Bindung zu tun, was Sie wollen.

Der Grund dafür ist, dass Aufzählungen in einem XSD nicht kompatibel sind mit Delphi-Identifikatoren, weil sie:

  1. Zeichen nicht mit einem Delphi Identifikator enthalten kann
  2. Groß- und Kleinschreibung

Grundsätzlich XSD Aufzählungen sind nur Zeichenfolgen mit einer Beschränkung von Werten.

Siehe the enumeration specs und an example.

Beide sind eindeutig inkompatibel mit Delphi-Aufzählungstypen.

Edit: 20.100.125 - Delphi-Attribute

Here is an interesting question ab, wie weit Sie mit dem neuen Attribut und RTTI-Unterstützung in Delphi 2010

--jeroen

+1

Das klingt nach Ausreden für mich (nicht Sie, die jemals entschieden, XML Enums in Delphi natürlich nicht zu unterstützen). Es gibt eine Reihe von Lösungen für das Problem und irgendwann müssten die tatsächlichen enums in String-Konstanten gespeichert werden, es gibt keinen Grund, dass es eine enumType.Each-Option geben müsste ... sein enumType_enums_Each für mich. Danke für das Exterieur. – LostNomad311

+1

Mit den aktuellen Sprachfeatures (Attribute, Konstanten) könnte es möglich sein, dies zu umgehen. Aber denken Sie daran, dass Delphi mit diesen Einschränkungen nicht allein ist. Das Generieren von Wrappern aus XSD-Schemas ist der Bereich der spezialisierten Tools, sogar in der Java- oder .NET-Welt. Einige Tools, die in der .NET-Welt funktionieren, finden Sie hier: http: // stackoverflow.com/questions/305796/generate-class-for-scheme-with-abstract-complex-type –

+0

Danke dafür, fügte es zu delicious ... etwas sagt mir, ich werde später danach suchen – LostNomad311

Verwandte Themen