Aqui tienes una clase que te har� el trabajo. Incluido el codigo de test. Ya
diras que tal te funcion�.
<code>
// Contructor:
// c: Cantidad de lineas que se quieren conservar
_global.TextBuffer = function(c){
this._buffer = new Array(c);
}
// Metodo que a�ade una linea de texto
// y devuelve en texto completo
TextBuffer.prototype.addLine = function(txt){
this._buffer.unshift(txt);
this._buffer.pop();
return this.getText();
}
// Metodo que a�ade texto multilinea,
// tambi�n devuelve el texto completo.
TextBuffer.prototype.addText = function(txt){
var lineas = txt.split("\n");
var c = lineas.length;
while(--c){
this.addLine(lineas[c]);
}
return this.getText();
}
// Metodo que obtiene el texto
TextBuffer.prototype.getText = function(){
return this._buffer.join("\n");
}
// Codigo de ejemplo
// Se crea una instancia
var chatBuffer = new TextBuffer(5);
// Se crea un texto de 6 lineas
var footext = "hola1\nhola2\nhola3\nhola4\nhola5\nhola6";
// Se a�ade al buffer y se muestra
chat_txt.text = chatBuffer.addText(footext);
</code>
un saludo
Joseba Alonso
www.sidedev.net
----- Original Message -----
From: "David Serrano" <[EMAIL PROTECTED]>
To: "'AS Nativos'" <[EMAIL PROTECTED]>
Sent: Wednesday, June 25, 2003 1:44 PM
Subject: [ASNativos] Contenido Textfield();
Buenos dias a todos/as.
Vamos a ver. Tengo un peque�o problema con una aplicaci�n Chat para
televisi�n.
Todo ello corre con XML Sockets. Una vez recibo un mensaje (no entrar� a
explicar como lo recibo, sino esto seria la biblia), lanzo un socket.
Cuando recibo el socket, lo incrusto en una caja de texto (el visor de
los mensajes). Esta caja de texto tiene un alto din�mico. El problema
est� cuando llevo muchos mensajes porque la caja de texto se va haciendo
cada vez m�s grande y el ordenador empieza a colapsarse.
La idea ser�a poder eliminar o vaciar el contenido parcial de esta caja
de texto cada cierto tiempo pero manteniendo la posici�n en que se
encuentra el texto que no quiero borrar.
Voy a poner un ejemplo:
Yo tengo una caja de texto y por encima tengo una mascara con un alto de
100 pixeles. Esta zona es la zona visible de los mensajes. La caja de
texto cuando recibe un mensaje nuevo se mueve hacia arriba, con lo que
los primeros mensajes que se han recibido y que estan por encima de la
mascara no se ven pero siguen estando residentes.
Cuando llevo 1000 mensajes en la caja de texto, los primeros 950 ya no
se ven, pero siguen estando en la caja de texto con la posterior
sobrecarga del ordenador (se cuelga el servidor). Por lo que
necesirtaria borrar los 900 mensajes primeros pero manteniendo la
posici�n de los mensajes que se estan viendo.Esto lo digo porque he
probado vaciar la caja de texto, pero entonces al vaciarla, la caja de
texto ya no est� colocada donde debiera y se descuanjiringa el invento.
Bueno, de momento posteo el c�digo para que veais mejor a lo que me
refiero:
En un mc de la encema principal:
this.createTextField("cajaTexto", 99, -295, 95, 300, 80);
//cajaTexto.border=true;
//Le indicamos que aumente su tama�o en funci�n de los
mensajes que llegan
cajaTexto.autoSize = true;
//lo dejamos de momento en blanco
cajaTexto.text = " ";
//embebemos la fuente para que se vea dentro de la m�scara.
//Si no se embebe no se ver�a el texto.
cajaTexto.embedFonts=true;
//declaramos un estilo del texto de cajaTexto.
estilo = new TextFormat();
//asignamos la fuente que hay en la librer�a
estilo.font = "embed";
//el tama�o de la fuente
estilo.size = 20;
//aplicamos el estilo.
this.cajaTexto.setTextFormat(estilo);
Ok, ahora en la escena principal tenemos:
if (objetohijo.nodeName == "SHOWMESSAGE") {
var posY = _root.cuadro.cajaTexto._y;
var mensaje;
//recogemos el nick o el n�mero de movil
nick5previo = ""+objetohijo.attributes.nick+"";
//si nick es un movil tendremos 12 caracteres, si nick es
texto nos llegan 8 caracteres como maximo.
if (nick5previo.length == 12) {
nick5 = "...
"+nick5previo.substr((nick5previo.length+1)-cifras, nick5previo.length);
} else {
nick5 = nick5previo;
}
//tenemos texto en vez de numeros
// para quedarnos con las 4 ultimas cifras
nick5 += " > ";
//Obtenemos el mensaje que nos llega de� XML
mensajeXML = objetohijo.attributes.text;
//mostramos el mensaje que nos llega en la caja del �ltimo
mensaje
_root.ultimMissatge.cajaChat = ""+nick5+mensajeXML+"";
//si es el primer mensaje que aparece no lo ense�amos en la
caja de texto de los mensajes, �nicamente en el �ltimo mensaje
if (primero) {
mensaje = "";
//nos guardamos el ultimo mensaje
para luego utilizarlo en la caja de los mensajes
primerMensaje =
_root.ultimMissatge.cajaChat;
_root, ultimMissatge.gotoAndPlay(1);
//ponemos a false para indicar que
ya ha pasado el primer mensaje
primero = false;
} else {
//aparece en el cuadro de mensajes
el mensaje guardado anteriormente
mensaje = primerMensaje;
//guardamos en primerMensaje el
ultimo mensaje recibido;
primerMensaje =
_root.ultimMissatge.cajaChat;
_root, ultimMissatge.gotoAndPlay(1);
}
//Indicamos el estilo de la fuente del recuadro
de texto de los mensajes. Hay que embeber las fuentes para que se vean
con las m�scara.
//Para embeber una fuente se tiene que agregar
una fuente en la biblioteca y hacer un linkage.
chat = new TextFormat();
chat.embedFonts = true;
chat.font = "embed";
chat.size = 20;
//le aplicamos el estilo a la caja de texto
_root.cuadro.cajaTexto.setNewTextFormat(chat);
//Este codigo sirve para cortar las frases
cuando lleguen al final del recuadro, cortando con un \n.
//El espacio m�ximo es de 65 caracteres.
//Miramos si el caracter 65(donde cortaremos) es
un blanco o no para indicarle si lleva gui�n o no para cortar.
if (mensaje.length>65) {
if (mensaje.charAt(65) != " ") {
//comprobamos
tambien el anterior para saber si despus de blanco viene una letra
if
(mensaje.charAt(64) != " ") {
mensaje1 = mensaje.substring(0, 65)+"-";
mensaje2 = mensaje.substring(65, 127);
} else {
mensaje1 = mensaje.substring(0, 65);
mensaje2 = mensaje.substring(65, 127);
}
} else {
trace(mensaje.charAt(64));
mensaje1 =
mensaje.substring(0, 65);
mensaje2 =
mensaje.substring(65, 127);
}
//Aqui miramos la segunda
linea en el caso de que la haya
if (mensaje.length>127) {
if
(mensaje.charAt(127) != " ") {
if (mensaje.charAt(126) != " ") {
mensaje3 = mensaje.substring(127, 180+"-");
mensaje = mensaje1+"\n"+mensaje2+"\n"+mensaje3;
}
else {
mensaje3 = mensaje.substring(127, 180);
mensaje = mensaje1+"\n"+mensaje2+"\n"+mensaje3;
}
}
//trace(mensaje);
//Si hay 3
linias el cuadro de texto se mueve 90 pixeles hacia arriba.
posY =
_root.cuadro.cajaTexto._y;
posTargetY =
posY-90;
} else {
//Si hay 2
linias, moveremos 67 pixeles la caja de texto.
mensaje =
mensaje1+"\n"+mensaje2;
posTargetY =
posY-67;
}
} else {
//Si solo hay una linia
la moveremos 45 pixeles.
posTargetY = posY-45;
}
//A�adimos a la caja de texto de los
mensajes el siguiente mensaje dejando 2 linias intermedias.
_root.cuadro.cajaTexto.text +=
"\n\n"+mensaje;
//Funcion de desaceleraci�n del
cuadro de texto.
_root.onEnterFrame = function() {
//indicamos la posicion
inicial del cuadro de texto.
_root.cuadro.cajaTexto._y
= posY;
//formula general de
desaceleraci�n.
//posY=posicion incial
//posTargetY=posicion
final.
posY -=
(posY-posTargetY)/4;
//trace("posicionY:
"+posY);
if
(Math.abs(posY-posTargetY)<0.1) {
//cuando
acaba el movimiento salimos del bucle.
this.onEnterFrame = undefined;
//numeroLinias = 1;
}
};
}
Bueno, a ver si a alguien se le ocurre alguna cosa.
Tambien habia pensado en hacer una caja de texto cada vez que reciba un
socket (mediante la creaci�n din�mica o mediante un attachMovie) pero
era para aprovechar el que tengo hecho y no tenerlo que rehacer entero.
P.D.: Luego os dir� en que programa sale este chat. JAJA.
David Serrano
<mailto:[EMAIL PROTECTED]> [EMAIL PROTECTED]
TVC Multimedia
<!-------------------------------
Lista ASNativos:
subscripciones/desubscripciones
http://www.sidedev.net/asnativos
-------------------------------->
<!-------------------------------
Lista ASNativos:
subscripciones/desubscripciones
http://www.sidedev.net/asnativos
-------------------------------->