Link to home
Start Free TrialLog in
Avatar of ranhell
ranhellFlag for Mexico

asked on

Flash CS3 AS3 Error Combo Box

I have the following attached file, And It work, but I tried to Added to another file and I get the an error see code snipet
TypeError: Error #1010: A term is undefined and has no properties.
                at MethodInfo-415()
                at MethodInfo-414()
                at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
                at flash.events::EventDispatcher/dispatchEvent()
                 
TypeError: Error #1010: A term is undefined and has no properties.
                at MethodInfo-415()
                at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
                at flash.events::EventDispatcher/dispatchEvent()
                at fl.controls::ComboBox/fl.controls:ComboBox::onListChange()
                at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
                at flash.events::EventDispatcher/dispatchEvent()
                at fl.controls::SelectableList/fl.controls:SelectableList::handleCellRendererClick

Open in new window

xml.fla
Avatar of ranhell
ranhell
Flag of Mexico image

ASKER

attached is the XLM file
test.xml
Running the files you provided, I don't get any error.  You would need to attach the .FLA that is throwing the error for me to give you better information.
actionscript.org had some hints on what all this MethodInfo stuff is about (http://www.actionscript.org/forums/showthread.php3?t=183670).  Based on that and on the error you pasted, I can tell you that you have an "anonymous function" that has an error somewhere inside it.  An example of an anonymous function is the second argument to the addEventListener below:
addEventListener( Event.COMPLETED, function ( e:Event ) { trace( "Now within the anonymous function." ); } );
So you have an anonymous function that gets invoked when the list of the combobox changes.  The specific error is that you're setting something within that function that doesn't exist, for example:
trace( my_movie_clip.zxvzeaewrsdafzdaf );
would cause this error, unless zxvzeaewrsdafzdaf  is defined within my_movie_clip.
Putting these bits of data together, look for an addEventListener for comboBox that looks at either Event.CHANGE or ListEvent.ITEM_CLICK and uses an anonymous function.  (looking within the ComboBox code in C:\Program Files\Adobe\Adobe Flash CS4\Common\Configuration\Component Source\ActionScript 3.0\User Interface\fl\controls, those are the only two events which call onListChange, and I see that onListChange forwards the event).  That means, if you search your .fla, you'll find code that does one of the following:
...addEventListener( Event.CHANGE, function(...                   or
...addEventListener( ListEvent.ITEM.CLICK, function( ...
and the error will be somewhere within that anonymous function.  Something within that function will be attempted to read a member of an object that doesn't exist.
That's all I can tell you without seeing the .fla you added the code to.  The .fla you attached doesn't have any anonymous functions, so you'll never see this exact error from it.
Good luck!
what do you mean by "but I tried to Added to another file" - how are you doing this.

if you use the loaderClass to load your swf it works fine.
Avatar of ranhell

ASKER

OK, I think the problem is when I make the code an Action Script File and include it into the FLA
I've attached the FLA and the AS files


Loadxml.fla
Loadxml.as
Ok, now we're getting somewhere!
By the way, the error message I get is much more clear than the error you posted.  Life is a lot easier if you use Debug->Debug Movie to test with.  (Any time I want to test, I use ctrl-shift-enter, which does the same thing.)
Here's the error message I get:
TypeError: Error #1010: A term is undefined and has no properties.
 at Loadxml_fla:MainTimeline/Loadcategory/Loadxml_fla:updateItems()[D:\flash_workbench\quick_ee\Loadxml.as:32]
 at Loadxml_fla:MainTimeline/Loadcategory/Loadxml_fla:completedLoad()[D:\flash_workbench\quick_ee\Loadxml.as:26]
 at flash.events::EventDispatcher/dispatchEventFunction()
 at flash.events::EventDispatcher/dispatchEvent()
 at flash.net::URLLoader/onComplete()

This is much more clear - it's saying that the error occurs when you call updateItems from within completedLoad.  The offending line is
  var str = this.categoriescb.selectedItem["label"];
 
Interestingly enough, the issue that is causing your problem is the word "this".  Since you included the function, and it's a global-level function without an attached object, the "this" throws it off.  Using "this" makes sense when you have an object, but since you don't, it can't find "this.categoriescb".  Simply change the line to
var str = categoriescb.selectedItem["label"];
and you're working again.  
Since you loaded it all in as a function, and you had function inside functions, they got stored as anonymous ones, even though you gave them names.  It looks like you're really close to making it object oriented.  I'm attaching files that show you some neater alternatives to what you had.  I would recommend not including the file and not having them all massed in to one function, but to each their own.
The code I'm attaching is a fully object-oriented version of what you want.  I've added some comments that might help clarify how to object orient.  Save this code in a file ComboBoxHandler.as in the same folder as your .fla, and all you need in your .fla actions is a single line:
var cbh:ComboBoxHandler = new ComboBoxHandler( categoriescb, itemscb, "test.xml" );
Do that, and you're done.
I'm also attaching a .as file, which is an edit of what you had.  The major difference is that I made it so you don't have functions embedded within functions.  If you're not looking for object oriented, this is the best way for you to set up and include your functions.  You'll notice it's very similar in style to the object-oriented solution - vars that need to be shared are declared outside of the scope of the function, and each function is distinct.  The major difference is the object-oriented solution doesn't hardcode the combo boxes or the url.

// all as3 classes should have a package layer.  If you move the file to a different folder, you'll have to make it match
package
{
	// first you have your imports
	import fl.controls.ComboBox;
	import flash.events.Event; 
	import flash.net.URLLoader;
	import flash.net.URLRequest;

	// declare a public class.  One class per file.
	public class ComboBoxHandler
	{
		// these are the class properties, used by the class.  Since I set them private, nothing else can see them.
		private var requestPath:String;
		private var ldr:URLLoader;
		private var comboBoxCategories:ComboBox;
		private var comboBoxItems:ComboBox;
		private var config:XML;
		
		// this is the constructor.  It runs initialization routines
		public function ComboBoxHandler( cbCategories:ComboBox, cbItems:ComboBox, file:String )
		{
			// here we take the reference to the combobox and store it inside the object.
			this.comboBoxCategories = cbCategories;
			this.comboBoxItems = cbItems;
			
			var url:URLRequest = new URLRequest( "test.xml" );
			// note that "this.ldr" is referring to the ldr declared on line 15.  The "this." is optional, but helps show that this is a class variable.
			this.ldr = new URLLoader();
			this.ldr.addEventListener( Event.COMPLETE, this.completedLoad );
			this.ldr.load( url ); 
		}
	
		function completedLoad( event:Event=null ):void
		{
			if (this.ldr.data)
			{
				this.config = XML(this.ldr.data);
				for each (var cat:XML in this.config.category)
				{
					var str:String = cat.@name.toString();
					var obj:Object = new Object();
					obj["label"] = str;
					obj["data"] = str;
					this.comboBoxCategories.addItem( obj );
				}
			}
			this.comboBoxCategories.addEventListener( Event.CHANGE, this.updateItems );
			this.comboBoxCategories.selectedIndex = 0;
			this.updateItems();
		}
		
		function updateItems( event:Event=null ):void
		{
			this.comboBoxItems.removeAll();
		
			var str = this.comboBoxCategories.selectedItem["label"];
			for each (var item:XML in this.config.category.(@name == str).item)
			{
				var name_str:String = item.id.toString();
				var obj:Object = new Object();
				obj["label"] = name_str;
				obj["data"] = name_str;
				this.comboBoxItems.addItem( obj );
			}
		} 
	}
}

Open in new window

Loadxml.as
Avatar of ranhell

ASKER

Firts of all I'm glad you responded
Well ....what can I say, "YOU're RIGHT" ..!! again
You always exeeds my expectations, amazing, but also make me wonder about some other concepts I'm still learning

Now, as usual, Can I ask a couple of questions before I grant you the points.
This following question I've already tested it myself and it does work, I just wanted to make sure I'm on the right track and see if you had any comments on this
1.-Once you compile the Fla file and exported to swf, you don't need to include the as files in the hosting server right...? I mean. I don't need to copy the as files in the hosting server for the swf file to work..?
2.-Do you know how to use relative paths..? perhaps a as3 function...!!
for example if I were to use the xml folder, I'm using a variable var xmlpath:String = "xml/"

Finally but most important I'm reading xml files with spanish lenguage and they have accents and punctuations and especial caracters that currently they don't display correctly....
Do you know how to explicity say which lenguage your're using so the caracters display correct.

Thanks so much for UR help, you're becoming my favorite expert....



ASKER CERTIFIED SOLUTION
Avatar of Carnou
Carnou
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of ranhell

ASKER

FYI
I figure it out, about the spanish characters, I use the CDATA code , set the text.htmlText and also embeded the Latin I fonts into it and it worked.

As of the original question, your rock....!!! thanks again for UR help and time.

see you next time I'm trouble.....
Avatar of ranhell

ASKER

Excellent, as usual..!!
Avatar of ranhell

ASKER

Hey Carnou
This is me again asking for help
Could you take a look at it, if you have a chance.....???

https://www.experts-exchange.com/questions/26166920/FLASH-AS3-contact-form-to-PHP.html#firstComment