Ошибка № 2025: предоставленный объект DisplayObject должен быть дочерним по отношению к вызывающей стороне - PullRequest
1 голос
/ 03 августа 2010

Я очень новичок в программировании на FLEX.Я унаследовал проект FLEX 4, который вызывает веб-службы для отображения данных конечному пользователю.

В моем пакете по умолчанию есть один файл .MXML, в котором есть ссылки на компоненты на экране входа в систему (другой файл .MXML) иГлавный экран (да, еще один файл .MXML).

Процесс входа в систему работает нормально.У меня есть 3 вкладки, с 4-й вкладкой, которую я добавляю сейчас.

Вкладки создаются с использованием элементов в TabNavigator.Я добавил 4-й VBOX, вот так:

        <mx:VBox label="Data Analysis" width="100%" height="100%">
        <componenets:DeviceLineChart />
    </mx:VBox>

DeviceLineChart.mxml выглядит так:

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
            xmlns:charts="org.axiis.charts.*"
            layout="absolute"
            creationComplete="start();"
            xmlns:axiis="http://www.axiis.org/2009"
            xmlns:series="org.axiis.charts.series.*"
            xmlns:groupings="org.axiis.charts.groupings.*"
            xmlns:degrafa="http://www.degrafa.com/2008"
            xmlns:states="org.axiis.states.*"
            xmlns:paint="org.axiis.paint.*"
            xmlns:Examples="Examples.*"
            xmlns:axis="org.axiis.charts.axis.*"
            xmlns:labels="org.axiis.charts.labels.*"
            xmlns:utils="org.axiis.utils.*" viewSourceURL="srcview/index.html">

<mx:Style source="styles/Axiis_Examples.css"/>

<mx:Script>
    <![CDATA[
        import org.axiis.data.DataSet;

        private var ds:DataSet = new DataSet();

        public function start():void
        {
            ds.processCsvAsTable(payload, false);

            //LineSeriesGroup expects each unique series as a row
            //Since our data has the time entries on each row (a common format for temporal data) we want to pivot the data
            //This then makes a column for each unique time entrie and a row for each unique column.
            ds.pivotTable(0);
            dataProvider = ds.data.pivot.rows;
            hScale.dataProvider=ds.data.pivot.header.slice(1,dataSlice.value+1);
            hAxis.invalidateDataProvider();
            dc.invalidateDisplayList();
        }

        private function sliceData():void {
            hScale.dataProvider=ds.data.pivot.header.slice(1,dataSlice.value+1);
            hAxis.invalidateDataProvider();
            myLineGroup.invalidateDataProvider();
            dc.invalidateDisplayList(); 
        }

        private function axisLabel(obj:Object):String
        {
            return formatter.format(Number(obj) / 1000);
        }

        private function filterColumns(obj:Object):Boolean
        {
            //Don't want filter fields, trim columns
            if (obj.index < 1 || obj.index > dataSlice.value)
                return false;
            else
                return true;
        }

        private function filterRows(obj:Object):Boolean
        {
            //Trim our rows
            if (obj.pivotName == "Apples")
                return false;
            else
                return true;
        }
    ]]>
</mx:Script>

<mx:String id="payload" source="data/LineSeriesData.csv"/>

<mx:CurrencyFormatter currencySymbol="k"
                      precision="0"
                      id="formatter"
                      alignSymbol="right"
                      useThousandsSeparator="true"/>

<!--  GLOBAL VARIABLES -->
<mx:Object id="dataProvider"/>
<mx:String id="verticalField"/>
<mx:Number id="percentGap">.02</mx:Number>

<!--  EXPRESSIONS -->
<utils:NumericExpression id="tension" value="{slider.value/210}" valueChanged="{if (myLineGroup) dc.invalidateDisplayList();}"/>


<!-- CHART -->
<axiis:LinearScale id="vScale"
                   dataProvider="{dataProvider}"
                   minLayout="0"
                   maxLayout="{myLineGroup.height}"
                   />

<axiis:CategoricalScale id="hScale"
                        minLayout="0"
                        maxLayout="{myLineGroup.width}"
                        />

