본문 바로가기

인사이드RIA/인사이드플렉스

swfLoader 에서 n 개의 챠트 호출시에 오류현상

반응형
application 이나 component 에서 swfLoader 를 사용하여 swf 를 호출하는 경우
모든 케이스가 테스트된것은 아니지만 chartBase 컴포넌트를 사용하는 swf 가 n 개 이상 있는 경우
런타임 에러가 발생합니다.

(아래 오류는 중복된 챠트를 사용해서 그렇고 다른 챠트 swf 만 있을 경우에는 좀 다른 에러가 발생합니다.)

TypeError: Error #1034: 유형 강제 변환에 실패했습니다.
mx.core::ClassFactory@674d701을(를) mx.core.IFactory(으)로 변환할 수 없습니다.

at mx.charts.series::BarSeries/get legendData()[E:\dev\flex_201_borneo\sdk\frameworks\mx\charts\series\BarSeries.as:178]

177        if (markerFactory == null)
178            markerFactory = getStyle("itemRenderer");


해결방안(?)은 아래 붉은 글씨로 표기된 부분을 참고하시면 됩니다.

* 비슷한 사례로 올라온 내용이 있습니다. 아래 url 을 참고하세요.

Runtime Error Painting Screen for Embedded App
http://www.nabble.com/Runtime-Error-Painting-Screen-for-Embedded-App-to9442490.html

Modules - Alex Harui
http://blogs.adobe.com/aharui/2007/03/modules.html

아래 샘플로 테스트 해보실 수 있습니다.
혹 정확한 내용을 이해하고 계신분들은 댓글로...ㅎㅎ

# loaderTest.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
    <![CDATA[
        import mx.charts.chartClasses.ChartBase;

        //아래 부분이 중요한 내용입니다.
        //주석을 풀어주면 런타임 오류가 발생하지 않고 주석을 해주면 오류가 발생합니다.

        //다른 해결방안으로는 swfLoader 가 실행되는 순서를 순차적으로 발생시키도 됩니다.
        //예상하기로는 서로 같은 모듈이 동시에 올라오면서 충돌하는 현상이 아닌가 합니다.
        //public var cbase:ChartBase;
    ]]>

</mx:Script>
    <mx:Panel title="SWFLoader Control Example"  height="90%" width="90%"
        paddingTop="10" paddingBottom="10" paddingLeft="10" paddingRight="10">
        <mx:Label text="The Label control of the outer application."/>
            <mx:VBox width="100%" height="100%">
                <mx:SWFLoader id="Load_1" source="@Embed(source='ChartDemo_1.swf')"  height="100%" width="100%"/>
                <mx:SWFLoader id="Load_2" source="@Embed(source='ChartDemo_2.swf')" height="100%" width="100%"/>               
                <mx:SWFLoader id="Load_1_2" source="@Embed(source='ChartDemo_1.swf')" height="100%" width="100%"/>
            </mx:VBox>
    </mx:Panel>
</mx:Application>

# ChartDemo_1.mxml - 어떤 챠트가 들어가든지 상관없습니다.ㅎㅎ

<?xml version="1.0"?>

<!-- Simple example to demonstrate the BarChart controls. -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Script>
        <![CDATA[
        import mx.collections.ArrayCollection;

        [Bindable]
        private var medalsAC:ArrayCollection = new ArrayCollection( [
            { Country: "USA", Gold: 35, Silver:39, Bronze: 29 },
            { Country: "China", Gold: 32, Silver:17, Bronze: 14 },
            { Country: "Russia", Gold: 27, Silver:27, Bronze: 38 } ]);
        ]]>
    </mx:Script>

    <mx:Panel title="BarChart Controls Example"
        height="100%" width="100%" layout="horizontal">
         <mx:BarChart id="bar" height="100%" width="45%"
            paddingLeft="5" paddingRight="5"
            showDataTips="true" dataProvider="{medalsAC}">
            <mx:verticalAxis>
                <mx:CategoryAxis categoryField="Country"/>
            </mx:verticalAxis>
            <mx:series>
                <mx:BarSeries yField="Country" xField="Gold" displayName="Gold"/>
                <mx:BarSeries yField="Country" xField="Silver" displayName="Silver"/>
                <mx:BarSeries yField="Country" xField="Bronze" displayName="Bronze"/>
            </mx:series>
        </mx:BarChart>
        <mx:Legend dataProvider="{bar}"/>
    </mx:Panel>
</mx:Application>




728x90