[flash AS2] utilisation de loadVariables ou loadVars

ccciolll

Membre expert
Club iGen
Bonjour,

j'ai lu l'aide de flash au sujet de loadVariables mais je ne suis pas parvenu à faire fonctionner cet outil.

Il est probable que ce que je veux faire ne soit pas faisable, ou que je m'y prenne très mal…

J'ai lu aussi par ailleurs que loadVars est mieux que loadVariable mais j'ai encore moins bien compris ce qu'en disait l'aide…

Donc pour l'utilisation de loadVariable, j'ai tenté de procéder comme suit pour mon premier essai infructueux.

Création d'une fichier blublu.txt contenant le texte blublublo

Enregistrement de ce .txt en local

Dans mon flash, un bloc de texte dynamique que j'ai nommé Cibla

Dans l'actionScript de flash le code suivant pour tenter de récupérer le texte contenu dans blublu.txt et d'en faire une variable nommée Ciblou qui viendra se charger dans le bloc de texte Cibla…

Bloc de code:
loadVariables("file:/// [mon url locale] blublu.txt", Ciblou);  
Cibla = Ciblou ;

Enregistrement du swf en local aussi (dans le même dossier).

et hop, je lance le swf, mais rien ne se passe.

Autre tentative avec le code suivant :
Bloc de code:
loadVariables("file:/// [mon url locale] blublu.txt", target:Ciblou);  
Cibla = Ciblou ;

Là mon swf se met à clignoter.

---------- Nouveau message ajouté à 13h24 ---------- Le message précédent a été envoyé à 13h12 ----------

Je vais quand-même vous expliquer ce que je cherche à faire…

Bon, j'ai un flash existant. Dans ce flash, toute une liste de textes numérotés.

L'utilisateur tape un code (en fait un nombre entre 1 et 172) dans un champ sur le site, ce code est balancé dans le flash et le flash affiche le texte correspondant, dans un bloc texte dynamique nommé dtxt.

via le code ci-dessous dont je suis l'auteur (attention, c'est de la prog de malade :rose:)

Bloc de code:
if(c_code == 1)
	{
	dtxt += "le texte qui correspond au code 1";
	}

Et ça, donc, 172 fois (une fois pour chaque code quoi).

et dans plusieurs flash différents…

Et ces textes changent de temps en temps…

Avec mon niveau dans flash, je sais ouvrir ce .fla, modifier le contenu texte entre guillemets correspondant à un code, autant de fois que de flash différents, et tout remettre en ligne.

Donc je peux mettre à jour à chaque demande de modif de texte.

