Forums Développement Multimédia

Aller au contenu

Conversion contenu d'une variable String en contenu de tableau ✔

as3 String Array conversion CODE Actionscript

11 réponses à ce sujet

#1 Gouj

    Ceinture Jaune

  • Members
  • PipPip
  • 26 messages

Posté 14 May 2013 - 13:53 PM

Bonjour à vous amis développeurs Mediaboxeurs !

Je viens vers vous car je recherche désespérément une solution à mon problème ...

En gros : je cherche à remplir une datagrid avec un tableau rempli grâce à une variable string (généré par un "moteur de recherche maison" dans lequel j'ajoute les "{" nécessaire à la mise en forme du tableau) mais cela ne marche par comme je souhaiterai...

le resultat de mon "moteur de recherche" me donne une variable string en séparant et encadrant les réponses par "{}" et","...

Pour résumer j'ai une boucle qui créer une liste (dans une fonction search) :


aList.push("{"+"ID:\""+ node.@id.toString()+"\"","Nom:\""+ node.@nom.toString()+"\"}" );
 

En suite, je récupère le résultat dans une variable que j'insère dans un tableau qui renseigne la datagrid:


//récupère le résultat de la recherche et le stock dans la variable
var contenu_tableau = search(xmlData, mots_cherche).toString();

//création d'un tableau pour afficher le réulstat dans la datagrid(myDG)
var tableau_result:Array = new Array();
tableau_result = [contenu_tableau];


// Affichage dans DATAGRID
myDG.dataProvider=new DataProvider(tableau_result);
 

Quand je trace ma variable (contenu_tableau) donne le résultat suivant :
{ID:"2",Nom:"TEST2"},{ID:"4",Nom:"TEST4"},{ID:"5",Nom:"TEST5"},{ID:"6",Nom:"TEST6"}

le Problème c'est que ma datagrid affiche qu'une cellule contenant le text ci dessus avec les "{" ... alors que j'aimerai avoir une mise en forme sur plusieurs lignes et colonnes ex :


import fl.data.DataProvider;
// TEST CRéation du résultat de la recherche en forme
var tableau_result:Array = new Array();
tableau_result = [{ID:"2",Nom:"TEST2"},{ID:"4",Nom:"TEST4"},{ID:"5",Nom:"TEST5"},{ID:"6",Nom:"TEST6"}];
myDG.dataProvider=new DataProvider(tableau_result);
 


Je pense que le problème viens du fait que ma variable est une chaine de caractères mais je n'arrive pas à trouver le moyen pour la convertir en "code exploitable"

pour info j'ai testé .split() cela divise effectivement ma chaine mais ne créé pas des lignes avec 2 colonnes ... j'ai également trouver un forum où des personnes parlaient de "as array" mais j'ai pas réussi à l'utiliser...

Si quelqu'un peut m'aider dans cette "conversion"...


Merci d'avance :D!

#2 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6997 messages

Posté 14 May 2013 - 14:18 PM

Salut,

J'utilise peu les dataGrid, mais selon l'aide de Flash (http://help.adobe.co...ml#dataProvider) tu devrais ajouter individuellement chaque élément avec :
myDG.addItem( { ton élément } );

Dans ce cas essayes avec une boucle sur ton tableau :


var tableau_result:Array = [{ID:"2",Nom:"TEST2"},{ID:"4",Nom:"TEST4"},{ID:"5",Nom:"TEST5"},{ID:"6",Nom:"TEST6"}];
var dp:DataProvider =new DataProvider();

for (var i:int = 0; i<tableau_result.length; i++){
    dp.addItem (tableau_result[i]);
}
 

Je ne sais pas si ça va t'aider mais bon c'est une piste.

#3 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 14 May 2013 - 14:40 PM

Bonjour Gouj

Pour moi, ton souci est d'avantage un problème de construction des données zentrantes, donc en amont d'AS3.
Soit tu peux arriver à ton programme avec une liste déjà structurée, comme un xml, un tableau ou un objet, soit tu dois à un moment "parser" cad tronçonner à la main ta variable string. Ça veut dire que tu dois assurer la correspondance des éléments ID et Nom. Par contre, "ID" et "Nom" ne doivent pas apparaître dans le String.
:-/ Je ne suis pas du tout sûr d'être complètement clair.

En fait, tu dois à un moment construire un objet avec des propriétés ID et Nom et tu ne peux pas faire ça avec tout dans la même chaîne de caractères.
NB : peut-être que quelqu'un arriverait à le faire avec la syntaxe à crochet (j'en doute quand même un peu) mais de toute façon ça ne serait ni simple, ni propre…

Le mieux, c'est peut-être de te proposer une autre forme de stockage de tes infos.

Pour la construction de la liste en String, je te propose d'utiliser 2 séparateurs.
J'ai choisis :
- le pipe "|" pour séparer les éléments
- la virgule "," pour séparer l'ID et le Nom
ça peut être d'autres séparateurs, du moment qu'ils n'apparaissent pas dans la valeur des attributs, évidemment.
Utiliser un seul séparateur plutôt qu'un ouvrant et un fermant comme tu le fais avec "{" et "}" permet d'être plus efficace ensuite.

Avec ton exemple et les séparateurs que j'ai choisis, ça donne ça :
"2,TEST2|4,TEST4|5,TEST5|6,TEST6"

Si là, c'est clair pour toi, après c'est tout simple. :-)

