[FLASH 8] TextField "déroulant" - Bug affichage
Salut,
Jeu concours : Trouvé le bug
Récompense : Ma reconnaissance, car je deviens fou :P
Mon problème : Je dois faire apparaitre un texte lettre après lettre. Jusque là pas de problème. Le problème vient du fait que ce texte doit activer le html pour la mise en forme. Et là, pb.
Si je crée mon champs texte dynamiquement , cela ne marche pas : l'affichage ne correspond pas à la demande. Si le textField est créé dans l'IDE cela marche.
Une fois que l'affichage a buggué, impossible de le refaire marcher même en forçant à la fin le htmlText :(
Voilà mon code (La fonction recontituant l'html peut - doit même - être améliorée , optimisée mais là n'est pas la question. Enfin je crois)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
| /* Fonction qui coupe une chaine html qui reconstitue la struture html pour qu'elle soit cohérent */
/* sText_ : Texte à couper */
/* nIndex_ : (nIdex_)ieme caractère de la chaine où il faut couper la chaine */
function cutAt(sText_:String , nIndex_:Number):String {
var sTemp:String = (sText_.charAt(0) == "<") ? sText_ : ("<p>"+sText_+"</p>");
var aOpened:Array = new Array();
var bInTag:Boolean = false;
var bOpened:Boolean = false;
var nCount:Number = 0;
var sTag:String = "";
var sWord:String = "";
var sResult:String = "";
for(var i:Number = 0; i < sTemp.length; i++) {
var sChar:String = sTemp.charAt(i);
if(nCount < nIndex_) {
switch(sChar) {
case "<" :
sResult += sWord;
sWord = "";
sTag = "";
bInTag = true;
bOpened = (sTemp.charAt(i+1) != "/");
break;
case ">" :
if(bOpened) {
if(sTag.toUpperCase() != "BR") {
var aTag:Array = sTag.split(" ");
aOpened.unshift(aTag[0].toString());
}
}
else {
var n:Number = 0;
var cpt:Number = 0;
while((n == 0) && (aOpened.length > 0)) {
cpt++;
var sClosedTag:String = sTag.substr(1, sTag.length-1);
if(aOpened[n].toString() == sClosedTag) {
aOpened.shift();
n++;
} else {
aOpened.shift();
}
}
}
bInTag = false;
sResult += "<" + sTag + ">";
break;
default :
if(bInTag) {
sTag += sChar;
} else {
sWord += sChar;
nCount++;
}
break;
}
} else {
sResult += sWord;
i = sTemp.length;
while (aOpened.length != 0) {
var sCurrentTag:String = aOpened[0].toString()
if(sCurrentTag.toUpperCase() != "BR") {
sResult += "<" + aOpened[0] + "/>";
} else {
sResult += "</" + aOpened[0] + ">";
}
aOpened.shift();
}
}
}
return sResult;
}
/* Retoune le nombre de caractères "non html" de la chaine */
function getNoHtmlCharactersNumber(sText_):Number {
var sTemp:String = (sText_.charAt(0) == "<") ? sText_ : ("<p>"+sText_+"</p>");
var bInTag:Boolean = false;
var nResult:Number = 0;
for(var i:Number=0; i<sTemp.length; i++) {
var sChar:String = sTemp.charAt(i);
switch (sChar) {
case "<" :
bInTag = true;
break;
case ">" :
bInTag = false;
break;
default :
if(!bInTag) nResult++;
break;
}
}
return nResult;
}
var s:String = "<p>Mais pourquoi cela <b><i>ne</i> marche <i>pas</i></b> ???<br>Est-ce un <b><u>bug</u><b> ?</p>";
var tf:TextField = this.createTextField("tf", 0, 20, 20, 200, 50);
var tfMax:TextField = this.createTextField("tfMax", 1, 20, 100, 200, 50);
tf.html = tfMax.html = true;
tf.multiline = tfMax.multiline = true;
var nCpt:Number = 0;
var nCptMax:Number = getNoHtmlCharactersNumber(s);
this.onEnterFrame = function() {
tf.htmlText = cutAt(s, ++nCpt);
if(nCpt == nCptMax) {
delete this.onEnterFrame;
tfMax.htmlText = cutAt(s, nCptMax);
tf.htmlText = tfMax.htmlText;
}
} |
Quelqu'un peut m'aider ?
:merci: d'avance