2009-10-28 3 views
4

내 친구와 채팅 중이 었는데,이 작업을 수행 할 수 있다고 확신하고 있습니다.하지만이 작업을 수행했다고 말하면 작동하지 않습니다.AS3 외부 클래스의 클래스 인스턴스화

전혀 가능할 지 궁금합니다. 외부에서 다운로드 한 SWF 내에 클래스를 입력 한 다음 인스턴스를 만들지 만 할 수는없는 var를 입력 해 보았습니다.

일부 코드

private static function onCompleteHandler(e:Event) {
dashboardObject = e.target.content;
// registerClassAlias("Dashboard",); doesnt work
var dash:Class = getDefinitionByName("Dashboard") as Class;
var myDash = new dash();
trace(myDash.show);
}

오류

ReferenceError: Error #1065: Variable Dashboard is not defined.
at global/flash.utils::getDefinitionByName()
at System$/onCompleteHandler()

는 그래서이 프로젝트 SWF 내에서 준수하지 않는 당신이 클래스의 인스턴스를 만들 수없는 것 같다. 사실이라면 내가 원하는대로 할 수 있습니다. 저는 사람들이 제 수업의 인스턴스를 만들어서 여기에 제작중인 SWF 파일을 다운로드하지 못하게하려고합니다.

감사

답변

0

는 그래서이 프로젝트 SWF 내에서 준수하지 않는 당신이 클래스의 인스턴스를 만들 수없는 것 같다.

시도해보십시오. ModuleLoader 클래스입니다. 모듈을 만드는 방법은 this 문서를 참조하십시오.

+0

나는 단지 그들이 쉽게 정적 클래스의 인스턴스를 만들 수 있기 때문에, 사람이나이 불가능하거나 아니었다면에 대해 많은으로 확인하고 싶었 변화는 오히려이 API 인 경우이를 변경하지 않은 것 바르 귀하의 건물, 그리고 귀하의 API에 사용하기 위해 그 특정 var가 공개되어야합니다. 이 기사는 내가 현재 다루지 않는 flex를위한 것 같다. 고맙습니다. – Chris

7

당신은 두 가지 작업을 수행해야합니다

  1. Dashboard에게 패키지 (package.to.Dashboard)을 얻었다. 패키지가없는 클래스에는 패키지가있는 클래스보다 다른 속성 (보호 된 네임 스페이스)이 제공되므로 외부 SWF에서 액세스 할 수 없습니다.
  2. 은로드 된 SWF는 그런 다음로드 된 SWF 및 new 반환 Class에서 getDefinitionByName을 사용할 수 있어야 부모

과 동일한의 ApplicationDomain에로드되어 있는지 확인합니다.

0

이렇게하려면 CASALib을 사용하는 것이 좋습니다. 런타임까지 클래스 이름을 모르는 전체 응용 프로그램을 만들었습니다. 필자는 가장 중요한 기능을 항상 사용할 수 있도록 몇 가지 인터페이스를 만들었습니다. LibraryManager이라는 CASALib 유틸리티에는 외부 SWF에서 클래스를 인스턴스화하는 기능이 있습니다.

0

이 작업을 수행 할 수 있습니다 : 현재의 SWF가 아닌 외부 국부 펀드에 의해로드 된 클래스에 대한

var dash:Class = Loader(e.target).contentLoaderInfo 
    .applicationDomain.getDefinition("Dashboard") as Class; 

getDefinitionByName() 작품. 외부 SWF의 경우 특정 swf를 실제로로드 한 로더 객체의 참조를 제공해야합니다.

또한 FlashBuilder에서이 작업을 수행하는 경우로드중인 SWF의 기본 응용 프로그램이 스프라이트 (또는 테스트하지는 않았지만 가능하면 MovieClip)인지 확인하십시오. 새로운 SWF 프로젝트 용으로 작성된 기본 MXML 파일을 사용하면 응용 프로그램이 아닙니다. 그렇지 않으면 위의 코드에서 찾고있는 클래스 정의를 찾을 수 없습니다.

3
var loader:Loader = new Loader(); 
var req:URLRequest = new URLRequest("foo.swf"); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, fooLoadComplete); 
loader.load(req); 


function fooLoadComplete(e:Event):void 
{ 
    var ClassDefinition:Class = e.target.applicationDomain.getDefinition("Symbol1") as Class; 
    var sym1:MovieClip = new ClassDefinition(); 

    this.addChild(sym1); 
} 
+0

새로운 것으로 발견 된 클래스 정의로 "sym1"을 인스턴스화하기 위해 movieclip으로 사용자 정의 클래스를 확장해야한다는 점을 제외하면 매력처럼 작동했습니다. 큰 문제는 아니지만 나중에 확장 기능/기능을 모두 액세스 할 수 있기 때문입니다. 또한 swf에서 포함 된 플래시 dev에에서 만든이 swf에서 공개 클래스를 얻으려면 나는 단순히 '메인'(주 비어 있지 않음) 클래스 이름을 넣어야했다. 그래서 컴파일러는 그 클래스를 포함했다. – CenterOrbit

+0

고마워. 이것은 위대한 일을했습니다. –

관련 문제