Flash 为什么Font.registerFont在第二次加载swf时抛出错误?

Flash 为什么Font.registerFont在第二次加载swf时抛出错误?,flash,actionscript-3,flash-cs5,tlf,Flash,Actionscript 3,Flash Cs5,Tlf,我发现在运行时使用TLFTextfields和共享字体时存在一个问题(在flashcs5中),我想知道是否有人有解决方案 下面是一个场景 Fonts.swf:字体库(运行时) 共享DF4) Popup.swf:带有 TLFTextfield(其中包含文本)使用 来自Fonts.swf的字体 Main.swf: 主swf带有一个按钮,用于加载和 卸载Popup.swf(使用加载器或 给同样的 结果) 又好又简单 运行main.swf,单击按钮,弹出窗口显示文本。再次单击按钮以删除弹出窗口。一切

我发现在运行时使用TLFTextfields和共享字体时存在一个问题(在flashcs5中),我想知道是否有人有解决方案

下面是一个场景

  • Fonts.swf:字体库(运行时) 共享DF4)
  • Popup.swf:带有 TLFTextfield(其中包含文本)使用 来自Fonts.swf的字体
  • Main.swf: 主swf带有一个按钮,用于加载和 卸载Popup.swf(使用加载器或 给同样的 结果)
又好又简单

运行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]
我认为这是因为字体已经注册(在加载之前单击时选中)

有人知道如何克服这一点吗

如果你想知道这是我的主要观点

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);
        }

    }
}
包
{
导入fl.controls.Button;
导入flash.display.Loader;
导入flash.display.Sprite;
导入flash.events.Event;
导入flash.events.IOErrorEvent;
导入flash.events.MouseEvent;
导入flash.events.UncaughtErrorEvent;
导入flash.net.URLRequest;
导入flash.text.Font;
公共类Main扩展了Sprite
{
公共var testpopuptn:按钮;
受保护的var加载程序:加载程序;
公共功能Main()
{
跟踪(“Main.Main()”);
testpopubtn.label=“打开”;
TestPopuptn.addEventListener(MouseEvent.CLICK,testClickHandler);
}
受保护的函数testClickHandler(事件:MouseeEvent):void
{
跟踪(“Main.testClickHandler(事件)”;
if(装载机)
{
testpopubtn.label=“打开”;
此.removeChild(装入器);
//loader.unloadendstop();
加载器=null;
}否则{
testpopubtn.label=“关闭”;
跟踪(“注册字体-->”;
变量字体:数组=字体。枚举字体(false);
对于每个(变量字体:字体中的字体){
跟踪(“\t”,font.fontName,font.fontStyle,font.fontType);
}

痕迹("要解决此问题,可以在Main.fla的第1帧中添加一个空的和/或不可见的TLFTextField,嵌入正在加载的字体。在库中,它可以链接到以前使用的同一font.swf,但该字体必须在主MovieClip中引用。从popup.fla库中删除字体,忽略expor这不是警告

另一种方法是将Font.swf加载(而不是动态链接)到主文件中,并通过手动调用Font.registerFont(myFont)来注册字体


无论哪种方式,将字体嵌入弹出窗口都会导致错误,但是在没有嵌入字体的情况下加载字体,并在Main.fla中注册这些字体就可以了。

为了解决这个问题,您可以在Main.fla的第1帧中添加一个空的和/或不可见的TLFTextField,嵌入正在加载的字体。在库中,它可以链接到以前使用的同一Font.swf,但必须在主MovieClip中引用该字体。请从popup.fla库中删除该字体,并忽略导出警告

另一种方法是将Font.swf加载(而不是动态链接)到主文件中,并通过手动调用Font.registerFont(myFont)来注册字体


无论哪种方式,将字体嵌入弹出窗口都会导致错误,但是在没有嵌入字体的情况下加载字体,并在Main.fla中注册这些字体就可以了。

您应该提供实际调用font.registerFont的部分代码。您发布的代码实际上没有显示任何有用的内容。实际上,我已经向r提供了所有代码复制错误。我怀疑是TLFTextfield创建导致了错误。不,你没有。Main.as中没有Font.registerFont。它位于Main时间线第12行的popup.fla中,因为你可以清楚地从你发布的错误消息中读取…我已经将其缩减到最基本的情况,Main.as是唯一的as。所有Popup.fla都是一个包含内容的TLFTextfield(如果为空,则不会出错)还有一个字体链接到font.fla.I明白了。我会尝试一下,然后再回复您。您应该提供实际调用font.registerFont的部分代码。您发布的代码实际上没有显示任何有用的内容。实际上,我已经提供了复制错误的所有代码。我怀疑是TLFTextfield创建导致了错误。No、 您没有。Main.as中没有Font.registerFont。它位于第12行Main时间线中的popup.fla中,您可以从发布的错误消息中清楚地看到……我已将其缩减为最基本的大小写,Main.as是唯一的as。popup.fla所具有的是一个包含内容的TLFTextfield(如果为空,则不会出错)和一个从font.fla.I看到链接的字体。我会尝试一下,然后再给你回复。发现如果你加载带有嵌入字体的swf,你不需要调用font.registerFont,但是你需要确保任何文本字段都是空的,否则字体会嵌入弹出窗口,你可能会丢失字形。发现你不需要调用font.regi如果在swf中加载嵌入字体,但需要确保任何文本字段都为空,否则字体将嵌入弹出窗口,并且可能会丢失字形。