Tu utilises .split("|") pour récupérer un tableau des d'éléments
Pour chaque String composant ce tableau, tu utilises .split(",") pour récupérer les propriétés.
Si tu bosses proprement, tu sais que la propriété en [0] est l'ID et celle en [1] est le Nom.
Tu n'as plus qu'à ajouter proprement l'item au dataProvider…

Si ça parait encore trop flou, voilà un petit exemple :
// Imports écessaires
import fl.controls.DataGrid;
import fl.controls.dataGridClasses.DataGridColumn;
import fl.data.DataProvider;

// Construction du dataProvider et liaison avec le dataGrid
var dp:DataProvider = new DataProvider();
var dg:DataGrid = new DataGrid();
var c1:DataGridColumn = new DataGridColumn("ID");
var c2:DataGridColumn = new DataGridColumn("Nom");
dg.addColumn (c1);
dg.addColumn (c2);
dg.dataProvider = dp;
dg.setSize (200, 160);
dg.move (10, 10);
addChild (dg);

// On est prêt
// On peut manipuler le dataProvider

// Exemple d'ajout d'une liste via un String
var string:String = "2,TEST2|4,TEST4|5,TEST5|6,TEST6";
ajouter_liste (string);

// La fonction qui découpe chaque élément
// puis l'ajoute au dataProvider
function ajouter_liste (liste:String):void
{
  for each (var element:String in liste.split("|"))
  {
   var proprietes:Array=element.split(",");
   dp.addItem ({ID:proprietes[0],Nom:proprietes[1]});
  }
}


#4 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 14 May 2013 - 14:45 PM

NB Mr Spi : en fait, on pourrait utiliser addItems pour les ajouter en une seule fois… théoriquement.
Sauf qu'on ferait quand même une boucle pour ajouter les objets à un tableau, puis on ajouterais le tableau.

Peut-être que ça a un intérêt de rapidité si on a énormément d'éléments.
Sinon, c'est évidemment plus simple de faire un addItem dans la boucle.

#5 Gouj

    Ceinture Jaune

  • Members
  • PipPip
  • 26 messages

Posté 14 May 2013 - 16:00 PM

Merci pour ces infos,

en gros la conversion dont j'ai besoin est réalisable grace à une boucle à "double split" (pour synthétiser)

mais j'ai une petite question car je suis sur le principe d'un petit moteur de recherche :

- si l'utilisateur lance sa première recherche : no problème, les résultats vont s'afficher les uns en dessous des autres puis quand l'utilisateur va relancer une recherche avec additem les nouveaux résultat vont s'afficher en dessous des résultat précédent non ?

