2008-09-17 19 views
5

के साथ एक एम्बेडेड संपत्ति की क्लास परिभाषा कैसे प्राप्त हो सकती है मेरे पास कई एम्बेडेड संपत्तियों वाला एक वर्ग है।फ्लेक्स/एएस 3 में, मुझे getDefinitionByName

कक्षा के भीतर, मैं नाम से संपत्ति की श्रेणी परिभाषा प्राप्त करना चाहता हूं। मैंने GetDefinitionByName(), और ApplicationDomain.currentDomain.getDefinition() का उपयोग करने का प्रयास किया है, लेकिन न तो काम करता है।

उदाहरण:

public class MyClass 
{ 
    [Embed(source="images/image1.png")] private static var Image1Class:Class; 
    [Embed(source="images/image2.png")] private static var Image2Class:Class; 
    [Embed(source="images/image3.png")] private static var Image3Class:Class; 

    private var _image:Bitmap; 

    public function MyClass(name:String) 
    { 
    var ClassDef:Class = getDefinitionByName(name) as Class; //<<-- Fails 
    _image = new ClassDef() as Bitmap;  
    } 
} 

var cls:MyClass = new MyClass("Image1Class"); 

उत्तर

8

यह आपके सवाल का जवाब नहीं है, लेकिन यह आपकी समस्या का समाधान हो सकता है। मैं कर रहा विश्वास कुछ इस तरह काम करना चाहिए:

public class MyClass 
{ 
    [Embed(source="images/image1.png")] private static var Image1Class:Class; 
    [Embed(source="images/image2.png")] private static var Image2Class:Class; 
    [Embed(source="images/image3.png")] private static var Image3Class:Class; 

    private var _image:Bitmap; 

    public function MyClass(name:String) 
    { 
    _image = new this[name]() as Bitmap;  
    } 
} 

var cls:MyClass = new MyClass("Image1Class"); 

मैं एक कठिन समय को याद करता है, तो ब्रैकेट अंकन सील वर्गों पर काम करता है हो रही है। यदि ऐसा नहीं होता है, तो कक्षा को गतिशील के रूप में चिह्नित करना एक साधारण समाधान है।

+0

हे! अच्छा काम, यह काम किया! – user8399

2

आपको किसी भी फैंसी getDefinitionByName() विधियों का उपयोग करने की आवश्यकता नहीं है, बस इसे गतिशील रूप से देखें। अपने मामले में, 'विफलता' रेखा को प्रतिस्थापित करें:

var classDef:Class = MyClass[name] as Class; 

और ऐसा करना चाहिए।

+0

यह काम करता है! धन्यवाद davr – jedierikb

0

आपको बहुत बहुत धन्यवाद! मैंने पीओएस getDefinitionByName को getQualifiedClassName के साथ काम करने के लिए लगभग 5 घंटे बिताए हैं कि मैं सामान फेंकने के लिए तैयार था !! मेरा अंतिम कामकाजी कोड इस तरह दिखता है और स्ट्रिंग नाम को सरणी से भी मिलता है।

CreatureParam स्ट्रिंग्स की 2 आयामी सरणी है;

टाइप एक पूर्णांक है जो HTML टैग द्वारा फ़्लैश करने के लिए भेजा जाता है जो बारी है PHP के माध्यम से एक MYSQL डेटाबेस से आता है।

Mark1_cb एक combobox है जो मंच पर है और इसका एक उदाहरण नाम है। यह आउटपुट भी एक पूर्णांक है।

तो यह कोड सीधे नीचे एक बाहरी swf "ArtLibrary.swf" से "BirdBodyColor_mc" वर्ग आयात करता है। BirdBodyColor_mc एक पीएनजी छवि से बनाई गई एक फिल्म क्लिप है। ध्यान दें कि आपको ArtLibrary.fla में मूवीक्लिप पर डबल क्लिक करना होगा और दूसरा कुंजी फ्रेम डालना होगा। मूवीक्लिप्स को स्पष्ट रूप से दो फ्रेमों की आवश्यकता होती है या फ्लैश इसे एक स्प्राइट के रूप में आयात करने की कोशिश करता है और एक प्रकार का मेल नहीं खाता है।

[एम्बेड करें (स्रोत = "ArtLibrary.swf", प्रतीक = "BirdBodyColor_mc")] var BirdBodyColor_mc: कक्षा;

आम तौर पर मैं इस कोड का उपयोग कर मंच पर इस मूवीक्लिप कक्षा का एक उदाहरण डालूंगा।

myMC: MovieClip = new BirdBodyColor_mc(); ऐड चाइल्ड (myMC);

var परिभाषा: कक्षा = यह ["BirdBodyColor_mc"] कक्षा के रूप में; var मार्क 1: मूवीक्लिप = नई परिभाषा();

लेकिन मुझे अपनी सरणी में देखे गए स्ट्रिंग मान का उपयोग करके ऐसा करने की आवश्यकता है। तो इसके लिए कोड यहाँ है।

var परिभाषा: कक्षा = यह [CreatureParam [प्रकार] [Mark1_cb + 2]] कक्षा के रूप में; var मार्क 1: मूवीक्लिप = नई परिभाषा();

3

कारण अपने विधि काम नहीं करता है, क्योंकि "Image1Class" एक चर नाम, न कि वास्तविक कक्षा नाम है।

आप इस

import flash.utils.getQualifiedClassName; 
trace(getQualifiedClassName(Image1Class)); 

कौन सा रूप में आप देख सकते हैं, अपने वर्ग के नाम (एक है कि समारोह में पारित किया जाना चाहिए) का अर्थ है की तरह वर्ग के नाम प्राप्त कर सकते हैं MyClass_Image1Class की तरह कुछ है।

+0

लेकिन, मैं अभी भी उपर्युक्त तरीकों में से एक की सिफारिश करता हूं, क्योंकि 'getDefinitionByName()' केवल तभी जरूरी होगा जब आप अपनी वर्तमान कक्षा के उन छवियों _outside_ तक पहुंच रहे हों। – IQAndreas