|
Os
tipos de dados básicos do Flash MX e Flash 5 incluem dados numéricos,
seqüênciais (strings) e boleanos e os tipos estruturados incluem
matrizes (array) e objeto. As variáveis podem ser criadas a partir
de qualquer daqueles tipos de dados. Como em qualquer linguagem de programação,
as variáveis são criadas para guardar dados os quais podem
mudar ao longo do programa (filme), ou que podem ser aplicados em um loop,
por exemplo (para evitar um grande número de códigos duplicados).
Novidades
no Flash MX
As
variáveis no Flash MX são essencialmente as mesmas do Flash
5. Uma exceção é que, no Flash 5, você pode
tratar um campo de texto dinâmico como uma variável seqüêncial;
no Flash MX é melhor (mais poderoso) tratar um campo de texto dinâmico
como uma instância da classe Textfield, dando-lhe um nome de instância
ao invés de um nome de variável, e acessar seu conteúdo
via suas propriedades de texto (.text property).
No
Flash MX, você pode também especificar uma variável
como global, assim ela pode ser acessada a partir de qualquer linha de
tempo (timeline), e de filmes carregados em qualquer nível, sem
especificar um caminho. Para descrever tal variável, use esta fórmula:
| _global.dbname_str
= 'endereço'; |
A
variável pode ser acessada de qualquer lugar com um simples dbname_str
(no lugar de this._parent._parent.dbname_str, por exemplo). Alguns recomendam
o uso de designadores de nome (namespaces) com um _global para evitar
conflitos potenciais de nomeação, especialmente em arquivos
que serão partilhados. O formato seria então:
| _global.astb.dbname_str
= 'endereço'; |
fazendo
a variável acessível como astb.dbname_str. As Funções,
que são atualmente um tipo de variável, também podem
ser definidas como globais e acessadas do mesmo modo de qualquer lugar
do filme. Esta é uma boa técnica para usar para funções
de construção de classes, de forma que instâncias
novas podem ser criadas em qualquer lugar no filme.
Convenções
para Nomeação de Variáveis
O
Flash MX e o Dreamweaver MX fornecem ambos ao desenvolvedor uma útil
característica chamada "orientador de códigos",
na qual todas as propriedades e métodos para um tipo de objeto
são mostradas (de uma lista da qual podem ser selecionadas) quando
o nome da variável deste objeto é digitada (em um .fla no
Flash MX, ou em um arquivo no DWMX), contanto que o desenvolvedor siga
certas convenções para nomear variáveis. Estas convenções
estão estocadas em definições no arquivo ASCodeHints.xml
encontrado no diretório Flash MX/First Run/ActionsPanel sob o diretório
Macromedia no Program Files (em um PC), e para variáveis componentes
FUI no UIComponents.xml no subdiretório CustomActions. Entretanto,
você só precisa saber disto se você quiser mudar as
definições. De outra forma, você pode simplesmente
usar as convenções fornecidas para seus nomes de variável
e o orientador de código apropriado irá surgir. As convenções
padrão são estas:
In
ASCodeHints.xml:
<typeinfo pattern="*_mc" object="MovieClip"
/>
<typeinfo pattern="*_array" object="Array"
/>
<typeinfo pattern="*_str" object="String"
/>
<typeinfo pattern="*_btn" object="Button"
/>
<typeinfo pattern="*_txt" object="TextField"
/>
<typeinfo pattern="*_fmt" object="TextFormat"
/>
<typeinfo pattern="*_date" object="Date"
/>
<typeinfo pattern="*_sound" object="Sound"
/>
<typeinfo pattern="*_xml" object="XML"
/>
<typeinfo pattern="*_xmlsocket" object="XMLSocket"
/>
<typeinfo pattern="*_color" object="Color"
/>
<typeinfo pattern="_level*" object="MovieClip"
/>
<typeinfo pattern="_parent" object="MovieClip"
/>
<typeinfo pattern="_root" object="MovieClip"
/>
in UIComponents.xml:
<typeinfo pattern="*_ch" object="FCheckBox"/>
<typeinfo pattern="*_pb" object="FPushButton"/>
<typeinfo pattern="*_rb" object="FRadioButton"/>
<typeinfo pattern="*_lb" object="FListBox"/>
<typeinfo pattern="*_sb" object="FScrollBar"/>
<typeinfo pattern="*_cb" object="FComboBox"/>
<typeinfo pattern="*_sp" object="FScrollPane"/>
<typeinfo pattern="globalStyleFormat"
object="FStyleFormat"/> |
Isto
é, se você nomear uma variável string address_str
ou lastname_str ou anything_str, o orientador de código para objetos
string surgirá assim que uma _str tenha sido digitada. Você
também pode fazer uma cópia deste arquivo, salvá-lo,
e entrar com seus próprios padrões preferidos no arquivo.
Eu uso estas modificações e adições:
<typeinfo
pattern="*_arr" object="Array" />
<typeinfo pattern="*_bmc" object="MovieClip"
/>
<typeinfo pattern="*_itxt" object="TextField"
/>
<typeinfo pattern="*_htxt" object="TextField"
/> |
porque
_arr é mais curto do que _array e porque gosto de estar apto a
identificar em meus códigos quais campos de texto são campos
de entrada ou formatados em html, como oposição aos campos
de texto dinâmicos usuais, e cujos movieclips espera-se funcionar
como botões movieclips.
Atribuir
um valor a uma variável simples
Variáveis
do tipo string, booleanas ou numéricas podem ser criadas e a elas
atribuídas um valor simplesmente digitando-se um nome de variável,
seguido por um "=" e pelo valor:
var
name_str = "Wanda Jones";
// string
var i = 0; //
numérico, i é geralmente usado em loops
var isFinished_bool = true; //
booleano (sem aspas em true)
var hasCake_bool = 0; //
também booleano, o mesmo que hasCake_bool = false; |
Para
obter os conteúdos de um campo de texto de entrada dentro de uma
variável, deve-se atribuir a propriedade de texto (.text property)
do campo de texto para a variável - se esta for uma variável
string - , ou o valor numérico convertido do texto, caso esta seja
uma variável numérica:
var
phone_str = phone_itxt.text;
// string
var houseNumber_n = Number(houseNumber_itxt.text);
// numérico
var sum_n = Number(a_itxt.text) + Number(b_itxt.text); //
numérico |
Converter
os conteúdos de um campo de texto para um valor numérico
com a função Number é especialmente importante quando
alguém quer fazer uma operação de adição
numérica utilizando os conteúdos do campo de texto - caso
não seja feita a conversão, o Flash interpretará
o "+" como a concatenação de duas seqüências
(strings) ao invés da adição de dois números.
O
que é var
Cada
uma das declarações acima começam com a palavra chave
"var". Isto declara a variável como local dentro de qualquer
função que resida, se ela reside em uma função.
Isto é, nada fora da função pode ver, ou acessar
o valor daquela variável. Declarar variáveis locais é
um bom hábito porque ela capacita ao Flash encontrar mais eficientemente
a variável - ela pesquisa dentro da função somente
e não tem que olhar em mais lugar algum para encontrá-la.
Ela também ajuda a prevenir mudanças acidentais de variáveis
com o mesmo nome fora da função. Declarações
Var podem ser feitas em muitas variáveis a um só tempo no
início da função. Como:
| var
i, name_str, names_arr; |
ou
elas podem ser declaradas em código na primeira vez que lhes atribuirmos
um valor, como acima. Aqui está um exemplo que mostra aquelas variáveis
declaradas com var (neste caso, variáveis things_arr) e que não
são acessíveis diretamente fora da função:
function
getFirst() {
var things_arr = ['house','frog','branch'];
return things_arr[0];
}
trace(getFirst()); // house
trace(things_arr[0]); // undefined |
mas,
se você remover o var da declaração em getFirst, o
segundo traço retornará "house".
Tipos
de dados estruturados
O
Flash fornece duas úteis estruturas variáveis, matriz (array)
e objeto. Você pode criar uma matriz vazia ou objeto e adicionar
elementos/propriedades depois, ou criar a estrutura ou objeto e atribuir
todos os valores em uma instrução:
Para
criar uma matriz (array)
Qualquer
destas instruções funcionará para criar uma matriz
(um objeto do tipo matriz):
var
names_arr = new Array(5);
var names_arr = [];
var names_arr = ['Frank', 'Lisa', 'Steve']; |
A
primeira instrução diz criar uma nova matriz com 5 elementos,
mas não atribui qualquer valor àqueles elementos. A segunda
instrução cria uma nova matriz em branco de comprimento
0. A terceira cria uma matriz com 3 elementos que têm valores. Propriedades/métodos
úteis das matrizes incluem .length (comprimento), .push (adiciona
elementos), .pop (remove elementos), e .splice (adiciona e remove elementos).
Mais sobre matrizes pode ser encontrado na(s) página(s) sobre array
object.
Para
criar um objeto
Quaisquer
das seguintes instruções funcionará para criar uma
variável objeto (um objeto do tipo Objeto):
var
people_obj = new Object();
var people_obj = {};
var people_obj = {name:'Jane', dob:'2/3/1988', imname:'dancer7938'}; |
As
duas primeiras instruções acima são idênticas;
elas criam um novo objeto people_obj sem propriedades. As propriedades
podem ser adicionadas mais tarde por simples determinação,
assim: people_obj.name="Jack". Alternativamente, as propriedades
podem ser atribuídas quando o objeto é criado, como na terceira
instrução acima. As propriedades dos objetos podem ser acessadas
ou via sintaxe ponto, como em people_obj.name, ou via sintaxe de matriz
associativa, como em people_obj["name"]. Todos os objetos incorporados
no Flash são subclasses da classe Objeto - mais informações
sobre objetos incorporados podem ser encontradas na página Objetos
e classes, e informações sobre como acessar objetos,
ou por sintaxe ponto ou por sintaxe de estrutura associativa podem ser
encontradas na página Endereçamentos.
(Todos os objetos podem ser endereçados do mesmo modo como descrito
na página sobre endereçamento).
Criar
um objeto de uma classe predefinida
O
Flash MX (e o Flash 5) vêm com um número de classes predefinidas,
isto é, classes que podem ser usadas para determinar certas propriedades
e métodos predefinidos a um objeto daquela classe. Data, Cor, Estrutura,
e Som são exemplos dessas classes. Para criar uma instância
de uma classe, utilize o operador "new", como foi feito acima
para a criação de estrutura e objeto. Por exemplo, para
criar a variável wedding_date, uma instância da classe Data:
| var
wedding_date = new Date(1985,9,15); |
Criar
um objeto personalizado
Em
adição para criar novas instâncias de objetos incorporados
com o operador "new", você pode também definir
sua própria classe, com quaisquer propriedades e métodos
que ela necessite, e criar novas instâncias dela. Aqui está
um exemplo bobo (mas que ilustra o conceito e o método) que cria
uma classe Titulos e duas instâncias dela. Cada instância
chama o método makeGreeting de Titulos para criar um string de
saudação:
|
//
função construtora para a classe Titulos
// m = titulo masculino, f = titulo feminino, isBefore = indica
valor booleano
// se o titulo aparecer antes ou depois do nome da pessoa
function Titles(m, f, isBefore) {
this.m = m;
this.f = f;
this.isBefore = isBefore;
}
// métdo makeGreeting para a classe Titulo
// retorna uma string com o titulo e o nome anexados na ordem correta
Titulos.prototype.makeGreeting = function(name_str, gender_str)
{
if (this.isBefore) {
return (gender_str.toLowerCase()=='f'
? this.f : this.m) + ' ' + name_str;
} else {
return name_str + ' ' + (gender_str.toLowerCase()=='f'
? this.f : this.m);
}
}
//
criando instâncias da classe
var engFamTitles = new Titulos("Uncle", "Aunt",
true);
var chiFamTitles = new Titulos ("shushu", "ayi",
false);
//
usando um método da classe para fazer alguma coisa nas duas
instâncias
trace(chiFamTitles.makeGreeting("Zhao", "f"));
// Zhao ayi
trace(engFamTitles.makeGreeting("Joe", "M"));
// Uncle Joe
|
Criar
uma matriz de objetos
Um
exemplo final que usa uma combinação de duas matrizes: uma
das mais úteis estruturas para lidar com conjuntos de registros
(recordsets) retornados de um banco de dados é com uma matriz de
objetos, onde cada elemento da matriz representa um registro, e cada propriedade
do objeto é um campo no registro. Aqui está um exemplo de
uma dessas estruturas sendo usada para conter n registros retornados via
um objeto
LoadVars (o método usual para se comunicar com um código
server-side com acesso a conteúdos de bancos de dados do Flash
MX), onde os campos são retornados com um registro indexado - 0,
1, 2, etc - anexados a cada nome de campo:
|
this.data_lv.onLoad
= function() {
// for each record returned:
for (var r=0; r < this.n; r++) {
// create a new element of array content_arr
// (content_arr is a property of the recordset
object (this.owner))
// each element of content_arr is an object representing
one record
this.owner.content_arr.push(new Object());
// for all fields in the record:
// (fields_arr holds definitions of each field
in the table)
for (var f=0; f < this.owner.fields_arr.length;
f++) {
var field_str
= this.owner.fields_arr[f].name;
// get name
of returned variable (=field name + index)
// assign
to same named property of content_arr[r]
this.owner.content_arr[r][field_str]
= this[field_str + r];
}
}
}
|
Um
exemplo mais simples da utilização de uma matriz de objetos
pode ser encontrado aqui.
Tradução
Sergio Ramalho
|