Searching Array using Array.indexOf() function

Searching in Array using Array.indexOf() function is very easy :). For example,

var toys:Array = new Array();
toys.push("ball");
toys.push("bat");
toys.push("glows");
toys.push("pads");
toys.push(23);
toys.push(14);

var searchIndex:int = toys.indexOf(“ball”);
if(searchIndex == -1)
{
trace(“No! how can it be there”);
}
else
{
trace(“Yup! it’s there”); //output will be from here
}

So, it works fine when the value inside the indexed array is primitive – i.e. Number, String, Boolean etc. BUT it will not work when array contains objects of type Object. For example,

var toys:Array = new Array();
toys.push({name:"ball", count:2});
toys.push({name:"bat", count:2});
toys.push({name:"glows", count:2});
toys.push({name:"pads", count:2});
toys.push({name:"runs", count:200});
toys.push({name:"wickets", count:2});

var searchIndex:int = toys.indexOf({name:”ball”, count:2});
if(searchIndex == -1)
{
trace(“No! how can it be there”); //output will always be from here if you search an object
}
else
{
trace(“Yup! it’s there”);
}

So, that’s the case for objects. In the syntax of Array.indexOf(itemToSearch:*, fromIndex:int = 0), we notice that the first argument is * data type – i.e. it can be any data type, BUT it’s not working for Object. Would any one have lights on this?

Set TextField horizontal scroll to initial position

If you want to set the position of horizontal scroll position inside TextField, you can use TextField.scrollH.

Let’s say I am typing in the input TextField and I typed beyond the width of TextField. You will see the last characters visible you typed. Now due to some other event, say user clicks on other than this TextField, focus is changed to some other object than this TextField, you may want to reset the scroll position of TextField to starting characters in it.
You will use :
TextField.scrollH = 0;

This will set the horizontal scroll of TextField to 0 and hence showing the starting characters in TextField.

Loading Image using Loader.loadBytes()

Loader class can load image from ByteArray. I used this method before a year ago to set  a part of a screen for Screen Sharing application. Right now I was having a case where I need to create an image from Base64 encoded string. I am using following code to do this ::

var str:String = "";    //It won't be an empty string :) because it will a base64 encoded string of image.

var byteArr:ByteArray = Base64.converToByteArray(str);    //Here you can use any ready made library to decode and convert the String into ByteArray. I used ready made library from here.

var loader:Loader = new Loader();

loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onImageLoaded);

loader.loadBytes(byteArr);

function onImageLoaded(e:Event):void{

addChild(loader);

trace(loader.width + " : " + loader.height);

}

That’s it. This can be useful where you can not load the image from server because you don’t have the image but it’s data as string. May this can be useful to some one 🙂

Built-In Context Menu Items on Flash TextField

Is there any way to hide default context menu items on Flash TextField? Some one will try to answer with ContextMenu.hideBuiltInItems() function, but this function does not really work with Flash TextField. It does not hide the built in items.

So following code does work but not as expected ::

var myContextMenu:ContextMenu = new ContextMenu();
myContextMenu.hideBuiltInItems();

var txt:TextField = new TextField();
txt.contextMenu = myContextMenu;
addChild(txt);

Now if you right click on TextField then you will see that you can see all the built in item. Any one knows why?

Flash Player 10 Release Candidate

On August 11, 2008, Adobe released Flash Player 10 Release Candidate. This version has only one update from last Beta update and that is NSS, i.e. Flash Player 10 for Linux now supports Mozilla’s Network Security Services(NSS) for secure network connections.

You can find more information about this on adobe labs over Flash Player 10 release notes.

Flash: TextField.htmlText and Automatic Line Breaks

Problem :: When you deal with TextField.htmlText don’t append any html strings directly to htmlText property of TextField. Because the TextField appends “<br>” tag automatically before it appends any html string to htmlText property, it will set your string automatically in next line instead of the current line. This mistake is done to save memory as we don’t have to create a temporary string.

Example :

textField.htmlText = “”;                 //clear any previous texts

