Olá pessoal. Este código que irei compartilhar aqui, surgiu de uma grande necessidade minha, e de uma forma bem simples, que seria apenas pesquisar meus MP3’s. Eu tinha uma lista em XML gerada por um programa de cadastro de cd’s, mas em algumas máquinas havia um bloquieo para instalar o programa, e então resolvi fazer a minha própria busca nesses XMLs.
Versão de AS: ActionScrip 2.0
Compatibilidade: Flash Player 6 ++
Dificuldade de produção: 6
Dificuldade de aplicação: 4
1º O código utiliza as classes XML, String, DataGrid e DataGridColumn, Array, e consiste na lógica abaixo:
– Existe um arquivo XML principal, que contém a lista dos outros XMLs a serem pesquisados. Esse XML é importado e armazenado em uma matriz (dbXmls) logo no início do filme.
– Ao clicar no botão de pesquisar, o AS constrói uma base de dados em uma matriz (dbDados).
– Sempre que efetuar uma pesquisa, o AS vê se a base já foi construída. Se não foi, a constrói, e caso contrário, já parte para a busca.
2º Código do primeiro frame:
//cria variáveis
var xmls:XML = new XML();
xmls.ignoreWhite = true;
var dbXmls:Array = new Array(); //neste array ficarão a referencia aos xmls
var dbDados:Array = new Array(); //aqui ficarão os dados
var criados:Object = new Object(); //objeto que verá se o xml já foi criado no dbDados
//carrega a lista de xmls no dbXmls
xmls.onLoad = function() {
for (i=0; i<xmls.childNodes[0].childNodes.length; i++) {
dbXmls.push(xmls.childNodes[0].childNodes[i].childNodes);
}
nextFrame();
};
//manda carregar a lista
xmls.load("xml/MP3s.xml");
//prototype replace
String.prototype.replace = function(orig, replac, z) {
var dbLetras:Array = this.split('');
var dbSubs:Array = replac.split('');
if (orig.length>1) {
var strRep = dbLetras.join('');
while (strRep.indexOf(orig)>=0) {
var ind = this.indexOf(orig);
var strAdd = dbSubs.join('');
dbLetras.splice(ind,orig.length,strAdd);
strRep = dbLetras.join('');
}
} else {
if (z == undefined) {
z = this.lastIndexOf(orig);
}
for (var i = 0, n = 0; i<dbLetras.length && n<z; i++) {
if (dbLetras[i] == orig) {
dbLetras[i] = replac;
n++;
}
}
}
return dbLetras.join('');
};
stop();
3º Código do segundo frame
//importando classes
import mx.controls.gridclasses.DataGridColumn;
//função de adição
var keyw:String = new String();
var dbResults:Array = new Array();
var xmlResult:XML = new XML();
var myDataGrid:mx.controls.DataGrid;
xmlResult.ignoreWhite = true;
var ini = 0;
var atual;
var arraysCriados:Boolean = false;
var numResults;
//ação do botão que inicia a busca
search.onRelease = function() {
if (keyword.text == "") {
//se não tiver digitado nada, avisa
labelText = "Informe uma palavra para busca...";
} else {
//manda construir o array de dados
construirArray();
}
};
String;
function limpaDataGrid() {
myDataGrid.removeAll();
// removeItemAt
}
//função que grava os registros
function Buscar(keyw) {
labelText = "Realizando busca...";
arraysCriados = true;
//trace("Estou procurando por "+keyw);
//reseta busca anterior
limpaDataGrid();
numResults = 0;
//loop nos xmls
for (i=0; i<dbDados.length; i++) {
for (j=0; j<dbDados[i].length; j++) {
//search String
var searchString = dbDados[i][j][0].toString().toUpperCase();
keyw = keyw.toUpperCase();
var searchCD:String = dbXmls[i].toString();
searchCD = searchCD.replace(".xml", "");
//procurando
if (searchString.indexOf(keyw)>=0) {
//trace("Achamos: "+searchString);
var item_obj:Object = {Arquivo:searchString, CD:searchCD};
myDataGrid.addItem(item_obj);
numResults++;
}
}
}
labelText = "Foram encontrados "+numResults+" resultados.";
}
//função contruir arrays
function construirArray() {
//se o array de dados não foi criado
if (!arraysCriados) {
//avisa que está construindo
labelText = "Contruindo base de informações. Aguarde...";
//verifica se a referência foi criada
if (criados[ini] != true) {
//se não, cria
criaArray(ini);
}
//passa valores
atual = ini;
ini++;
} else {
//se tiver todos criados, efetua a busca
Buscar(keyword.text);
}
}
//função que cria um array com resultados
function criaArray(a) {
//cria um array na posição do dbDados
dbDados[a] = new Array();
criados[a] = true;
//carrega o xml correspondente
//trace("Carregando "+dbXmls[a]);
xmlResult.load("xml/"+dbXmls[a]);
}
//função de onload
xmlResult.onLoad = function(a) {
//faz o loop e armazena
for (j=0; j<xmlResult.childNodes[0].childNodes.length; j++) {
//cria um novo subarray
dbDados[atual][j] = new Array(xmlResult.childNodes[0].childNodes[j].childNodes.length);
//verifica quantos campos e faz um loop para armazenar o conteúdo
for (a=0; a<xmlResult.childNodes[0].childNodes[j].childNodes.length; a++) {
dbDados[atual][j][a] = xmlResult.childNodes[0].childNodes[j].childNodes[a].childNodes;
}
}
//verifica se já carregou tudo
if (ini<dbXmls.length) {
//se não, manda construir o proximo
construirArray();
} else {
//se sim, seta a variavel de criação como true e manda buscar
arraysCriados = true;
Buscar(keyword.text);
}
};
//construção do dataGrid
function construirDataGrid() {
var coluna_arquivo:DataGridColumn = new DataGridColumn("Arquivo");
coluna_arquivo.width = 450;
var coluna_cd:DataGridColumn = new DataGridColumn("CD");
coluna_cd.width = 140;
myDataGrid.addColumn(coluna_arquivo);
myDataGrid.addColumn(coluna_cd);
}
construirDataGrid();
4º As funções:
Buscar() – Efetua a busca da palavra chave no array dbDados.
construirArray() – Função que constrói o dbDados.
criaArray(a) – Cria uma nova matriz correspondente ao cd, dentro de dbDados.
construirDataGrid() – Construção das colunas do dataGrid.
limpaGrid() – Limpa o dataGrid para a próxima pesquisa.
NOTAS FINAIS
– Você pode fazer o download dos arquivos clicando aqui.
– Visite o meu blog, ou acesse o fórum iMasters para postar alguma dúvida.
Abraços.