<axiis:DataCanvas width="80%"
                  id="dc"
                  top="120"
                  bottom="100"
                  horizontalCenter="0"
                  strokes="{strokes}"
                  fills="{fills}"
                  palettes="{palettes}"
                  showDataTips="true">

    <!-- Background -->
    <axiis:backgroundGeometries>
        <axis:VAxis id="vAxis"
                    verticalScale="{vScale}"
                    tickStroke="{axisStroke}"
                    width="{dc.width}"
                    height="{myLineGroup.height}"
                    showDataTips="false"
                    fontFamily="Myriad Pro"
                    fontColor="0"
                    fontSize="14"
                    tickGap="5"
                    majorTickSpacing="50"
                    labelFunction="{axisLabel}"/>
        <axiis:HCategoryAxis id="hAxis"
                             x="{myLineGroup.x}"
                             categoryScale="{this.hScale}"
                             width="{myLineGroup.width}"
                             dataProvider="{hScale.dataProvider}"
                             height="50"
                             y="{myLineGroup.height}"/>
        <degrafa:Line x="0"
                      x1="{myLineGroup.x+myLineGroup.width}"
                      y="{myLineGroup.height}"
                      y1="{myLineGroup.height}"
                      stroke="{axisStroke}"/>
    </axiis:backgroundGeometries>

    <!-- Layouts -->
    <axiis:layouts>
        <groupings:LineSeriesGroup id="myLineGroup"
                                   x="12"
                                   y="0"
                                   height="{dc.height-70}"
                                   width="{dc.width}"
                                   tension="{tension.value}"
                                   markerColor="{areaPalette.currentColor}"
                                   dataFilterFunction="{filterRows}"
                                   showArea="{area.selected}"
                                   plotFilterFunction="{filterColumns}"
                                   markerSize="8"
                                   showMarker="{showMarker.selected}"
                                   mode="{int(layoutGroup.selectedValue)}"
                                   dataProvider="{dataProvider}"
                                   plotCollection="columns"
                                   dataField="value"
                                   labelField="pivotName"
                                   xDataField="name"
                                   plotLabelField="name"
                                   verticalScale="{vScale}"
                                   horizontalScale="{hScale}"
                                   stroke="{myStroke}"
                                   fill="{areaFill}"
                                   enableRollOver="true"/>
    </axiis:layouts>
</axiis:DataCanvas>

<!--  FILLS & STROKES -->

<mx:Array id="palettes">
    <paint:LayoutAutoPalette id="outerPalette" layout="{myLineGroup}" colorFrom="0xCC3333" colorTo="0x3333CC"/>
    <paint:LayoutAutoPalette id="clusterPalette" layout="{myLineGroup}" colorFrom="{outerPalette.currentColor}" colorTo="{outerPalette.currentColor | 0x337f00}"/>
    <paint:LayoutAutoPalette id="areaPalette" layout="{myLineGroup}" colorFrom="0x3333CC" colorTo="0xCC3333"/>
</mx:Array>
<mx:Array id="fills">
    <degrafa:LinearGradientFill id="areaFill" angle="90" enableEvents="false">
        <degrafa:GradientStop color="{areaPalette.currentColor}" alpha=".95"/>
        <degrafa:GradientStop color="{areaPalette.currentColor | 0x999933}" alpha=".65"/>
    </degrafa:LinearGradientFill>
    <degrafa:LinearGradientFill id="clusterFill" angle="45" enableEvents="false">
        <degrafa:GradientStop color="{clusterPalette.currentColor}"/>
        <degrafa:GradientStop color="{clusterPalette.currentColor | 0xFFFFFF}" alpha=".85"/>
    </degrafa:LinearGradientFill>
</mx:Array>
<mx:Array id="strokes">
    <degrafa:LinearGradientStroke id="colStroke" pixelHinting="true" angle="45" enableEvents="false">
        <degrafa:GradientStop color="0xFFFFFF" alpha=".7"/>
        <degrafa:GradientStop color="0xFFFFFF" alpha=".3"/>
    </degrafa:LinearGradientStroke>
    <degrafa:SolidStroke color="0xFFFFFF" alpha=".3"/>
    <degrafa:SolidStroke color="0x222222" id="axisStroke" pixelHinting="true"/>
    <degrafa:SolidStroke color="{areaPalette.currentColor}"
                         id="myStroke"
                         weight="1"
                         alpha="1"
                         caps="none"
                         pixelHinting="true"/>
</mx:Array>

<!-- DISPLAY OBJECTS -->

