Home > ACTIONSCRIPT 3.0 > [AS3] – Come creare un oggetto leggendo il nome della Classe e delle sue proprietà da un file XML.

[AS3] – Come creare un oggetto leggendo il nome della Classe e delle sue proprietà da un file XML.

A volte può esserci l’esigenza di dover generalizzare il processo di creazione degli oggetti, e di conseguenza acquisire i riferimenti delle Classi in maniera dinamica.

La funzione getDefinitionByName() di AS3, presente nel package flash.utils, consente di ottenere un riferimento della Classe, passando, come argomento, il nome della classe ( in formato stringa ).

Una volta acquisito il riferimento alla Classe, l’oggetto potrà essere istanziato utilizzando l’operatore new e la variabile contenente il “reference” della Classe.

// ...
var className         :String;
var classReference    :Class;
var objectReference   :Object;

// ... class name ( string );
// ... nome della Classe ( string )   
className       = flash.display.MovieClip

// ... ottieni il riferimento all'oggetto Class
// ... get Class object reference 
classReference  = Class(getDefinitionByName(className));

// ... crea l'oggetto
// ... create the object
objectReference = classReference(new classReference());

// ... 

 

E’ necessario, comunque, che la Classe venga importata al momento della compilazione del .fla o .as.

Nota : la maggior parte delle classi predefinite di AS3 ( presenti nei pacchetti flash.*) sono importate automaticamente dal compilatore. 

 

Per importare in maniera “esplicita” una Classe ( propria o tra quelle presenti nei pacchetti di AS3 non caricate automaticamente ) basterà dichiarare una variabile di quel tipo ( di quella Classe ). 

// ...
// ... declare a dummy variable of type : myClass
// ... dichiarazione di una variabile del tipo : myClass 
var dummyRef : myClass;
// ...

 

Ciò servirà ad “avvertire” il compilatore che “intendiamo utilizzare quella Classe” e lo “costringerà” ad importare la definizione della Classe.

Nota : la sola indicazione della dichiarativa import myclass non è sufficiente a far importare la Classe, in quanto, il compilatore, per motivi di ottimizzazione, non importerà la Classe fin tanto che non incontrerà almeno una dichiarazione di variabile di quella Classe.

 

Qui di seguito un esempio che mostra come creare un oggetto il cui nome della Classe ed alcune delle sue proprietà sono lette da un file XML.

// ...................................................................
//   NAME : buildForm.fla
//          QUESTO ESEMPIO MOSTRA COME CREARE UN OGGETTO LEGGENDO IL 
//          NOME DELLA CLASSE E LE SUE PROPRIETA' DA UN FILE XML. 
//
//          THIS EXAMPLE SHOWS HOW TO CREATE AN OBJECT READING CLASS 
//          NAME AND ITS PROPERTIES AS STRINGS FROM AN XML FILE 
//
// 
// sample XML file : 
// 
// <?xml version="1.0" encoding="UTF-8"?>
// <form>
//   <editField className="flash.text.TextField" >
//     <type>input</type>
//     <maxChars>200</maxChars>
//     <text>... that was only yesterday</text>
//     <textColor>0x00CC00</textColor> 
//     <background>true</background> 
//     <backgroundColor>0x333333</backgroundColor> 
//     <border>true</border> 
//     <borderColor>0x888888</borderColor> 
//     <width>300</width> 
//     <height>25</height> 
//     <x>100</x> 
//     <y>50</y> 
//   </editField>
// </form>
//
// ...................................................................
var XMLRequest        :URLRequest; 
var XMLLoader         :URLLoader; 
var XMLObejct         :XML; 
var myObject          :XMLList; 

var classReference    :Class;
var className         :String;
var objectReference   :Object;

var propertyClass     :Class;
var propertyObject    :XML;
var propertyName      :String;
var propertyValue     :String;
var booleanValue      :Boolean;


XMLRequest     = new URLRequest(); 
XMLLoader      = new URLLoader(); 
XMLLoader.addEventListener(Event.COMPLETE, XMLLoaded); 

XMLRequest.url = "form.xml";
XMLLoader.load(XMLRequest);

// ... 

