2011-10-31 13 views
6

में एकाधिक संस्करण भागों में मैं डेल्फी XE2 का उपयोग करके एसडब्ल्यूएफ फाइलों में कुछ हेरफेर करने के लिए एक छोटा सा टूल लिख रहा हूं। अब तक, मैं बस the SWF specification का पालन कर रहा हूं, और अब मैंने आकृति का प्रतिनिधित्व करने के लिए डेटा संरचना को लागू करने में एक छोटी सी समस्या को मारा है।रिकॉर्ड

एसडब्ल्यूएफ आकार में आकार रिकॉर्ड शामिल हैं। आकार के रिकॉर्ड किनारे के रिकॉर्ड या गैर-किनारे वाले रिकॉर्ड हो सकते हैं, और उनमें से प्रत्येक प्रकार के दो अतिरिक्त उपप्रकार हैं।

विशिष्ट रूप से, विनिर्देश के पृष्ठ 135 पर, दो गैर-किनारे रिकॉर्ड प्रकारों का वर्णन किया गया है; EndShapeRecord और StyleChangeRecord। एसडब्ल्यूएफ फ़ाइल में, इनके बीच अंतर करने का तरीका यह जांचना है कि क्या सभी पांच ध्वज बिट्स (टाइपफ्लैग के बाद) 0 हैं; यदि वे हैं, तो यह EndShapeRecord है, अन्यथा यह StyleChangeRecord है।

बाद में आकार रिकॉर्ड को संसाधित करने में मेरी सहायता के लिए, मैं एक संस्करण रिकॉर्ड का उपयोग करके एक रिकॉर्ड प्रकार में किनारे और गैर-किनारे वाले रिकॉर्ड को एकजुट करना चाहता हूं। विभिन्न प्रकार के रिकॉर्ड के बीच अंतर करना काफी आसान है; एक नेस्टेड संस्करण रिकॉर्ड मुझे आसानी से किनारे के रिकॉर्ड को अलग करने की अनुमति देता है, और गैर-किनारे के रिकॉर्ड के लिए, मैं StyleChangeRecord से 5 झंडे घोषित कर सकता हूं और IsEndRecord फ़ंक्शन लिख सकता हूं।

हालांकि, मेरा स्रोत कोड बनाने के हित में विनिर्देश को जितना संभव हो सके प्रतिबिंबित करता है, मैं एक कदम आगे जाना चाहता हूं। StyleChangeRecord में अन्य क्षेत्रों की उपस्थिति इन 5 झंडे के मूल्यों पर आधारित है, इसलिए मैं प्रत्येक ध्वज द्वारा जोड़े गए फ़ील्ड वाले 5 प्रकार के रिकॉर्ड, एक ध्वज घोषित करने में सक्षम होना चाहता हूं। (मुझे एहसास है कि यह किसी भी तरह से स्मृति उपयोग को प्रभावित नहीं करेगा, लेकिन यह बात नहीं है।)

दुर्भाग्य से, डेल्फी प्रति "स्तर" से एक से अधिक संस्करण भाग की अनुमति नहीं दे रहा है, और इन 5 को परिभाषित करने का प्रयास कर रहा है एक ही स्तर पर भिन्नता भागों सिर्फ वाक्यविन्यास त्रुटियों का एक टन फेंकता है।

TShapeRecord = record 
    case EdgeRecord: Boolean of 
    False: (
     case StateMoveTo: Boolean of 
     True: (
      MoveBits: Byte; 
      MoveDeltaX: Int32; 
      MoveDeltaY: Int32; 
     ); 
     case StateLineStyle: Boolean of // << Errors start here 
     True: (LineStyle: UInt16); 
     //Additional flags 
    ); 
    //Fields for edge records 
end; 

थोड़ा सरल शब्दों में, लक्ष्य तो जैसे एक रिकार्ड तैयार करने के लिए सक्षम होने के लिए है:

TNonEdgeRecord = record 
    case StateMoveTo: Boolean of 
     True: (
     MoveBits: Byte; 
     MoveDeltaX: Int32; 
     MoveDeltaY: Int32; 
    ); 
    case StateLineStyle: Boolean of 
     True: (LineStyle: UInt16); 
end; 

... रिकार्ड के संस्करण भागों को हटाए बिना, और उन्हें घोंसले (के बाद से बिना घोंसले एक वाक्य रचनात्मक बिंदु से एक गलत संबंध इंगित करेगा)।

क्या कोई अन्य तरीका है कि मैं रिकॉर्ड में एकाधिक (गैर-नेस्टेड) ​​संस्करण भागों को घोषित कर सकता हूं, या क्या मुझे आंतरिक भाग के लिए संस्करण रिकॉर्ड का उपयोग न करने के लिए वापस जाना चाहिए?

+0

मैं पूरी तरह से समझ में नहीं आता कि आप क्या हासिल करने की कोशिश कर रहे हैं, लेकिन यह की तरह लगता है आप अपना खुद का संस्करण रिकॉर्ड हैंडलिंग रोल करना चाहते हैं। रिकॉर्ड गुणों का उपयोग करना इतना आसान है। –

+0

@ डेविड हेफरन: नहीं, यह काफी नहीं है। मैं * प्रकार परिभाषा * शो बनाना चाहता हूं जो फ़ील्ड मौजूद हैं, किसी निश्चित ध्वज या चर के मान को देखते हुए - यह मूल रूप से एक संस्करण रिकॉर्ड करता है, और यह काफी आसान है।मेरे लिए समस्या * एकल * रिकॉर्ड में * एकाधिक * प्राप्त करना है; सबसे अच्छा मैं करने में सक्षम हूं उन्हें घोंसला करना है, लेकिन यह मूर्खतापूर्ण होगा, क्योंकि ये झंडे एक-दूसरे से स्वतंत्र हैं। मैं उम्मीद को थोड़ा और स्पष्ट करने के लिए प्रश्न को दोबारा लिखने की कोशिश करूंगा। –

+0

सिंटेक्स एकाधिक स्वतंत्र झंडे का समर्थन नहीं करता है। नेस्टिंग एक विकल्प है। विधियों/गुणों के साथ रिकॉर्ड्स वह दूसरा है जिसे मैं सोच सकता हूं। –

उत्तर

5

नहीं। पास्कल की बोर्लैंड शाखा केवल रिकॉर्ड के अंत में भिन्न भागों की अनुमति देती है।

नेस्टिंग एकमात्र तरीका है।

कुछ रोचक उदाहरण और टिप्पणियों के लिए, रूडी Velthuis द्वारा यह लेख देखें:

http://rvelthuis.de/articles/articles-convert.html ("यूनियन" भाग के लिए खोज)

संबंधित मुद्दे