Я обнаружил проблему (во flash cs5) при использовании TLFTextfields и шрифтов, используемых во время выполнения, и мне было интересно, есть ли у кого-нибудь решение.
Вот сценарий.
- Fonts.swf: библиотека для шрифтов (время выполнения
расшарил DF4)
- Popup.swf: всплывающее окно с
TLFTextfield (с текстом в нем), используя
шрифт из Fonts.swf
- Main.swf:
Основной SWF с кнопкой, которая загружает и
выгружает Popup.swf (используя Loader или
SafeLoader дает то же самое
результаты)
Красиво и просто,
Запустите main.swf, нажмите кнопку и появится всплывающее окно с текстом. Нажмите кнопку еще раз, чтобы удалить всплывающее окно. Все хорошо, теперь нажмите кнопку еще раз, и я получаю следующую ошибку.
ArgumentError: Error #1508: The value specified for argument font is invalid.
at flash.text::Font$/registerFont()
at Popup_fla::MainTimeline()[Popup_fla.MainTimeline::MainTimeline:12]
Я предполагаю, что это происходит, потому что шрифт уже зарегистрирован (проверяется при нажатии перед загрузкой).
Кто-нибудь знает, как пройти через это?
Если вам интересно, вот мой Main.as
package
{
import fl.controls.Button;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.MouseEvent;
import flash.events.UncaughtErrorEvent;
import flash.net.URLRequest;
import flash.text.Font;
public class Main extends Sprite
{
public var testPopupBtn:Button;
protected var loader:Loader;
public function Main()
{
trace("Main.Main()");
testPopupBtn.label = "open";
testPopupBtn.addEventListener(MouseEvent.CLICK, testClickHandler);
}
protected function testClickHandler(event:MouseEvent):void
{
trace("Main.testClickHandler(event)");
if(loader)
{
testPopupBtn.label = "open";
this.removeChild(loader);
//loader.unloadAndStop();
loader = null;
}else{
testPopupBtn.label = "close";
trace("Registered Fonts -->");
var fonts:Array = Font.enumerateFonts(false);
for each (var font:Font in fonts) {
trace("\t",font.fontName, font.fontStyle, font.fontType);
}
trace("<--");
loader = new Loader();
loader.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);
this.addChild(loader);
try{
loader.load(new URLRequest("Popup.swf"));
}catch(e:*){
trace(e);
}
}
}
private function uncaughtErrorHandler(event:UncaughtErrorEvent):void
{
trace("Main.uncaughtErrorHandler(event)", event);
}
}
}