// .................................................. 
//  FUNCTION : XMLLoaded - Event.COMPLETE
// .................................................. 
function XMLLoaded(evento:Event):void  
{
    // ... ACQUISIZIONE DELL'XML  
    // ... GET XML  
    XMLObejct = new XML(XMLLoader.data); 

    // ... ACQUISIZONE DEL TAG <editField>	
    // ... GET <editField> TAG 
    myObject = XMLObejct.editField; 
    // ... oppure  
    // ... or   
    // ... ( myObject = XMLObejct.children()[0]; ) 
	
	
    // ... ACQUISIZIONE DELL'ATTRIBUTO className 
    // ... GET className ATTRIBUTE 
    //     ( es. : <editField className="flash.text.TextField" > ) 
    className       = myObject[0].@className; 
	
    // ... SYSOUT 
    trace("className : " + className);
	
    // ... ACQUISIZIONE DELLA CLASSE 
    // ... GET CLASS REFERENCE 
    classReference  = Class(getDefinitionByName(className));
	
    // ... CREAZIONE DELL'OGGETTO 
    // ... CREATE THE OBJECT 
    objectReference = classReference(new classReference());
	
    // ... LETTURA DELLE PROPRIETA' DELL'OGGETTO  
    // ... READ OBJECT'S PROPERTIES 
    for( var i:int = 0; i < myObject.children().length(); i++ )
    {
        // ... ACQUISIZIONE DEL i-esimo TAG ( PROPRIETA' )        		
        // ... GET i-th TAG ( PROPERTY )  
        //     ( es. : <maxChars>200</maxChars> ) 
        propertyObject = myObject.children()[i];
		
        // ... NOME DEL TAG ( NOME DELLA PROPRIETA' )  
        // ... TAG NAME ( PROPERTY NAME )  
        //     ( es. "maxChars" ) 
        propertyName   = propertyObject.name();
	    
        // ... VALORE DELLA PROPRIETA' 
        // ... PROPERTY VALUE 
        //     ( es. : 200 ) 
        propertyValue  = propertyObject;
		
        // ... SYSOUT 
        trace(propertyName + "=" + propertyValue);
		
        // ... ACQUISISCI LA CLASSE DELLA PROPRIETA' 
        // ... GET PROPERTY CLASS 
        propertyClass = Object(objectReference[propertyName]).constructor;
		
        // ... SYSOUT 
        trace("propertyClass : " + propertyClass);
		
        // ... SE LA PROPRIETA' E' DI CLASSE BOOLEAN, DOBBIAMO CONVERTIRE 
        //     LE STRINGHE "true" O "false" IN BOOLEAN. 
        // ... IF PROPERTY CLASS IS BOOLEAN, WE NEED TO CONVERT 
        //     THE STRINGS VALUES "true" OR "false" IN BOOLEAN. 
        if (propertyClass == Boolean) 
        {
            // ... RICHIAMO DELLA FUNZIONE strToBoolean() PRIMA DEL CASTING 
            // ... CALL strToBoolean() FUNCTION BEFORE CASTING			
            booleanValue                  = strToBoolean(propertyValue);

            // ... ASSEGNAZIONE DEL VALORE DELLA PROPRIETA' (boolean)
            // ... ASSIGN PROPERTY VALUE (boolean) 
            objectReference[propertyName] = propertyClass(booleanValue);
        }
        else 
        {
            // ... ASSGNAZIONE DEL VALORE DELLA PROPRIETA' 
            // ... ASSIGN PROPERTY VALUE  
            objectReference[propertyName] = propertyClass(propertyValue);
        }
    }	
	
    // ... AGGIUNGI L'OGGETTO 
    // ... ADD CHILD 
    addChild(classReference(objectReference));

    // ... 
} 
// ...................................................................


// ...................................................................
//   FUNCTION : strToBoolean() 
//              CONVERTE LE STRINGHE "true" O "false" IN BOOLEAN 
//              CONVERTS THE STRINGS "true" OR "false" INTO BOOLEAN 
// ...................................................................
function strToBoolean(p_string:String):Boolean
{
    var retValue:Boolean;
	
    retValue = false;
    if (p_string == "true" ) 
    { 
        retValue = true;
    }
    return retValue;
}
// ...................................................................

// ... END 
Categories: ACTIONSCRIPT 3.0
  1. No comments yet.
  1. No trackbacks yet.

REPLY