<mx:HBox id="myBox" bottom="50" horizontalCenter="0">
    <mx:HBox>
        <mx:Label text="Line Curve" textAlign="right" verticalCenter="0"/>
        <mx:HSlider width="80"
                    id="slider"
                    minimum="1"
                    maximum="80"
                    value="35"
                    liveDragging="true"
                    showTrackHighlight="false"
                    verticalCenter="-5"/>
    </mx:HBox>
    <mx:Label text="|"/>
    <mx:HBox>
        <mx:Label text="% Data" textAlign="right" verticalCenter="0"/>
        <mx:HSlider width="80"
                    id="dataSlice"
                    minimum="3"
                    maximum="220"
                    value="30"
                    snapInterval="1"
                    change="{sliceData();}"
                    showTrackHighlight="false"
                    verticalCenter="-5"/>
    </mx:HBox>
    <mx:HBox>
        <mx:Label text="Label Rotation" textAlign="right" verticalCenter="0"/>
        <mx:HSlider width="80"
                    id="labelRotate"
                    minimum="0"
                    maximum="90"
                    value="0"
                    snapInterval="1"
                    change="{hAxis.labelRotation=labelRotate.value;dc.invalidateDisplayList();}"
                    showTrackHighlight="false"
                    verticalCenter="-5"/>
    </mx:HBox>
    <mx:Label text="|"/>
    <mx:HBox>
        <mx:Label text="Area" textAlign="right" verticalCenter="0"/>
        <mx:CheckBox id="area" change="{dc.invalidateDisplayList();}" selected="true"/>
    </mx:HBox>
    <mx:Label text="|"/>
    <mx:HBox>
        <mx:Label text="Marker" textAlign="right" verticalCenter="0"/>
        <mx:CheckBox id="showMarker" change="{dc.invalidateDisplayList();}"/>
    </mx:HBox>
    <mx:Label text="|"/>
    <mx:Spacer width="20"/>
    <mx:HBox>
        <mx:RadioButtonGroup id="layoutGroup" change="{dc.invalidateDisplayList();}"/>
        <mx:RadioButton label="Overlay" group="{layoutGroup}" value="{LineSeriesGroup.MODE_BASELINE}" selected="true"/>
        <mx:RadioButton label="Stack" group="{layoutGroup}" value="{LineSeriesGroup.MODE_STACK_ZERO}"/>
        <mx:RadioButton label="Flow" group="{layoutGroup}" value="{LineSeriesGroup.MODE_STACK_FLOW}"/>
    </mx:HBox>
</mx:HBox></mx:Application>

Я внедрил Линейный график Axiis вмой проект, который я считаю довольно крутымНо у меня возникли некоторые проблемы с его реализацией, так как LineChart изначально был написан на FLEX 3 (а моим проектом был FLEX 4).Наконец, он отображается правильно (со всеми предоставленными данными), но я не могу щелкнуть что-либо на линейной диаграмме, не получив сообщение об ошибке.

Я хотел бы отметить, что это не повторяющийся вопрос, поскольку аналогичный вопрос былответил на stackoverflow здесь .Мой вопрос очень похож, за исключением того, что мой проект уже использует "" пространство имен из того, что я могу сказать, которое упоминается как "исправление" в предыдущем ответе stackoverflow.Может быть, я не использую пространство имен правильно, в правильных местах?Я не уверен и могу при необходимости опубликовать больше своих компонентов и их кода.Возможно, я здесь говорю по-гречески или смущаю некоторых из вас, но у меня всего 6 дней жизни на FLEX-разработке, поэтому прошу прощения за мое невежество, так как это совершенно новая область для меня.

Я былсмог получить в свои руки файлы .SWC, необходимые для обновления FLEX 4 для Axiis и Degrafa4, благодаря некоторым действительно хорошим парням, работающим над проектами с открытым исходным кодом для этих инструментов.Вы можете найти эти файлы здесь .

В настоящее время я получаю сообщение об ошибке:

ArgumentError: Ошибка # 2025: предоставленный объект DisplayObject должен быть дочерним по отношению к вызывающей стороне,в flash.display :: DisplayObjectContainer / getChildIndex () в mx.managers :: SystemManager / getChildIndex () [E: \ dev \ 4.x \ frameworks \ projects \ framework \ src \ mx \ Manager \ SystemManager.as: 1665]в mx.managers.systemClasses :: ActiveWindowManager / mouseDownHandler () [E: \ dev \ 4.0.0 \ frameworks \ projects \ framework \ src \ mx \ Manager \ systemClasses \ ActiveWindowManager.as: 471] Цитата

Эта ошибка возникает только на моей 4-й вкладке / VBOX, в которой содержится Axiis LineChart.Когда пользователь нажимает на диаграмму, ошибки появляются во всех компонентах пользовательского интерфейса, где бы я ни щелкал.

Если вы отправляете сообщение об ошибке в Google, большинство людей устраняет его, изменяя явный код, который добавляет или удаляет объекты пользовательского интерфейса.Это совсем не мой случай, в моем коде нет явного добавления или удаления, которое я мог бы изменить.Это заставляет меня поверить, что это проблема пространства имен / фреймворка / библиотеки или что мой проект не спроектирован правильно с точки зрения пользовательского интерфейса / холста / пространства имен.Я недостаточно знаком с FLEX 4, чтобы знать, где использовать пространства имен Spark, MXML, MX (s, fx, mx) и т. Д.

Любая помощь или идеи приветствуются, поскольку эта ошибка является текущим шоустопор.Спасибо!

Кроме того, я был уведомлен, что многие ссылки на код "

1 Ответ

1 голос
/ 03 августа 2010

Почему «DeviceLineChart» является <mx:Application>? Если вы не загружаете какие-либо дополнительные приложения, вы можете вместо этого просто изменить его на <mx:Canvas>. Если вы планируете загружать их динамически, вам нужно использовать Module Loader. Что вы говорите Flex, так это то, что в вашей системе работают два приложения, и есть несколько синглетов, таких как SystemManager, которые не работают, когда вы используете два приложения, не используя для этого загрузочную систему.

...