2009-09-14 10 views
16

के साथ "टाइप टाइप टाइप नहीं है" त्रुटि क्यों मिलती है मैंने निम्नलिखित enum प्रकार घोषित किया है जिसमें मैं चाहता हूं कि पहले सदस्य को सामान्य 0 (शून्य) के बजाय 1 (एक) का क्रमिक मान प्राप्त हो। :मुझे एनम प्रकार

type 
    TMyEnum = (
       meFirstValue = 1, 
       meSecondValue, 
       meThirdValue 
      ); 

अगर मैं TypeInfo(), जैसे फोन

GetEnumName(TypeInfo(TMyEnum), Ord(aValue)); 

त्रुटि:: GetEnumName के लिए एक कॉल के हिस्से के रूप(), मैं एक संकलक त्रुटि मिलती है

ऐसा क्यों है: "E2134 प्रकार 'TMyEnum' नहीं typeinfo है"?

मैं जानता हूँ कि कक्षाएं केवल है typeinfo अगर वे $ एम संकलक विकल्प सक्षम या साथ संकलित किए जाते हैं (कुछ वर्ग जो था से निकाले जाते हैं, इस तरह के TPersistent के रूप में), लेकिन मुझे नहीं लगता था कि कोई विशेष परिस्थितियों थे enum प्रकार के लिए typeinfo होने के लिए।

उत्तर

18

टाइप जानकारी उन enums के लिए समर्थित नहीं है जहां विशिष्ट ordinal मान असाइन किए जाते हैं जिसके परिणामस्वरूप एनम सदस्यों को क्रमिक मान होते हैं जो आमतौर पर संकलक द्वारा असाइन किए जाते हैं।

यदि विशिष्ट मान आवश्यक या वांछनीय हैं, तो "अप्रयुक्त" enum सदस्यों को आवश्यकतानुसार "पैड" enum में डालना होगा। जैसे (जोर केवल के लिए अतिरिक्त खरोज):

type 
    TMyEnum = (
       meNOTUSED1, {= 0} 
       meFirstValue, {= 1} 
       meSecondValue, 
       meThirdValue 
      ); 

एक subrange तो बाहर अप्रयुक्त प्रारंभिक मूल्य "फिल्टर" के लिए इस्तेमाल किया जा सकता है:

TValidMyEnum = meFirstValue..meThirdValue; 

यद्यपि आप तो मूल enum का नाम बदलने पर विचार करना चाह सकते हैं टाइप करें ताकि आपके उप-प्रकार का उपयोग आपके पूरे प्रोजेक्ट में किया जा सके।

एक subrange पर्याप्त नहीं है, तो enum शामिल है "अंतराल":

type 
    TMyEnum = (
       meNOTUSED1, {= 0} 
       meFirstValue, {= 1} 
       meSecondValue, 
       meThirdValue, 
       meNOTUSED2, 
       meFinalValue {= 5} 
      ); 

इस मामले में कोई बस संकलन समय सीमा अप्रयुक्त सदस्यों को बाहर करने की जाँच का विस्तार करने के तरीका है, लेकिन के एक जोड़े सेट प्रकार किसी भी आवश्यक क्रम चेकों को लागू करने के लिए व्यापार को सरल बनाएगा:

type 
    TMyEnums = set of TMyEnum; 

    const 
    meNOTUSED  = [meUNUSED1, meUNUSED2]; // .. etc as required 
    meValidValues = [Low(TMyEnum)..High(TMyEnum)] - meNOTUSED; 


    if NOT (aValue in meValidValues) then 
    // etc 
+2

शायद तुम एक subrange प्रकार का उपयोग करके ऐसा करने का दर्द को कम कर सकते हैं: प्रकार TMyEnumWithDummy = ( meNOTUSED, meFirstValue, meSecondValue, meThirdValue ); TMyEnum = Succ (meNOTUSED) ..उच्च (TMyEnumWithDummy); –

+1

हां वास्तव में, यद्यपि यदि आपके पास enum में "अंतराल" है तो एक साधारण सब्रेंज पर्याप्त नहीं होगा। जिस मामले में मैं इस पर आया था, उसके पास अंतराल था - दुर्भाग्यवश मैं शुरुआती "प्रश्न" के लिए अति-सरलीकृत था। लेकिन मैं आपके सुझाव के साथ उत्तर भी अपडेट करूंगा। – Deltics

28

क्रमरहित enumerations और enumerations जो शून्य से शुरू नहीं है typeinfo जरूरत नहीं है। टाइपिन्फो लागू करने के लिए, पिछड़े संगतता मुद्दों के कारण, मौजूदा टीकेएन्यूमरेशन से इसे एक अलग प्रारूप में होना आवश्यक होगा।

मैंने डेल्फी 2010 के लिए एक टीके डिस्कोन्टिग्यूअन्यूअन्यूशन (या संभवतः बेहतर नामित सदस्य) को लागू करने पर विचार किया, लेकिन लाभ उनकी सापेक्ष कमी और गणना में कठिनाइयों पर विचार करने के लिए छोटा लग रहा था - आप श्रेणियों को कुशलतापूर्वक कैसे एन्कोड करते हैं? कुछ एन्कोडिंग कुछ परिदृश्यों के लिए बेहतर हैं, दूसरों के लिए बदतर।

+6

यह कुछ उपयोगी और रोचक पृष्ठभूमि जानकारी है। आपने कम से कम E2134 त्रुटि के लिए दस्तावेज़ को अद्यतन करने पर विचार किया होगा। यह एक उदाहरण प्रदान करता है जहां टाइपइन्फो का उत्पादन नहीं होता है लेकिन यह enum प्रकारों के लिए इन विचारों के रूप में कोई संकेत नहीं देता है। फिर फिर, मुझे इस पर ठोकर खाने के लिए ठोस डेल्फी के लगभग 15 साल लग गए हैं, इसलिए आप कहते हैं कि यह वास्तव में एक आम समस्या नहीं है। :) – Deltics