je suppose dans ce cas,qu'avant de lancer mon process de recherche dans mon xml je doit faire un

dp.removeAll()
? ou ce n'est pas la bonne solution ?


Autre interrogation pour la suite de mon projet :

- pour finaliser le petit moteur de recherche je souhaiterai que lorsque l'utilisateur clique sur une "réponse à sa recherche" cela ouvre la page internet concerné :

imaginons que mon tableau est 3 colonnes(ID,Nom,url) dont seulement 2 visibles(ID, Nom)

ma variable string aurai donc cette tronche : 2,TEST2,http://test2.fr|4,TEST4,http://test4.fr|5,TEST5http://test5.fr|6,TEST6,http://test6.fr

comment puis-je faire cela ??

Et encore merci pour vos réponses :D

#6 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 14 May 2013 - 16:40 PM

1
dp.removeAll me semble très bien

2
Tu peux rajouter autant de propriétés que tu veux, du moment que tu les sépares par une virgule*
Dans la fonction qui ajoute les éléments, tu rajoute juste une propriété url que tu renseignes avec l'indice [2] du tableau…
Pour l'affichage, tu n'ajoutes pas la colonne url au dataGrid, comme ça il ne l'affichera pas :-)
Après le clic, tu retrouves l'indice cliqué et tu utilises l'url fournie par le dataProvider…


(* A vérifier quand même que la virgule ne soit pas un caractère possible dans les url, je n'en ai aucune idée. Sinon, tu choisis un caractère plus adapté)

Fichier(s) joint(s)

  • Fichier joint  dg.fla   1.06 Mo   3 téléchargement(s)


#7 Gouj

    Ceinture Jaune

  • Members
  • PipPip
  • 26 messages

Posté 14 May 2013 - 17:00 PM

Merci dldler,

Mais comment je "retrouves l'indice cliqué et utilises l'url fournie par le dataProvider…" ?????

#8 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 14 May 2013 - 17:15 PM

Heu… là, je crois qu'il te manque un peu de bases.
Cherches un peu dans la doc ou sur google et si tu bloques sur quelque chose je serai heureux de te répondre.
Mais, je ne compte pas te donner le code tout fait :-)

En gros : pose un écouteur sur le datGrid, et dans la fonction associée :
- récupère l'index de l'élément sélectionné
- récupère l'url de cet élément du dataGrid
Et on peut faire les 2 en seul mouvement d'ailleurs…

#9 Gouj

    Ceinture Jaune

  • Members
  • PipPip
  • 26 messages

Posté 14 May 2013 - 17:21 PM

Ok je me renseigne et je reviens vers toi si besoin,

je n'avais pas encore chercher pour cette question ...

j'ai tenté le raccourci ^^

Encore merci bonne soirée

#10 Gouj

    Ceinture Jaune

  • Members
  • PipPip
  • 26 messages

Posté 15 May 2013 - 08:38 AM

En effet la fonction de clic pour renvoyer vers un lien n'était pas trop dure à trouver : event.target.selectedItem


voici le code :

//au clic renvoi vers l'url
          dg.addEventListener(Event.CHANGE, link_to_url)
          function link_to_url (event:Event){
         
           trace(event.target.selectedItem.link_url);
           navigateToURL(new URLRequest(event.target.selectedItem.link_url), "_blank");
         
          }
 

cela fonctionne masi ai-je la bonne solution ? sourtout pour l'event, CHANGE ??

Bonne journée à vous !

#11 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 15 May 2013 - 08:58 AM

:-)

Je valide. Simple et efficace.
Et pour le type d'événement, j'utiliserais aussi le CHANGE.

Bonne continuation.

#12 Gouj

    Ceinture Jaune

  • Members
  • PipPip
  • 26 messages

Posté 15 May 2013 - 10:22 AM

Merci pour ta validation

Encore merci pour votre aide !

bonne journée



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP