Flash CS3: TextField.appendText()

Sabato 15 Dicembre, 2007

Flash CS3 ha davvero tante novità, tra cui quella "curiosa" di indicare al momento della compilazione alcuni consigli sulla scrittura del codice. Questo accade, ad esempio, quando abbiamo a che fare con gli oggetti TextField. Mi è capitato di dover aggiungere una stringa alla fine di un campo TextField, con la classica notazione:

Actionscript:
  1. mioTextField_txt.text += "Stringa aggiunta";

Ma ecco che ActionScript 3.0, al momento di compilare il filmato, mi avverte (Warning) - o consiglia:

Warning: 3551: L'aggiunta di testo a un'istanza TextField mediante += è spesso un'operazione più lenta rispetto all'uso del metodo TextField.appendText().

Fantastico! Andiamo a vedere infatti la SYNOPSIS del metodo appendText() che effettivamente dice:

Aggiunge la stringa specificata dal parametro newText alla fine del testo del relativo campo. Questo metodo è più efficiente rispetto a un'assegnazione addizione (+=) applicata a una proprietà text (ad esempio someTextField.text += moreText), in particolare nel caso di un campo di testo con una quantità di contenuto significativa.

Ci fidiamo? Per sicurezza verifichiamo:

Actionscript:
  1. import flash.utils.getTimer;
  2.  
  3. var i:uint=0;
  4. var s:int = getTimer();
  5. for(i; i <10000;i++) {
  6.     text_txt.text += "Ciao";
  7. }
  8. var f:int = getTimer();
  9. trace(f-s);

Tempo: 9360 - sulla mia macchina, in debug mode. Proviamo allora come consigliato dal compilatore:

Actionscript:
  1. import flash.utils.getTimer;
  2.  
  3. var i:uint=0;
  4. var s:int = getTimer();
  5. for(i; i <10000;i++) {
  6.     text_txt.appendText ("Ciao");
  7. }
  8. var f:int = getTimer();
  9. trace(f-s);

Tempo: 8415 ;)

Niente di eccezionale... tuttavia è vero! Il metodo appendText() è più rapido e performante dell'operatore pre-incrementale (+=). Come mai? Il motivo più ovvio è il seguente: l'operatore (+=) agisce su qualsiasi tipo di dato. Inoltre in un linguaggio OO questo operatore non è strutturato come nel semplice C ma è "oggettato". In C++, ad esempio, è possibile sovrascrivere (override) tale operatore in quanto facente parte della struttura ad oggetti del linguaggio stesso. In definitiva appendText() è più rapido in quanto il suo obiettivo è quello di "appendere" una stringa e di conseguenza non si fa tante "domande" al suo interno. L'operatore (+=), invece, deve funzionare per qualsiasi tipo di dato e quindi non è ottimizzato per le stringhe. In C, al contrario, l'operatore (+=) è una funzione a basso livello e sarà sempre più rapida di una chiamata ad una funzione.

Post correlati

Flash: disabilitare un TextField in modalità input

Mercoledì 14 Novembre, 2007

Come si disabilità un TextField in modalità input? Visto che la proprietà enabled non è disponibile si può ricorrere ad un semplice artifizio: cambiare runtime lo stato del TextField. Fortunatamente gli sviluppatori di Flash hanno permesso di modificare lo stato di un TextField anche runtime, tramite la proprietà type. Ne deriva che se un TextField è inserito nello stage come input (quindi con type="input"), da codice possiamo trasformarlo in un testo "statico". In realtà lo trasformeremo in testo dinamico (type="dynamic") ma il risultato visivo è il medesimo. L'artifizio funziona in quanto sia il TextField input che il TextField dinamico condividono la stessa proprietà text. Così se ho inserito un testo in un TextField input quando lo trasformo in un TextField dinamico avrò solo l'impressione di non poter più inserire caratteri! Ovvero ho disabilitato il TextField input!

L'oggetto TextField, inoltre, può essere esteso come un MovieClip, quindi potremmo avvalerci del seguente utile codice:

Actionscript:
  1. TextField.prototype.Enabled = function(v:Boolean) {
  2.     this.type = v ? "input" : "dynamic";
  3. };

Post correlati

Flash: come inizializzare componenti nel costruttore di una classe

Martedì 6 Novembre, 2007

Quando si estente una classe da un MovieClip che continene altri oggetti (MovieClip, TextField, etc...) questi ultimi potrebbero non essere "pronti" all'interno del costruttore. Questo accade soprattutto quando si utilizzano altri MovieClip estesi o i componenti (controls) di Flash. Per risolvere il problema basta sfruttare l'evento onLoad ereditato dalla classe stessa. Ad esempio immaginiamo di avere un MovieClip che contiene un campo TextField (oggetto visuale statico interno a Flash) e un oggetto TextInput (controllo inserito dal pannello componenti) e si vuole impostare qualche proprietà durante il costruttore della nostra classe MiaClasse.

Esempio Creiamo un simbolo ed inseriamo al suo interno sia l'oggetto TextField (chiamiamolo text_txt) sia l'oggetto TextInput (textinput_txt). Associamo questo simbolo ad una classe che estende un MovieClip, chiameremo la nostra classe MiaClasse. Quello che vogliamo ottenere è che durante il costruttore della nostra classe MiaClasse vengano inizializzati questi due controlli. Se proviamo ad usare un codice come questo:

Actionscript:
  1. //
  2. import mx.controls.TextInput;
  3. //
  4. class MiaClasse extends MovieClip {
  5.     //
  6.     private var text_txt:TextField;
  7.     private var textinput_txt:TextInput;
  8.     //
  9.     function MiaClasse() {
  10.         trace("MiaClasse::costruttore");
  11.         //
  12.         text_txt.text = "Ciao";
  13.         textinput_txt.text = "Ciao";
  14.         //
  15.     }
  16.  
  17. }

Continua a leggere... »

Post correlati