Flex: Получить собственное имя SWF-файла?

Есть ли способ программно определить имя файла .swf, в котором работает мой класс?

Спасибо!


person JD Isaacks    schedule 22.12.2009    source источник


Ответы (5)


Stage имеет loaderInfo, которое содержит url, в котором содержится искомая информация. Вы можете получить свойство stage из любого объекта DisplayObject в Flex.

трассировка (стадия.loaderInfo.url);

person RJ Regenold    schedule 22.12.2009
comment
Спасибо .. Также я могу использовать Application.application.stage.loaderInfo.url, чтобы получить его из НЕ DisplayObject, также он дает ошибку, если вы пытаетесь получить к нему доступ до Application.CreationComplete. - person JD Isaacks; 23.12.2009
comment
Да, не похоже, что этап готов, пока не будет отправлено событие FlexEvent.APPLICATION_COMPLETE. - person RJ Regenold; 23.12.2009

Просто полезное замечание: если вы загрузите один SWF в другой, загруженный (внутренний) SWF вернет ошибочный результат, если вы используете loaderInfo.url, чтобы попытаться получить имя файла. Например, что-то вроде:

Path/To/Outer.swf/[[DYNAMIC]]/1

Вместо:

Path/To/Inner.swf

Остерегаться!

Тем не менее, вот код, который я использую для получения текущего имени SWF:

function SWFName(symbol:DisplayObject):String
{
    var swfName:String;
    swfName = symbol.loaderInfo.url;
    swfName = swfName.slice(swfName.lastIndexOf("/") + 1); // Extract the filename from the url
    swfName = swfName.slice(0, -4); // Remove the ".swf" file extension
    swfName = new URLVariables("path=" + swfName).path; // this is a hack to decode URL-encoded values
    return swfName;
}
person ivanreese    schedule 15.01.2012

Не изнутри flash, афаик. Для чего тебе это? Там может быть лучший способ сделать это.

person Jonatan Hedborg    schedule 22.12.2009
comment
Что ж, я создаю собственный класс Logger, который будет отправлять журналы в скрипт для сохранения. Я делаю это, чтобы повторно использовать этот класс в других проектах. Поэтому я хочу, чтобы класс мог автоматически определять, в каком проекте он работает, чтобы он также мог регистрировать это. - person JD Isaacks; 22.12.2009

Вы можете использовать loaderInfo.loaderURL, чтобы получить полный путь и имя вашего swf

Пример класса:

public class Main extends Sprite {
 private function init():void {
  removeEventListener(Event.COMPLETE, init);
  var myUrl:String=loaderInfo.loaderURL;
  var tmp:Array=myUrl.split("/");
  var myName:String=tmp[tmp.length-1].split(".swf")[0];
 }

 public function Main() {
  super();
  if (stage)
    init();
  else
    addEventListener(Event.COMPLETE, init, false, 0, true);
 }
}
person Patrick    schedule 22.12.2009

В более поздних версиях все немного изменилось, поэтому я дам ответ для Adobe Flash Builder 4.6 (ориентированный на Flash в браузере, но вы поняли идею).

<s:Application ... applicationComplete="alertSwfUrl()">

<fx:Script>
<![CDATA[
    import mx.core.FlexGlobals;

    private function alertSwfUrl():void {
        var a:LoaderInfo = FlexGlobals.topLevelApplication.stage.loaderInfo;
        ExternalInterface.call('alert', a.url); 
    }

]]>
</fx:Script>

</s:Application

Ознакомьтесь с документами LoaderInfo, чтобы понять как использовать объект loaderInfo, связанный с stage.

person Chris W.    schedule 15.06.2012