for(var i:uint = 0; i < 3; i++)
{
var str:String = “”;
str += “Hello World”;
str += “<br>”;                    //As you’re thinking of breaking line from here
textField.htmlText += str;
}

//output would be something like following ::
Hello World
//This line break because of <br> tag
Hello World         //This is an automatic line break
//This line break because of <br> tag
Hello World         //This is an automatic line break
//output finished

Possible Solution :: Create an empty string and append all the html strings to this string. When the final string is ready, assign this string to htmlText property of TextField. This will not create any unnecessary line breaks inside TextField.

Example :

textField.htmlText = “”;                 //clear any previous texts
var htmlStr:String = “”;                  //Temporary empty string

for(var i:uint = 0; i < 3; i++)
{
var str:String = “”;
str += “Hello World”;
str += “<br>”;                    //As you’re thinking of breaking line from here
htmlStr += str;
}

textField.htmlText = htmlStr;

//output would be something like following ::
Hello World
Hello World
Hello World
//output finished

Hope this would prevent someone from mistakes which I did 🙁

FlashDevelop and SVN Integration

Though FlashDevelop guys are working on integrating FlashDevelop with SVN, we can go with this handy tool.

To integrate SVN with FlashDevelop, you should have installed one of the SVN clients (say tortoiseSVN) on your machine.

FlashDevelop can be integrated with SVN using following steps ::

Step 1:

Create a file named build.bat in the directory containing your FlashDevelop project file and paste following code in that file :

@ECHO OFF

set TORTOISESVN_PATH = C:\Program Files\TortoiseSVN\bin
set CURRENT_PATH=%CD%

“%TORTOISESVN_PATH%\TortoiseProc.exe” /command:commit /path:”%CURRENT_PATH%\*”/logmsgfile:”%CURRENT_PATH%\logmsg.txt” /notempfile /closeonend:3

“%TORTOISESVN_PATH%\SubWCRev.exe” “%CURRENT_PATH%” “%CURRENT_PATH%\version.a” “%CURRENT_PATH%\version.txt”

pause

Step 2:

Also create another file named “version.a” with following content ::

major=0;
minor=1;
build=$WCREV$ ;
date=”$WCDATE$” ;

Step 3:

Now go to Flash Develop Project Explorer  Right clik on project  Properties  Build
In the Post-Build Command Line, add following line ::

$(ProjectDir)\build.bat

Step 4:

Press F8, when you want to commit files inside the FlashDevelop project.

You can fine more information regaring this on : FlashDevelop and SVN Integration

Ans: ActionScript 3.0 Object class Quiz

And here is the answer to quiz ::

undefined                                   //as property ‘prop1’ is not defined in obj2 and we pointed obj1 to obj2

Khokhaneshiya                          //now we defined ‘prop1’ in obj1 and set value ‘Khokhaneshiya’

//also obj2.prop1 will be Khokhaneshiya… You can trace out 🙂

What you were thinking? 🙂

ActionScript 3.0 Object class Quiz

Check following code ::

var obj1:Object = new Object();
obj1.prop1 = “Naresh”;
obj1.prop2 = “Khokhaneshiya”;
var obj2:Object = new Object();
obj2.prop2 = “Hello world”;
obj1 = obj2;
trace(obj1.prop1);
//What will be output here
obj1.prop1 = “Khokhaneshiya”;
trace(obj1.prop1);
//What will be output here

Be honest, Don’t trace it out using Flash.

You will have answer in following posts !

AIR and Network Detection

We can detetct the network in AIR using following code ::

Need to use ‘ServiceMonitorShim’ complied clip from AIR components in your fla file.

import air.net.URLMonitor;
import flash.net.URLRequest;
import flash.events.StatusEvent;
var monitor:URLMonitor;
monitor = new URLMonitor(new URLRequest(‘http://192.168.0.57’));
monitor.addEventListener(StatusEvent.STATUS, announceStatus);
monitor.start();
function announceStatus(e:StatusEvent):void
{
         trace(“Status change. Current status: ” + monitor.available);
}