【问题标题】:Flex 3: Strange behavior when function does a simple math operationFlex 3:函数进行简单数学运算时的奇怪行为
【发布时间】:2011-08-18 14:53:27
【问题描述】:

因此,在我的一个模块中,一个名为 numDays 的变量是通过循环访问一些 XML 数据并找到调用 days 的 xml 字段的最大值来创建的。找到 numDays 变量后,我用它来查找画布的宽度:

wrapper.width = numDays * parentApplication.oneDay;

(oneDay是窗口宽度除以14得到的值)

所以,既然我知道了包装画布的宽度,我就可以开始填充它了。我有四个项目要进入包装器:1)角色描述,2)左控制器,3)名称文本框(自动建议组件),4)右控制器。角色描述的宽度为 30px。左右控制器各为 20 像素。因此,为了获得名称文本框的宽度,我有一个执行以下操作的函数:

nameTextbox.width = wrapper.width - 70;

由于某种原因,当我这样做时,应用程序没有完全加载。它几乎停滞不前。我有 30 个“项目”,每个项目中有 15 个“职位”。 wrapper.width 描述了一个位置的宽度,因此有 450 个名称文本框试图弄清楚。这就是它搞砸的原因吗?

编辑

因此,从主应用程序调用项目模块。在项目模块中,使用“positionsAC”数据源创建了一个列表:

<mx:List id="wholePosition" dataProvider="{positionsAC}" width="100%" height="100%" paddingBottom="0" paddingLeft="0" paddingRight="0" paddingTop="0" backgroundAlpha="0" verticalScrollPolicy="off" itemRenderer="modules.position" useRollOver="false" selectable="false">

下面是整个位置模块的c/p

<?xml version="1.0" encoding="utf-8"?>
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:components="com.hillelcoren.components.*" dataChange="allData = data as Array" layout="absolute" creationComplete="init();" horizontalScrollPolicy="off">
<mx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;
        import mx.controls.Alert;

        [Bindable] public var positionInfo:Array;
        [Bindable] public var wholePositionID:Number;
        [Bindable] public var allData:Array;

        [Bindable] public var positions:XML;            
        [Bindable] public var startOffset:Number;
        [Bindable] public var numDays:Number;
        [Bindable] public var role:String;
        [Bindable] public var studentID:Number;
        [Bindable] public var conflict:Number;
        [Bindable] public var studentType:String;
        [Bindable] public var showInPrinciple:Number;

        [Bindable] public var positionX:Number = 0;
        [Bindable] public var positionWidth:Number = 0;
        [Bindable] public var sName:String = new String;
        [Bindable] public var asAC:ArrayCollection = new ArrayCollection;
        [Bindable] public var conflictBG:uint = 0xffffff;
        [Bindable] public var roleColor:uint = 0x000000;

        private function init():void
        {
            if (allData)
            {
                getInfo(allData);
                setBGColor();
                getPositionX();
                getPositionWidth();
                getRightStudents();
            }
        }

        private function getInfo(a:Array):void
        {
            var tempArray:Array = new Array;

            startOffset = Number(a[0]);
            numDays = Number(a[1]);
            positionWidth = parentApplication.oneDay * numDays;
            setStudentNameW();
            role = a[2];
            studentID = Number(a[3]);
            tempArray = parentApplication.studentsDBIDDict[String(studentID)] as Array;
            conflict = Number(a[4]);
            studentType = a[5];
            sName = "test";
            showInPrinciple = a[6];
        }

        private function setStudentNameW():void
        {
            if (numDays == 1)
            {
                studentName.width = 55;
                studentName.x = 37;
                contractLeft.visible = false;
                contractRight.visible = false;
            }
            else if (numDays == 2)
            {
                Alert.show("HI");
                studentName.width = 133;
            }
            else if (numDays == 3)
                studentName.width = 230;
            else if (numDays == 4)
                studentName.width = 330;

            if (numDays > 1)
            {
                studentName.x = 47;
                contractLeft.visible = true;
                contractRight.visible = true;                    
            }
        }

        public function setBGColor():void
        {
            if (conflict == 1)
                conflictBG = parentApplication.errorColor;
            else if (conflict == 2)
                conflictBG = parentApplication.okErrorColor;
            else
                conflictBG = 0xFFFFFF;
        }

        private function getPositionX():void
        {
            positionX = parentApplication.oneDay * startOffset - 1;
        }

        private function getPositionWidth():void
        {
            positionWidth = parentApplication.oneDay * numDays;
        }

        private function getRightStudents():void
        {
            if (studentType == "freshman")
                makeASAC(parentApplication.freshmanAC);
            else if (studentType == "bfa1")
                makeASAC(parentApplication.bfa1AC);
            else if (studentType == "bfa2")
                makeASAC(parentApplication.bfa2AC);
            else if (studentType == "bfa3")
                makeASAC(parentApplication.bfa3AC);
            else if (studentType == "mfa1")
                makeASAC(parentApplication.mfa1AC);
            else if (studentType == "mfa2")
                makeASAC(parentApplication.mfa2AC);
            else if (studentType == "mfa3")
                makeASAC(parentApplication.mfa3AC);
            else if (studentType == "mfaw1")
                makeASAC(parentApplication.mfaw1AC);
            else if (studentType == "mfaw2")
                makeASAC(parentApplication.mfaw2AC);
            else if (studentType == "mfaw3")
                makeASAC(parentApplication.mfaw3AC);
        }

        private function makeASAC(students:ArrayCollection):void
        {
            for (var i:int = 0; i < students.length; i++)
                asAC.addItem(parentApplication.getStudentName(students.getItemAt(i)));
        }

        private function posLength(whichSide:String, expandContract:String):void
        {
            if (whichSide == 'l')
            {
                if (expandContract == 'e')
                {
                    if (startOffset > 0)
                    {
                        numDays++;
                        startOffset--;
                        getPositionX();
                        getPositionWidth();
                    }
                }
                else if (expandContract == 'c')
                {
                    if (numDays > 1)
                    {
                        numDays--;
                        startOffset++;
                        getPositionX();
                        getPositionWidth();
                    }
                }
            }
            else if (whichSide == 'r')
            {
                if (expandContract == 'e')
                {
                    if (numDays + startOffset < parentDocument.projectLength)
                    {
                        numDays++;
                        getPositionX();
                        getPositionWidth();
                    }
                }
                else if (expandContract == 'c')
                {
                    if (numDays > 1)
                    {
                        numDays--;
                        getPositionX();
                        getPositionWidth();
                    }
                }
            }

            //parentApplication.conflicts();
        }
    ]]>
