My Error #1010 situation
Edit 3: Alright, I'm lighting up a Windows Server 2008 R2 VM, installing Flex Builder 3, and seeing if I can get a new project to compile and execute properly. News! I got the IDE up and running in the VM and I STILL got the same exact error after the code compiled without issue! Here comes a big, emphatic double you tee eff.
Edit 2: Since this has gotten to be a pretty long post I'll put this up here. I just went through and deleted each portion of the two problem lines individually and tried to compile after each one, and I got the error every single time. I even deleted everything from within the two DataGridColumn
s and it still didn't compile, even though commenting out the two empty <mx:DataGridColumn />
lines will let the program load! This is driving me nuts, can anyone shed some light on this for me?
I have an AIR application which will apparently compile just fine when I hit F5, but before the app has a chance to load I get the following error:
By commenting out blocks of code I've narrowed the problem down to two specific lines.
<mx:DataGrid id="grid1" width="100%" height="100%" editable="false">
<mx:columns>
<mx:DataGridColumn headerText="Symbol" dataField="Symbol" headerWordWrap="true" width="100" textAlign="left"/>
<mx:DataGridColumn headerText="Description" dataField="FullName" headerWordWrap="true" width="150" textAlign="left"/>
<mx:DataGri开发者_运维知识库dColumn headerText="Trans" dataField="TransactionCode" headerWordWrap="true" width="75" textAlign="center"/>
<mx:DataGridColumn headerText="Quantity" dataField="Quantity" headerWordWrap="true" width="50" textAlign="right" labelFunction="formatUtil3"/>
<mx:DataGridColumn headerText="Execution Date" dataField="ExecutionDate" headerWordWrap="true" width="80" textAlign="center"/>
<mx:DataGridColumn headerText="Execution Price" dataField="ExecutionPrice" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil1"/>
<mx:DataGridColumn width="15" backgroundColor="0x888888" dataField="blank1" headerText=""/>
<mx:DataGridColumn headerText="Previous Business Day" dataField="PreviousDate" headerWordWrap="true" width="80" textAlign="center" itemRenderer="PD5"/>
<!----> <mx:DataGridColumn headerText="Previous Business Day Price" dataField="PreviousDatePrice" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil1" itemRenderer="PD5"/>
<!----> <mx:DataGridColumn headerText="% Difference" dataField="PreviousDateDelta" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil2" itemRenderer="PD5"/>
<mx:DataGridColumn headerText="Source" dataField="PreviousDateSource" headerWordWrap="true" width="100" textAlign="left" itemRenderer="PD5"/>
<mx:DataGridColumn width="15" backgroundColor="0x888888" dataField="blank2" headerText=""/>
<mx:DataGridColumn headerText="Previous Month End" dataField="PrevMonthEndDate" headerWordWrap="true" width="80" textAlign="center" itemRenderer="PME5"/>
<mx:DataGridColumn headerText="Previous Month End Price" dataField="PrevMonthEndPrice" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil1" itemRenderer="PME5"/>
<mx:DataGridColumn headerText="% Difference" dataField="PrevMonthEndDelta" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil2" itemRenderer="PME5"/>
<mx:DataGridColumn headerText="Source" dataField="PrevMonthEndSource" headerWordWrap="true" width="100" textAlign="left" itemRenderer="PME5"/>
</mx:columns>
</mx:DataGrid>
The two lines are marked with <!---->
. If I comment those two lines out then the app will compile, run, and display properly, but if I leave either of them active I get the error above.
What is going on here?
Edit: Additional code as requested -
<mx:CurrencyFormatter id="format1" precision="5" useNegativeSign="false"/>
<mx:NumberFormatter id="format2" precision="2"/>
And the functions -
private function formatUtil1(item:Object, column:DataGridColumn):String
{
var Field:Object = item[column.dataField];
return format1.format(Field);
}
private function formatUtil2(item:Object, column:DataGridColumn):String
{
var Field:Object = item[column.dataField];
return format2.format(Field);
}
Next the .as file for PD5 -
package
{
import mx.controls.Label;
import mx.controls.listClasses.*;
public class PD5 extends Label
{
private const POSITIVE_COLOR:uint = 0x000000; // Black
private const NEGATIVE_COLOR:uint = 0xFF0000; // Red
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
setStyle("color", (data.PreviousDateDelta >= 5 || data.PreviousDateDelta <= -5) ? NEGATIVE_COLOR : POSITIVE_COLOR);
}
}
}
And now PME5.as -
package
{
import mx.controls.Label;
import mx.controls.listClasses.*;
public class PME5 extends Label
{
private const POSITIVE_COLOR:uint = 0x000000; // Black
private const NEGATIVE_COLOR:uint = 0xFF0000; // Red
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
setStyle("color", (data.PrevMonthEndDelta >= 5 || data.PrevMonthEndDelta <= -5) ? NEGATIVE_COLOR : POSITIVE_COLOR);
}
}
}
Run the application in debug mode. When there is an error, Flex builder (Flash Builder 4.5 is the newest version) will break and take you to the line of code that is causing a problem. This is occuring because some object whose property you are trying to access is actually null.
You can browse up and down the call tree in the debug window (Window menu>debug) and that way you can find out which object is null.
Mostly this is happening because the dataprovider is not complete, i.e. some data is missing. for example one row might not have a previous day business price. If this is the case then you need to handle the null item in your formatUtil functions
var field:Object=item[column.dataField];
if(field!=null) {
return format1.format(field);
} else {
return "";
}
EDIT:
Also check these two lines:
setStyle("color", (data.PrevMonthEndDelta >= 5 || data.PrevMonthEndDelta <= -5) ? NEGATIVE_COLOR : POSITIVE_COLOR);
and
setStyle("color", (data.PreviousDateDelta >= 5 || data.PreviousDateDelta <= -5) ? NEGATIVE_COLOR : POSITIVE_COLOR);
It's possible that the error comes from data.PreviousDateDelta
or data.PrevMonthEndDelta
Nothing stands out in the code as being bad.
Obviously, this is untested code.
I have a feeling your dataprovider is not complete or missing data.
Probably due to 1 of these lines.
// no validation is being done so this can be a failure point
var Field:Object = item[column.dataField];
return format1.format(Field);
return format2.format(Field);
Here is some code you can try to test your dataprovider
import flash.debugger.enterDebugger;
private function formatUtil1(item:Object, column:DataGridColumn):String
{
try{
if (item[column.dataField] ){
var Field:Object = item[column.dataField];
var retVal:String = format1.format(Field)
if( retVal == null || retVal == undefined ){
//return '';
enterDebugger()
}
}else{
//return '';
enterDebugger()
}
}catch(e:error){
//return '';
enterDebugger()
}
return retVal;
}
private function formatUtil2(item:Object, column:DataGridColumn):String
{
try{
if (item[column.dataField] ){
var Field:Object = item[column.dataField];
var retVal:String = format2.format(Field);
if( retVal == null || retVal == undefined ){
//return '';
enterDebugger()
}
}else{
//return '';
enterDebugger()
}
}catch(e:error){
//return '';
enterDebugger()
}
return retVal;
}
The same thing can be applied to the renderers
package
{
import mx.controls.Label;
import mx.controls.listClasses.*;
public class PME5 extends Label
{
private const POSITIVE_COLOR:uint = 0x000000; // Black
private const NEGATIVE_COLOR:uint = 0xFF0000; // Red
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
super.updateDisplayList(unscaledWidth, unscaledHeight);
// are you 100% sure data.PrevMonthEndDelta exists on the data object????
if (data != null && data.PreviousDateDelta ){
setStyle("color", (data.PrevMonthEndDelta >= 5 || data.PrevMonthEndDelta <= -5) ? NEGATIVE_COLOR : POSITIVE_COLOR);
}
}
}
}
This compiles fine here. Did not change anything but added default data.
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Script>
<![CDATA[
private function formatUtil1(item:Object, column:DataGridColumn):String
{
var Field:Object = item[column.dataField];
return format1.format(Field);
}
private function formatUtil2(item:Object, column:DataGridColumn):String
{
var Field:Object = item[column.dataField];
return format2.format(Field);
}
private function formatUtil3(item:Object, column:DataGridColumn):String
{
return formatUtil2(item, column);
}
]]>
</fx:Script>
<fx:Declarations>
<mx:NumberFormatter id="format2" precision="2"/>
<mx:CurrencyFormatter id="format1" precision="5" useNegativeSign="false"/>
</fx:Declarations>
<mx:DataGrid id="grid1" width="100%" height="100%" editable="false">
<mx:ArrayCollection>
<mx:source>
<fx:Object
Symbol="€"
FullName="Name"
TransactionCode="121345"
Quantity="10"
ExecutionDate="10.10.2011"
ExecutionPrice="1.5"
PreviousDate="09.10.2011"
PreviousDatePrice="1.4"
PreviousDateDelta="10"
PreviousDateSource="0.1"
PrevMonthEndDate="0.1"
PrevMonthEndPrice="0.1"
PrevMonthEndDelta="-10"
PrevMonthEndSource="0.1"
/>
<fx:Object
Symbol="€"
FullName="Name2"
TransactionCode="121345"
Quantity="10"
ExecutionDate="10.10.2011"
ExecutionPrice="1.5"
PreviousDate="09.10.2011"
PreviousDatePrice="1.4"
PreviousDateDelta="4"
PreviousDateSource="0.1"
PrevMonthEndDate="0.1"
PrevMonthEndPrice="0.1"
PrevMonthEndDelta="4"
PrevMonthEndSource="0.1"
/>
</mx:source>
</mx:ArrayCollection>
<mx:columns>
<mx:DataGridColumn headerText="Symbol" dataField="Symbol" headerWordWrap="true" width="100" textAlign="left"/>
<mx:DataGridColumn headerText="Description" dataField="FullName" headerWordWrap="true" width="150" textAlign="left"/>
<mx:DataGridColumn headerText="Trans" dataField="TransactionCode" headerWordWrap="true" width="75" textAlign="center"/>
<mx:DataGridColumn headerText="Quantity" dataField="Quantity" headerWordWrap="true" width="50" textAlign="right" labelFunction="formatUtil3"/>
<mx:DataGridColumn headerText="Execution Date" dataField="ExecutionDate" headerWordWrap="true" width="80" textAlign="center"/>
<mx:DataGridColumn headerText="Execution Price" dataField="ExecutionPrice" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil1"/>
<mx:DataGridColumn width="15" backgroundColor="0x888888" dataField="blank1" headerText=""/>
<mx:DataGridColumn headerText="Previous Business Day" dataField="PreviousDate" headerWordWrap="true" width="80" textAlign="center" itemRenderer="tmp.PD5"/>
<mx:DataGridColumn headerText="Previous Business Day Price" dataField="PreviousDatePrice" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil1" itemRenderer="tmp.PD5"/>
<mx:DataGridColumn headerText="% Difference" dataField="PreviousDateDelta" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil2" itemRenderer="tmp.PD5"/>
<mx:DataGridColumn headerText="Source" dataField="PreviousDateSource" headerWordWrap="true" width="100" textAlign="left" itemRenderer="tmp.PD5"/>
<mx:DataGridColumn width="15" backgroundColor="0x888888" dataField="blank2" headerText=""/>
<mx:DataGridColumn headerText="Previous Month End" dataField="PrevMonthEndDate" headerWordWrap="true" width="80" textAlign="center" itemRenderer="tmp.PME5"/>
<mx:DataGridColumn headerText="Previous Month End Price" dataField="PrevMonthEndPrice" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil1" itemRenderer="tmp.PME5"/>
<mx:DataGridColumn headerText="% Difference" dataField="PrevMonthEndDelta" headerWordWrap="true" width="65" textAlign="right" labelFunction="formatUtil2" itemRenderer="tmp.PME5"/>
<mx:DataGridColumn headerText="Source" dataField="PrevMonthEndSource" headerWordWrap="true" width="100" textAlign="left" itemRenderer="tmp.PME5"/>
</mx:columns>
</mx:DataGrid>
</s:Application>
Since nothing so far has solved my problem, I decided to sidestep it altogether and port the program in question over to C#. Everything it working well so far.
Lazy answer? Yes.
Lazy solution? Unfortunately no.
精彩评论