2010-01-22 13 views
6

Binding Mam schematu XML, który używa wyliczeń, ale kiedy patrzę na wygenerowanego obiektu XML w Delphi, ograniczenie wyliczenie zostało upuszczone. Czy istnieje sposób, aby Delphi wygenerował enum i zbudował go na obiekcie?Korzystanie Wyliczenia Delphi XML z danych XML Kreatora

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> 

co by się spodziewać, aby zobaczyć w Delphi jest dziedziną, która akceptuje enum, który jest następnie przekształcany To corresponing ciąg gdy XML jest generowany, ale to pole jest tylko zwykłym strunowy.

Odpowiedz

5

Co możesz zrobić, to stworzyć swój własny wyliczony typ z tymi samymi ciągami znaków, co nazwy i użyć jednostki TypInfo z funkcją GetEnumValue i GetEnumString. Pozwala to prefiks nazwy z kilkoma małymi literami jak w innych kodu Delphi:

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

Jeśli masz wyliczenie jak TMyEnum = (MeFirst, meSecond, meThird), można uzyskać porządkowa wartość (numeryczna) używając EnumValue: = TMyEnum (GetEnumValue (typeinfo (TMyEnum), 'MeFirst')); // wynikiem będzie meFirst. Na odwrót: Wynik: = Copy (GetEnumName (typeinfo (TMyEnum) Ord (meSecond)), 3, MaxInt) przyniesie ciąg 'drugi'. Jedna uwaga: jeśli GetEnumValue zwróci wartość -1, jeśli nie znaleziono, więc można dodać dodatkowy test na skutek zamiast rzucania go bezpośrednio do typu wyliczenia. Powodzenia! –

+0

To dość chłodne, dzięki – LostNomad311

2

Nie jest możliwe dla danych XML Binding kreatora, aby robić to, co chcesz.

Powodem jest to, że wyliczenia w XSD nie są zgodne z identyfikatorami delphi bo:

  1. może zawierać znaków niezgodnych z identyfikatorem Delphi
  2. jest wielkość liter

Zasadniczo XSD wyliczenia są tylko ciągami o ograniczonych wartościach.

Zobacz the enumeration specs i an example.

Oba są wyraźnie sprzeczne z Delphi typów wyliczeniowych.

Edit: 20100125 - Delphi atrybuty

Here is an interesting question o tym, jak daleko można pójść z nowym atrybutem i wsparcia RTTI w Delphi 2010.

--jeroen

+1

Ci dźwięk przypominający wymówek do mnie (nie ty, którego nigdy nie zdecydowały się wesprzeć teksty stałe XML w Delphi, oczywiście). Istnieje wiele z rozwiązań problemu iw pewnym momencie rzeczywiste teksty stałe musiałyby być przechowywane w stałych łańcuchowych, nie ma powodu, że nie będzie musiał być opcja enumType.Each ... jej enumType_enums_Each dla mnie. Dzięki za konformację. – LostNomad311

+1

Przy obecnych funkcjach językowych (atrybutach, stałych) możliwe jest obejście tego. Ale pamiętaj, że Delphi nie jest sam w tego rodzaju ograniczeniach. Generowanie wrapperów ze schematów XSD to pole wyspecjalizowanych narzędzi, nawet w świecie Java lub .NET. Zobacz odpowiedzi na niektóre narzędzia działające w świecie .NET: http: // stackoverflow.com/questions/305796/generate-class-for-schema-with-abstract-complex-type –

+0

Dzięki za dodanie tego do deliciious ... coś mi mówi, że będę szukał tego później – LostNomad311

Powiązane problemy