</mx:Script>    

<mx:Canvas id="positionWrapper" width="{positionWidth}" height="25" backgroundColor="#ffffff" horizontalScrollPolicy="off" borderColor="#000000" borderStyle="solid" borderThickness="1">
    <mx:Text id="roleText" text="{role}" width="25" y="3" color="{roleColor}" fontSize="11" fontWeight="bold" click="parentApplication.getDictLen(parentApplication.studentsDBIDDict)" />
    <mx:Canvas id="leftSide" x="25" width="22" height="100%" mouseOver="expandLeft.visible = true; contractLeft.visible = true;" mouseOut="expandLeft.visible = false; contractLeft.visible = false;" backgroundColor="{conflictBG}" horizontalScrollPolicy="off"> 
        <mx:Image id="expandLeft" source="images/addRed.png" y="5" click="posLength('l', 'e')" mouseOver="parentApplication.switchCursor(true);" mouseOut="parentApplication.switchCursor(false);" visible="false" />
        <mx:Image id="contractLeft" source="images/minusRed.png" x="10" y="5" click="posLength('l', 'c')" mouseOver="parentApplication.switchCursor(true);" mouseOut="parentApplication.switchCursor(false);" visible="false" />
    </mx:Canvas>
    <components:AutoComplete id="studentName" textAlign="center"
        dataProvider="{asAC}"
        x="47" y="3"
    />
    <mx:Image id="showSNW" source="images/searchicon.png" x="{(studentName.width + studentName.x) - 12}" y="5" visible="false" mouseOver="parentApplication.switchCursor(true); studentName.enabled = false;" mouseOut="parentApplication.switchCursor(false); studentName.enabled = true; showSNW.visible = false;" />
    <mx:Canvas id="rightSide" x="{positionWrapper.width - 22}" width="20" height="100%" mouseOver="expandRight.visible = true; contractRight.visible = true;" mouseOut="expandRight.visible = false; contractRight.visible = false;" backgroundColor="{conflictBG}" horizontalScrollPolicy="off">
        <mx:Image id="contractRight" source="images/minusRed.png" y="5" click="posLength('r', 'c')" visible="false" mouseOver="parentApplication.switchCursor(true);" mouseOut="parentApplication.switchCursor(false);" />
        <mx:Image id="expandRight" source="images/addRed.png" x="10" y="5" click="posLength('r', 'e')" visible="false" mouseOver="parentApplication.switchCursor(true);" mouseOut="parentApplication.switchCursor(false);" />
    </mx:Canvas>
</mx:Canvas>

【问题讨论】:

  • 当你开始为它们的宽度赋值时,你确定包装器和/或 nameTextbox 已经被创建了吗?可能是它们尚未创建,而您正在点击一个空指针。你试过用调试器运行吗?
  • 听起来他们正在发生很多事情;但我不明白问题是什么。 “出局”是什么意思。您是否遇到编译问题或运行时问题。当你说你有 30 个项目时;您是指 30 个不同的 Flash Builder 项目吗?当您谈论“您的模块之一”时,您是指 Flex 模块还是泛指“封装类”?
  • 你有调试器吗?你确定 nameTextBox 不为空吗?
  • @Flextras,他可能意味着挂起,这通常发生在非调试器 Flash Player 上发生未捕获的异常时
  • @Pranav Hosangadi 如果他有 30 个不同的 Flash Builder 项目;每个创建一个不同的模块;那么所有打开的项目都重新编译只是因为保存了一个文件并导致工作区刷新而并非闻所未闻。的,它可能是挂起的 IDE,而不是 Flash 播放器。根据问题中的信息,两者都是同样合理的情景。

标签: apache-flex


【解决方案1】:

最好弄个调试器。 Flash Builder 4 是一款相当不错的软件,他们甚至向

发放免费的标准许可证
  • 符合条件的教育机构的学生、教职员工
  • 受当前经济状况影响且目前失业的软件开发人员
  • 在活动中收到特殊促销代码的活动参与者

Check this out

另外,获取最新 Flash Player 的调试器版本here

免费标准可能需要一些时间才能推出,但您始终可以同时使用免费试用版。

调试时,检查 nameTextBox 不为空。

【讨论】:

  • 感谢您的信息...我实际上为 FSU(No 'Noles)工作,所以我注册了免费的 flash builder 副本:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
相关资源
最近更新 更多