Mais je me dis, ce serait plus malin de dire aux différents flash d'aller chercher l'info dans un fichier txt (ou parmi 172 fichiers txt dont l'url sera déterminée par "un fixe + le code saisi par l'utilisateur", ce sera plus accessible à mon niveau de compétences…), et par la suite, je n'aurais à mettre à jour qu'un seul fichier txt plutôt que plusieurs fla/swf.

---------- Nouveau message ajouté à 15h13 ---------- Le message précédent a été envoyé à 13h24 ----------

Ah !

j'ai un début de résultat en suivant un code pêché sur un autre forum :

Bloc de code:
var getInfo:LoadVars = new LoadVars();
getInfo.onLoad = function(success)
{
if(success)
	{
	_root.MonTxtEssai2 = this.truc2;
	}
}
getInfo.load("blublu2.txt" );

Avec mon bloc texte dynamique nommé MonTxtEssai2

mon fichier txt nommé blublu2.txt contenant ceci
Bloc de code:
truc1=bouli&truc2=boulu
et rangé à la racine du flash

Dans mon flash, je vois s'afficher
Bloc de code:
boulu

Bon, je vais creuser ça pour essayer de le faire tourner en ligne, puis lui faire prendre en compte les données saisies par l'utilisateur, voire ensuite lui faire faire des modifs à la volée sur les variables importées (retours chariots, voyelles accentuées).

Je suis pas rendu, mais ça avance !
 
Hello,

j'ai repris mes recherches ce matin, et je me trouve à nouveau face à un problème.

J'ai voulu passer par une variable pour le remplissage des blocs texte, mais je n'y parviens pas.

Voici, ci-dessous, mon essai de code

Bloc de code:
var getInfo:LoadVars = new LoadVars();
getInfo.onLoad = function(success)
{
if(success)
	{
	var1 = this.truc1 ;
	vxt3 = this.truc3 ;
	}
}
getInfo.load("testloadvars.txt" );

var2 = "rempli en dur" ;
	

vxt1 = "texte 1 = " + var1 ;
vxt2 = "texte 2 = " + var2 ;
vxt3 = "texte 3 = " + var3 ;

Avec, évidemment, le fichier txt nommé testloadvars.txt et comportant ceci
Bloc de code:
truc1=Resultat1&truc2=Resultat2&truc3=Resultat3

Et le résultat à l'affichage est le suivant :

texte 1 = undefined
texte 2 = rempli en dur
Resultat3


De fait, cela me permet de constater plusieurs choses.

Avec texte 1 = undefined
je constate que la variable var1 n'a pas été remplie par le code var1 = this.truc1

Avec texte 2 = rempli en dur
je vérifie que ma façon d'utiliser les variables (var2 = qqchose, suivi de vxt2 = var2) fonctionne dans le cadre habituel.

Avec Resultat3
je constate 2 choses.
D'une part que le code vxt3 = this.truc3 rempli bien son office d'aller chercher "Resultat3" dans mon txt et de le coller dans la bloc dynamique.
Mais aussi que ce code semble avoir la priorité sur le code vxt3 = "texte 3 = " + var3 qui apparaît pourtant après.
(je m'attendais plutôt à lire texte 3 = undefined )

Là je suis donc perplexe.

Apparemment, ce this. , ici sous forme de code MaVariableBlocTexte = this.qqchose semble avoir une priorité absolue sur tout autre code MaVariableBlocTexte = qqchosetoutcourt.
Et à l'inverse, il n'a aucun effet sur une variable "libre".

Sauriez-vous m'expliquer pourquoi (et puis aussi comment contourner cela) ?
Je ne connais pas ce .this , mais apparemment il a des effets bien spécifiques.[

---------- Nouveau message ajouté à 09h48 ---------- Le message précédent a été envoyé à 09h37 ----------

Je continue mes tests. Toujours en m'inspirant de la discussion sur l'autre forum, j'ai tenté de changer ceci dans le code
Bloc de code:
trace (this.truc1) ;
[…]
vxt1 = "texte 1 = " + trace ;

Et résultat, , j'obtiens texte 1 = [type Function]

Gueu ?

bon, c'est pas par là qu'il faut creuser, quoi.

---------- Nouveau message ajouté à 09h52 ---------- Le message précédent a été envoyé à 09h48 ----------

Bon, je ne connaissais pas du tout cette fonction trace. Apparemment elle est censé laisser des traces (justement) dans le panneau de sortie (connaissais pas) quiand on va dans tester l'animation (connaissais pas non plus…)
Ben résultat, le panneau sortie est vide. Donc cette fonction trace, telle que je l'ai utilisée dans le code ci-dessus n'a aucun effet.

Misère…

---------- Nouveau message ajouté à 10h00 ---------- Le message précédent a été envoyé à 09h52 ----------

Ahah, on s'amuse !

Donc là je viens de tester avec les modifs suivantes
Bloc de code:
vxt3 = this.truc3 ;
[…]
var2 = vxt3 ;
[…]
vxt2 = "texte 2 = " + var2 ;

Et là, j'ai bien une réaction, mais surprenante.
J'obtiens dans mon bloc 2 texte 2 = vide3 ("vide3" étant ce que j'ai saisi dans le bloc texte pour pouvoir vérifier quand un bloc ne réagit pas du tout).

Donc on dirait que cette fonction this. a une action dans la 4eme dimension… Elle agirait plus tard dans le temps, quand le code a déjà été lu et activé dans ses autres fonctions…

Mince alors, là je suis totalement hors-jeu (vous aurez probablement compris, avec ma découverte en direct de la fonction trace que je ne suis pas un programmeur de métier…)

---------- Nouveau message ajouté à 10h17 ---------- Le message précédent a été envoyé à 09h48 ----------

Bon, d'après ce que je lis par ailleurs, la fonction loadvars a effectivement un délai d'exécution, et c'est ça qui me met dedans pour pouvoir récupérer et triturer l'extraction.

De fait, je suis maintenant à la recherche d'un code permettant d'imposer un délai d'attente à un point précis de mon code actionscript, si cela existe.

---------- Nouveau message ajouté à 10h57 ---------- Le message précédent a été envoyé à 10h17 ----------

Suite des évènements donc

Bon, je renonce pour le moment à régler ce problème de délai.

Malgré plusieurs codes pêchés ici, le seul résultat que j'obtiens, c'est un clignotement du swf qui affiche le même résultat que d'habitude, et toutes les 5 secondes le flash avant actionscript (vide1, vide2…) pendant une dixième de seconde…


J'attaque donc un autre point : j'avais indiqué que je voulais que l'utilisateur puisse saisir un code et que ce code serve à importer une portion de texte issue du fichier txt.

Donc j'ai d'abord cherché à déterminer le point de départ de la portion de texte à importer.

j'ai essayé avec les codes suivants
Bloc de code:
var1 = truc1
[…]
vxt1 = this.var1

puis avec

Bloc de code:
var1 = truc1
[…]
vxt1 = this.(var1)

mais dans les 2 cas ça le perturbe, il cherche var1 ou (var1) (enfin je suppose qu'il fait ça…) et ne le trouve pas, donc ça clignote.

Du coup, j'ai pris le problème dans l'autre sens, et avec le code

Bloc de code:
var1 = "testloadvars.txt" ;
[…]
getInfo.load(var1);

ça fonctionne, j'arrive à soumettre le loadvars à une variable (variable qu'il me reste à rendre accessible à l'utilisateur, mais ça je sais le faire).

Du coup, je pense que je vais plutôt travailler avec autant de fichiers txt que de codes, plutôt qu'avec un grand fichier txt rempli de codes.

Enfin, si j'y arrive, c'est pas encore gagné, je dois trouver le moyen de faire passer les voyelles accentuées et les retours chariot (pas encore testé). Et vu que je n'arrive pas à récupérer mes this. en variables pour les triturer, il va falloir que je trouve le moyen d'encoder ça pour que ce soit bon dès le premier coup…

Encore de la rigolade en perspective…

---------- Nouveau message ajouté à 11h42 ---------- Le message précédent a été envoyé à 10h57 ----------

Enfin une bonne nouvelle.

J'ai aisément trouver à faire en sorte de faire passer les voyelles accentuées et les retours chariot.

Pour les retours chariot, en fait, ben suffit de les saisir (j'avais pas encore essayé donc je craignais que ce soit compliqué) tout simplement…

et pour les accentuées, enregistrement en UTF-16 et ça roule.

Allez, là ça va être l'heure de manger, on reprendra la suite plus tard.
 
Dernière édition:
Bon, voilà, j'ai enfin un code qui fonctionne, même si ce n'est pas aussi performant que ce que je souhaitais.

J'arrive à lui faire sélectionner un fichier txt selon les infos entrées par l'utilisateur du site, et importer le contenu de ce fichier txt dans mon flash.
Le code est le suivant
Bloc de code:
var1 = "www.monsite.com/fichiertxt" + c_saisie_utilisateur + ".txt" ; // ici la saisie utilisateur détermine l'url exacte à télécharger

var getInfo:LoadVars = new LoadVars();
getInfo.onLoad = function(success)
{
if(success)
	{
	vxt1 = this.truc1 ;
	vxt2 = this.truc2 ;
	vxt3 = this.truc3 ;
	}
}
getInfo.load(var1);

Avec un fichier txt codé en UTF-16, je récupère les voyelles accentuées et les retours chariot.
Le fichier txt comportant le texte suivant
Bloc de code:
truc1=Résultat1&truc2=Résultat
2
avec
retours
chariot&truc3=Résultat3avec voyelles accentuées : çàæï

Et ça importe donc les 3 résultats dans les 3 blocs texte.

Cependant, 2 défauts persistent.
Défaut mineur : je n'ai pas la main sur les résultats importés pour les modifier (défaut mineur car il gère bien les voyelles accentuées et les retours chariot, chose dont je doutais et que j'espérais gérer de cette façon si besoin)
Défaut plus important : j'aurais souhaité, plutôt que la saisie utilisateur détermine l'url, qu'elle puisse déterminer le contenu après this.
Cela m'aurait permis de mettre tous mes résultats dans un seul fichier txt (et ce serait le code qui permettrait d'aller chercher le bon résultat) et ainsi n'avoir qu'un seul fichier txt. Au lieu de ça, je vais donc devoir créer autant de fichiers txt que de résultats.

Donc je fais tout de même un appel : si qqun a une idée qui me permettrait de laisser la variable après this. (dans mon exemple, truc1, truc2 et truc3) se déterminer par les infos saisies par l'utilisateur (injectées sous forme txt sous le nom c_saisie_utilisateur), ça serait parfait.
 
Finalement, une solution avec des xml (mais sans loadvars) m'a été proposée sur macbidouille