texto tamaño style para examples estilos cajas borde bootstrap ajustar flex flash actionscript-3 actionscript flex3

flex - tamaño - Flash TextField HTML-¿Cómo evito el diálogo de error para las imágenes que faltan?(Error#2044: IOErrorEvent no administrado:. text=Error#2035: URL no encontrada)



input sin borde bootstrap (7)

Estoy usando un control Flash TextField para mostrar algo de contenido HTML dentro de una presentación Flash que se mostrará en un gran kiosco con pantalla táctil. Desafortunadamente, si alguna etiqueta de imagen en el contenido HTML mostrado apunta a una imagen inexistente, se muestra un diálogo con el mensaje de error

Error #2044: Unhandled IOErrorEvent:. text=Error #2035: URL Not Found.

Estoy tratando de evitar que aparezca ese diálogo. La solución para cargar contenido a través de una clase de cargador es capturar IOErrorEvent.IO_ERROR , pero he intentado escuchar eso en el TextField, en el escenario, Main y loaderInfo en vano. He tratado de envolver todo en un try-catch, y eso tampoco funciona.

Aquí está el código simplificado que estoy usando para encontrar soluciones:

package { import flash.display.Sprite; import flash.errors.IOError; import flash.events.Event; import flash.events.IOErrorEvent; import flash.text.TextField; import flash.text.TextFieldType; public class Main extends Sprite { public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); var html:TextField = new TextField(); html.type = TextFieldType.DYNAMIC; html.multiline = true; html.htmlText = "Bogus image: <img src=/"foo.jpg/" />"; addChild(html); } } }

Editar: Y aquí está todo el código de trabajo.

Para el contenido dinámico y demás, por supuesto, necesitaría una lista de imágenes y una función para generar manejadores, etc.

package { import flash.display.Loader; import flash.display.Sprite; import flash.errors.IOError; import flash.events.Event; import flash.events.IOErrorEvent; import flash.text.TextField; import flash.text.TextFieldType; public class Main extends Sprite { public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); var html:TextField = new TextField(); html.type = TextFieldType.DYNAMIC; html.multiline = true; html.htmlText = "Bogus image: <img id=/"image/" src=/"foo.jpg/" />"; var loader:Loader = html.getImageReference("image") as Loader; if(loader){ loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function(e:Event):void { trace("Error loading foo.jpg!"); }); } addChild(html); } } }


Este es un problema que también estoy tratando: es una verdadera molestia. Realmente me gustaría poder atrapar todos los errores. Supuse que podrías decir ...

stage.addEventListener(IOError.IO_ERROR, myErrorHandler);

... pero eso no parece funcionar, como has señalado.

Tal vez pueda verificar para asegurarse de que el reproductor flash del quiosco no sea la versión de depuración. No creo que la versión de lanzamiento arroje los diálogos (podría estar mal).


Este es un problema genial

Tengo dos sugerencias.

1) No use TextField. Supongo que desarrollaste en Flash antes que Flex, como yo. Puede que ya sepas esto, pero tardé un tiempo en descubrirlo: el objeto TextField no está destinado a ser usado regularmente en Flex. Verifique esto desde la referencia del lenguaje Flex3:

La clase TextField se usa para crear objetos de visualización para la visualización y entrada de texto. Todos los campos de texto dinámicos y de entrada en un archivo SWF son instancias de la clase TextField. Puede usar la clase TextField para realizar el procesamiento de texto de bajo nivel. Sin embargo, en Flex, normalmente usa los controles Label, Text, TextArea y TextInput para procesar el texto.

Obviamente, no hay nada de malo con el uso de TextField, pero descubrí que cuando intento resolver problemas difíciles, es realmente útil hacer todo lo posible ''por el libro'' para eliminar las incógnitas (tanto como sea posible, al menos).

2) Creo que intentaría extender el componente de texto o bien crear un nuevo componente basado en texto. En este componente agregaría lógica para cargar e insertar imágenes en el objeto TextField. De esta forma, podría construir y validar fácilmente la cadena para insertarla en el objeto TextField antes de insertarla en el TextField.

Si logras que esto funcione, publícalo; podría usarlo yo mismo. :)


Puede agregar identificaciones a las imágenes

html.htmlText = "Bogus image: <img src=/"foo.jpg/" id="image" />";

Y luego configure el controlador IOErrorEvent para cada imagen en HTML

var loader:Loader = html.getImageReference("image") as Loader; if(loader){ loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, function(e:Event):void{}); }


¡Imposible! ¡El mismo problema si usa el cargador para cargar imágenes que no existen! Flex es un framework y la clase Image usa este objeto Flash Loader pero con muchas líneas de código (consulte la fuente de SwfLoader ...).

Puede verificar la URL de su imagen antes de establecer la propiedad htmlText o puede crear su propio componente para mostrar texto e imágenes.

¡No puedo creer que este error simple y estúpido aún no haya sido resuelto por Adobe!


Si hay una forma de utilizar los nuevos componentes FTE / TLF, hágalo. Adobe básicamente está dando la espalda a la antigua API TextField, y este mismo error es una razón por la que tuve que abandonar muchos proyectos y componentes en el pasado. Este error se produce y, básicamente, no se puede atrapar. Uno de los peores aspectos del trabajo Flash en mi opinión.

TLF aborda estos problemas y es mucho más fácil trabajar con ellos. Lo que tomaría días de experimentación en la antigua API ahora solo lleva unas pocas horas. He creado algunos editores de texto enriquecido en la nueva API y es TAN muy agradable de usar. Estaras contento de haberlo hecho :)


Pude detectar cuándo se cargó una imagen, pero creo que seguiré los consejos de TLF. de todos modos, si necesita saber, debe implementar un detector de eventos enter_frame en el Loader y verificar si el contentInfo en la propiedad bytes es Lenght, si la imagen no se ha cargado, la longitud es 0xffffffff, si la imagen se ha cargado, la longitud es el tamaño del archivo, y si hay un error, las propiedades de bytes son NULL.


var html:TextField = new TextField(); html.width=388.95; html.height=400; html.type = TextFieldType.DYNAMIC; html.multiline = true; html.htmlText = "Bogus image: <img id=''image'' src=''foo.jpg''/>"; var loader:Loader = html.getImageReference("image") as Loader; loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHan); function completeHan(e:Event){ addChild(html); } This will work..