article

_MSN In Visual Basic_

Email
Submitted on: 1/29/2015 10:52:00 PM
By: BelgiumBoy_007 (from psc cd)  
Level: Beginner
User Rating: By 31 Users
Compatibility: VB 3.0, VB 4.0 (16-bit), VB 4.0 (32-bit), VB 5.0, VB 6.0
Views: 2874
 
     This article will cover the most important aspects of programming MSN using Visual Basic.

This article has accompanying files

 
				





Programming MSN Messenger using Visual Basic.

This article will cover the more simple actions that can be done.  Here is a list of the different topics:

If you want the code for a fully functioning MSN-Bot then click here.

Intro.

So you want to know how to program MSN Messenger using Microsoft Visual Basic?   Well you've come to the right place.  I'll take you thru the basics.  I'm going to assume that you already know some Visual Basic so I'll concentrate on explaining the MSN-related code.  I hope this article will help you and if you have any questions than please don't hesitate to ask me.

IMPORTANT : The codes here will not work with the new version of MSN Messenger (5.0), only with versions 4.7 or below.  The ideal version is 4.6.

Back to top

What does Visual Basic allow me to do ?

With Visual Basic you can basically do anything that MSN Messenger can do.  Al you do using Visual Basic is send commands to the MSN program, which is why your program will not work if MSN Messenger version 4.7 or below is not running.  You do not have to be signed in to the .NET Messenger Service but the program must be running.  This means that you can send/receive Instant Messages, add/remove contacts, change your nickname, change your status, go to you e-mail inbox, ...

Back to top

Declaring the appropriate variables.

First you have to add the Messenger references to your project.  Go to Projects > Preferences... and select the following references:
  • Messenger Type Library                     (found at C:\Program Files\Messenger\msmsgs.exe)
  • Messenger API Type Library               (found at C:\Program Files\Messenger\msmsgs.exe\3)
  • Messenger AddIns Type Library         (found at C:\Program Files\Messenger\msmsgs.exe\4)
  • Messenger Private Type Library         (found at C:\Program Files\Messenger\msmsgs.exe\2)

You most likely won't need all of them but it's best to add them anyway.  Now you need to declare the standard variable.  There are 2 that we will be using in this tutorial, the second one can be declared in two different ways.  The first one is a variable using the API Type Library.  We'll call it MSNAPI:

Private MSNAPI As New MessengerAPI.Messenger

The second one will use the Messenger Type Library, we'll call this one MSN:

Private MSN As New MsgrObject

with both of these declarations you can leave out the New but then you'll have to add this to your code:

Private Sub Form_Load()
 Set MSN = New MsgrObject
Set MSNAPI = New MessengerAPI.Messenger
End Sub

Why would we use the second method ?  Simple, when we want to add the WithEvents option we have to leave it out.  Most of the time you are going to be using the second method because then you can keep track of what's happening in MSN and even block most of the events.  Then the declaration would look like this:

Private WithEvents MSN As MsgrObject
Private WithEvents MSNAPI As MessengerAPI.Messenger

But for this article we will use the first method simply because it's shorter.

Back to top

Signing in to/out of the .NET Messenger Service.

This is very simple.  Create a new project, add the references and on the form put 2 Labels (lblUserEmail & lblPassword), 2 TextBoxes (txtUserEmail & txtPassword) and 2 CommandButtons (cmdSignIn & cmdSignOut).  Now enter the following code:
Private MSN As New MsgrObject
Private Sub cmdSignIn_Click()
On Error Resume Next
MSN.Logon txtUserEmail.Text, txtPassword.Text, MSN.Services.PrimaryService
End Sub
Private Sub cmdSignOut_Click()
On Error Resume Next
MSN.Logoff
End Sub

As you can see it isn't hard at all.  I've put in error handling because if you try to Sign In when you are already signed in you will get an error and the same with signing out.

The code for this example can be found in folder number 1.

Back to top

Change your nickname.

It only takes one line of code but unfortunately because you are using the running MSN Messenger program you can't change your nickname to everything you want.  Rude words, websites and some other words will not work.  Create a new project, add the references and on the form put a Label (lblNewNickName), a TextBox (txtNewNickName) and a CommandButton (cmdChangeNickName).  Enter the following code:
Private MSN As New MsgrObject
Private Sub cmdChangeNickName_Click()
If MSN.LocalState = MSTATE_OFFLINE Then
MsgBox "You are not Signed In"
Else
MSN.Services.PrimaryService.FriendlyName = txtNewNickName.Text
txtNewNickName.Text = ""
End If
End Sub

You may have noticed that the following also exists:

MSN.LocalFriendlyName

This is read only so it will not work.  When a user presses the button then first the program will make sure that you are Signed In and if you aren't it will give a Message Box.

The code for this example can be found in folder number 2.

Back to top

Change your status.

This is also very easy.  Create a new project, add the references and on the form put 7 OptionButtons (optOnline, optBusy, optBeRightBack, optAway, optOnThePhone, optOutToLunch & optAppearOffline).  Next, insert the following code:
Private MSN As New MsgrObject
Private Sub Form_Load()
Select Case MSN.LocalState
Case MSTATE_ONLINE
optOnline.Value = True
Case MSTATE_BUSY
optBusy.Value = True
Case MSTATE_BE_RIGHT_BACK
optBeRightBack.Value = True
Case MSTATE_AWAY
optAway.Value = True
Case MSTATE_ON_THE_PHONE
optOnThePhone.Value = True
Case MSTATE_OUT_TO_LUNCH
optOutToLunch.Value = True
Case MSTATE_INVISIBLE
optAppearOffline.Value = True
End Select
End Sub
Private Sub optAppearOffline_Click()
MSN.LocalState = MSTATE_INVISIBLE
End Sub
Private Sub optAway_Click()
MSN.LocalState = MSTATE_AWAY
End Sub
Private Sub optBeRightBack_Click()
MSN.LocalState = MSTATE_BE_RIGHT_BACK
End Sub
Private Sub optBusy_Click()
MSN.LocalState = MSTATE_BUSY
End Sub
Private Sub optOnline_Click()
MSN.LocalState = MSTATE_ONLINE
End Sub
Private Sub optOnThePhone_Click()
MSN.LocalState = MSTATE_ON_THE_PHONE
End Sub
Private Sub optOutToLunch_Click()
MSN.LocalState = MSTATE_OUT_TO_LUNCH
End Sub

When you run the program it will first check what your status is and set the appropriate OptionButton value to true.  Then depending on which OptionButton has been clicked it will change your status.  Here's a list of all of the MSN.LocalState constants:

  • MSTATE_AWAY
  • MSTATE_BE_RIGHT_BACK
  • MSTATE_BUSY
  • MSTATE_IDLE
  • MSTATE_INVISIBLE
  • MSTATE_LOCAL_CONNECTING_TO_SERVER
  • MSTATE_LOCAL_DISCONNECTING_FROM_SERVER
  • MSTATE_LOCAL_FINDING_SERVER
  • MSTATE_LOCAL_SYNCHRONIZING_WITH_SERVER
  • MSTATE_OFFLINE
  • MSTATE_ON_THE_PHONE
  • MSTATE_ONLINE
  • MSTATE_OUT_TO_LUNCH
  • MSTATE_UNKNOWN

The code for this example can be found in folder number 3.

Back to top

Send your contacts list to a listbox.

This is a bit more complicated than the last 3 topics.  Create a new project, add the references and on the form put 2 Labels (lblOnlineContacts & lblOfflineContacts), 2 ListBoxes (lstOnlineContacts & lstOfflineContacts) and a CommandButton (cmdRefreshList).  Now insert the following code:
Private MSN As New MsgrObject
Private Sub RefreshList()
lstOfflineContacts.Visible = False
lstOnlineContacts.Visible = False
Dim User As IMsgrUser
lstOnlineContacts.Clear
lstOfflineContacts.Clear
For Each User In MSN.List(MLIST_CONTACT)
If User.State = MSTATE_OFFLINE Then
lstOfflineContacts.AddItem (User.EmailAddress)
Else
lstOnlineContacts.AddItem (User.EmailAddress)
End If
Next
lstOfflineContacts.Visible = True
lstOnlineContacts.Visible = True
End Sub
Private Sub cmdRefreshList_Click()
If MSN.LocalState <> MSTATE_OFFLINE Then RefreshList
End Sub
Private Sub Form_Load()
cmdRefreshList_Click
End Sub

The most important part of this code is the RefreshList() sub.  Here we first hide both the ListBoxes and at the end show them again so there's no flickering.  Next we declare another variable (User), you can set this variable to any user and get their nickname, send a message, ... .  In the For - Next loop we go thru all the contacts and check their current status.  Of they are offline then we add them to the offline contacts ListBox, otherwise the offline contacts ListBox.  In this code the e-mail address of every contact is added to the list but you can also add the nickname of every contact, just change User.EmailAddress to User.FriendlyName.

The code for this example can be found in folder number 4.

Back to top

Send your contacts list to a treeview.

This is the more advanced way of displaying your contacts list, this will look almost identical to the way that MSN displays your list.  Create a new project, add the references, add Microsoft Windows Common Controls 6.0 (SP4) (found in C:\Windows\System32\mscomctl.ocx) and on the form put a Label (lblContacts), a TreeView (tContacts), a CommandButton (cmdRefreshList) and an ImageList (ilsIcons).  Add all the picture files found in folder number 5 to the ImageList and use the exact filename without the extension as the key (keep in mind that it's case sensitive).  Now insert the following code into your form:
Private MSN As New MsgrObject
Private Sub RefreshList()
tContacts.Visible = False
tContacts.Nodes.Clear
Dim User As IMsgrUser
Dim UsersOnline As Integer
Dim UsersOffline As Integer
For Each User In MSN.List(MLIST_CONTACT)
If User.State = MSTATE_OFFLINE Then
UsersOffline = UsersOffline + 1
Else
UsersOnline = UsersOnline + 1
End If
Next
tContacts.Nodes.Add , , "Online", "Online (" & UsersOnline & ")", "Up", "UpSelected"
With tContacts.Nodes(1)
.Selected = False
.Expanded = True
.Bold = True
.ForeColor = &H8000000D
.Sorted = True
End With
tContacts.Nodes.Add , , "Offline", "Offline (" & UsersOffline & ")", "Down", "DownSelected"
With tContacts.Nodes(2)
.Selected = True
.Expanded = False
.Bold = True
.ForeColor = &H8000000D
.Sorted = True
End With
For Each User In MSN.List(MLIST_ALLOW)
Select Case User.State
Case MSTATE_AWAY
tContacts.Nodes.Add "Online", tvwChild, User.EmailAddress, User.FriendlyName, & _
" (Away)", "Away", "AwaySelected"
Case MSTATE_BE_RIGHT_BACK
tContacts.Nodes.Add "Online", tvwChild, User.EmailAddress, User.FriendlyName, & _
" (Be Right Back)", "Away", "AwaySelected"
Case MSTATE_BUSY
tContacts.Nodes.Add "Online", tvwChild, User.EmailAddress, User.FriendlyName, & _
" (Busy)", "Busy", "BusySelected"
Case MSTATE_OFFLINE
tContacts.Nodes.Add "Offline", tvwChild, User.EmailAddress, User.FriendlyName, & _
"Offline", "OfflineSelected"
Case MSTATE_ON_THE_PHONE
tContacts.Nodes.Add "Online", tvwChild, User.EmailAddress, User.FriendlyName, & _
" (On The Phone)", "Busy", "BusySelected"
Case MSTATE_ONLINE
tContacts.Nodes.Add "Online", tvwChild, User.EmailAddress, User.FriendlyName, & _
"Online", "OnlineSelected"
Case MSTATE_OUT_TO_LUNCH
tContacts.Nodes.Add "Online", tvwChild, User.EmailAddress, User.FriendlyName, & _
" (Out To Lunch)", "Away", "AwaySelected"
End Select
Next
For Each User In MSN.List(MLIST_BLOCK)
If User.State = MSTATE_OFFLINE Then
tContacts.Nodes.Add "Offline", tvwChild, User.EmailAddress, User.FriendlyName
& " (Blocked)", "Blocked", "BlockedSelected"
Else
tContacts.Nodes.Add "Offline", tvwChild, User.EmailAddress, User.FriendlyName
& " (Blocked)", "Blocked", "BlockedSelected"
End If
Next
tContacts.Visible = True
End Sub
Private Sub cmdRefreshList_Click()
RefreshList
End Sub
Private Sub Form_Load()
RefreshList
End Sub
Private Sub tContacts_NodeClick(ByVal Node As MSComctlLib.Node)
If Node.Key = "Offline" Or Node.Key = "Online" Then
If Node.Expanded = True Then
Node.Expanded = False
Node.Image = "Down"
Node.SelectedImage = "DownSelected"
Else
Node.Expanded = True
Node.Image = "Up"
Node.SelectedImage = "UpSelected"
End If
Else
End If
End Sub

Here the first thing the program will do is see how many of your contacts are online/offline and it will add the 2 tags, then it formats the tags to make them look good.   After that it goes thru all of the contacts and adds them to the list, they will have a different caption and image depending on their status.  Notice how I put in some code to handle the NodeClick event.  This is so that the arrow changes from up to down or down to up.

The code for this example can be found in folder number 5.

Back to top

Send an Instant Message.

To do this we will use some of the previous code.  Create a new project, add the references and on the form put a Label (lblOnlineContacts), a ListBox (lstOnlineContacts) and 2 CommandButtons (cmdRefreshList & cmdSendIM).  Insert the following code:
Private MSN As New MsgrObject
Private Sub RefreshList()
lstOnlineContacts.Visible = False
Dim User As IMsgrUser
lstOnlineContacts.Clear
For Each User In MSN.List(MLIST_CONTACT)
If User.State <> MSTATE_OFFLINE Then lstOnlineContacts.AddItem (User.EmailAddress)
Next
lstOnlineContacts.Visible = True
End Sub
Private Sub cmdRefreshList_Click()
If MSN.LocalState <> MSTATE_OFFLINE Then RefreshList
End Sub
Private Sub cmdSendIM_Click()
Dim User As IMsgrUser
Dim bstrMsgHeader As String
Dim bstrMsgText As String
If MSN.LocalState = MSTATE_OFFLINE Then
MsgBox "You are not Signed In"
Else
If MSN.LocalState = MSTATE_INVISIBLE Then
MsgBox "Change you status first !"
Else
Set User = MSN.CreateUser(lstOnlineContacts.Text, MSN.Services.PrimaryService)
bstrMsgText = InputBox("Enter text to send", "Send What ?", "Howdy", Me.Left, Me.Top)
User.SendText bstrMsgHeader, bstrMsgText, MMSGTYPE_NO_RESULT
MsgBox "The following message was sent to " & User.EmailAddress & " : " & bstrMsgText
End If
End If
End Sub
Private Sub Form_Load()
cmdRefreshList_Click
End Sub

First we fill up the ListBox again but we only fill up the one with the online contacts, we don't need to know who's offline only who's online.  Then when the user presses the Send IM button we make sure that we appear to be online to all users and send the message.  The code is pretty straightforward.

The code for this example can be found in folder number 6.

Back to top

Open an IM window.

This is the only example where we will use the MSNAPI variable.  Because this example is almost exactly the same as the previous one I'll only display the change.   The first change is the gobal variable declaration:
Private MSN As New MsgrObject
Private MSNAPI As New MessengerAPI.Messenger

The second and final change is the cmdSendIM_Click() sub:

Private Sub cmdSendIM_Click()
MSNAPI.InstantMessage (lstOnlineContacts.Text)
End Sub

That's it.

The code for this example can be found in folder number 7.

Back to top

Block/unblock contacts.

To block or unblock a contact we need to do two things.  Remove him from one list and add him to the other.  Create a new project, add the references and on the form put 2 Labels (lblBlock & lblAllow), 2 ListBoxes ( lstBlock & lstAllow) and 3 CommandButtons (cmdAllow, cmdBlock & cmdRefreshLists).  And here's the code:
Private MSN As New MsgrObject
Private Sub RefreshLists()
lstBlock.Visible = False
lstAllow.Visible = False
lstBlock.Clear
lstAllow.Clear
Dim User As IMsgrUser
For Each User In MSN.List(MLIST_BLOCK)
lstBlock.AddItem (User.EmailAddress)
Next
For Each User In MSN.List(MLIST_ALLOW)
lstAllow.AddItem (User.EmailAddress)
Next
lstBlock.Visible = True
lstAllow.Visible = True
End Sub
Private Sub cmdAllow_Click()
Dim User As IMsgrUser
Set User = MSN.CreateUser(lstBlock.Text, MSN.Services.PrimaryService)
MSN.List(MLIST_ALLOW).Add User
MSN.List(MLIST_BLOCK).Remove User
lstAllow.AddItem (lstBlock.Text)
lstBlock.RemoveItem (lstBlock.ListIndex)
End Sub
Private Sub cmdBlock_Click()
Dim User As IMsgrUser
Set User = MSN.CreateUser(lstAllow.Text, MSN.Services.PrimaryService)
MSN.List(MLIST_ALLOW).Remove User
MSN.List(MLIST_BLOCK).Add User
lstBlock.AddItem (lstAllow.Text)
lstAllow.RemoveItem (lstAllow.ListIndex)
End Sub
Private Sub cmdRefreshLists_Click()
RefreshLists
End Sub
Private Sub Form_Load()
RefreshLists
End Sub

The code isn't really that hard to understand.  Make sure you always remember that the user you removed from one list has to be added to the other list or your MSN Messenger will do weird things when you want to send Instant Messages to that particular person.

The code for this example can be found in folder number 8.

Back to top

Add/remove contacts.

Create a new project, add the references and on the form put a Label (lblContacts), a ListBox (lstContacts) and 3 CommandButtons (cmdAddContact, cmdRemoveContact & cmdRefreshList).  Now insert the following code:
Private MSN As New MsgrObject
Private Sub RefreshList()
lstContacts.Visible = False
lstContacts.Clear
Dim User As IMsgrUser
For Each User In MSN.List(MLIST_CONTACT)
lstContacts.AddItem (User.EmailAddress)
Next
lstContacts.Visible = True
End Sub
Private Sub cmdAddContact_Click()
Dim User As IMsgrUser
Set User = MSN.CreateUser(InputBox("Enter users e-mail address.", "Add Contact", "", Me.Left, Me.Top), _
MSN.Services.PrimaryService)
MSN.List(MLIST_CONTACT).Add User
MSN.List(MLIST_ALLOW).Add User
lstContacts.AddItem User.EmailAddress
End Sub
Private Sub cmdRefreshList_Click()
RefreshList
End Sub
Private Sub cmdRemoveContact_Click()
On Error Resume Next
Dim User As IMsgrUser
Set User = MSN.CreateUser(lstContacts.Text, MSN.Services.PrimaryService)
MSN.List(MLIST_ALLOW).Remove User
MSN.List(MLIST_CONTACT).Remove User
MSN.List(MLIST_BLOCK).Remove User
lstContacts.RemoveItem (lstContacts.ListIndex)
End Sub
Private Sub Form_Load()
RefreshList
End Sub

First we add all of our contacts to the ListBox.  Then when a user wants to add a contact they get an InputBox to enter the user's e-mail address into.  We set the User variable to that e-mail address and add it to the allow and contact list.  Then we add it to the ListBox.   When removing a contact we must make sure we remove the User object from whatever list it might be on, we don't know if that particular contact is blocked or not.  Don't forget the error handling as we will get an error because the contact is either on the allow or block list, not both.  Then finally we remove the user from the ListBox.

The code for this example can be found in folder number 9.

Back to top

Handling MSN events.

This particular topic doesn't have a project to go along with it.  I'm going to take you thru the most important MSN events and explain how to use them.  The following topic is an example of how to use the MSN events in your program.
Private Sub msn_OnListAddResult(ByVal hr As Long, ByVal MLIST As Messenger.MLIST, ByVal pUser As _
Messenger.IMsgrUser)
End Sub

This will happen when a user is added to any one of the 4 lists.  This is important so you can update your contacts list, when a user is blocked he or she will be ADDED to the block list.  pUser tells you which user was added to the list and MLIST specifies which list the user was added to.

Private Sub msn_OnListRemoveResult(ByVal hr As Long, ByVal MLIST As Messenger.MLIST, ByVal pUser As _ 
Messenger.IMsgrUser)
End Sub

This will happen when a user is removed from any one of the 4 lists.  This is also important so you can update your contacts list, when a user is unblocked he or she will be REMOVED from the block list.  pUser tells you which user was removed from the list and MLIST specifies which list the user was removed from.

Private Sub msn_OnLocalFriendlyNameChangeResult(ByVal hr As Long, ByVal pService As _
Messenger.IMsgrService, ByVal bstrPrevFriendlyName As String)
End Sub

This will happen when your nickname has been changed.  pService specifies the service you are currently connected to and bstrPrevFriendlyName tells you what your nickname was before it was changed.

Private Sub msn_OnLocalStateChangeResult(ByVal hr As Long, ByVal mLocalState As _
Messenger.MSTATE, ByVal pService As Messenger.IMsgrService)
End Sub

This will happen when your state has been changed.  mLocalState tells you what your current state is and pService specifies the service you are connected to.

Private Sub msn_OnLogoff()
End Sub

I don't think I need to explain this one.  Just keep in mind that if the user exits MSN that this event will not be triggered, only if he or she shuts down his or her computer or if they just Sign Out.

Private Sub msn_OnLogonResult(ByVal hr As Long, ByVal pService As Messenger.IMsgrService)
End Sub

This will happen when the user has successfully Signed In.  pService tells you which service the user Signed In to.

Private Sub msn_OnTextReceived(ByVal pIMSession As Messenger.IMsgrIMSession, ByVal _
pSourceUser As Messenger.IMsgrUser, ByVal bstrMsgHeader As String, ByVal bstrMsgText As _
String, pfEnableDefault As Boolean)
End Sub

This will happen when the user receives text.  This could mean 2 things :

1) Someone has said something to the user.

2) Someone has started to type something to the user but has not yet sent it.

pIMSession tells you which session the event has been sent to, pSourceUser tells you which user sent the text, bstrMsgHeader contains information regarding the font of the text and if it is the second case (see above) this is something else, bstrMsgText lets you know which text was sent and pfEnableDefault is used to block the information from going to the IM box.  If you set pfEnableDefault to False then the user will not receive the message.

Private Sub msn_OnUnreadEmailChanged(ByVal MFOLDER As Messenger.MFOLDER, ByVal cUnreadEmail _
As Long, pfEnableDefault As Boolean)
End Sub

This will happen when the user receives an e-mail.  MFOLDER tells you which folder it was sent to (Inbox or not), cUnreadEmail is the amount of unread e-mails in total and if you set pfEnableDefault to False the user won't get that popup telling them.

Private Sub msn_OnUserFriendlyNameChangeResult(ByVal hr As Long, ByVal pUser As _
Messenger.IMsgrUser, ByVal bstrPrevFriendlyName As String)
End Sub

This will happen when a user changes his or her nickname.  pUser tells you which user changed their nickname and bstrPrevFriendlyName tells you what their nickname was before they changed it.  TIP : to find out what their current nickname is use this : pUser.FriendlyName.

Private Sub msn_OnUserStateChanged(ByVal pUser As Messenger.IMsgrUser, ByVal mPrevState As _
Messenger.MSTATE, pfEnableDefault As Boolean)
End Sub

This will happen when a user changes his or her status.  pUser tells you which user changed their status and mPrevState tells you what their status was before they changed it.

Back to top

Creating a self-updating contacts list.

To do this we're just going to make a few minor adjustments to a previous project, the one that sends your contact list to a treeview.   The first change we'll make is the variable declaration, this is what it should look like now:
Private WithEvents MSN As MsgrObject

The second change is the Form_Load() sub, it should look like this:

Private Sub Form_Load()
Set MSN = New MsgrObject
RefreshList
End Sub

Then finally we have to add the following:

Private Sub MSN_OnUserStateChanged(ByVal pUser As Messenger.IMsgrUser, ByVal mPrevState As _
Messenger.MSTATE, pfEnableDefault As Boolean)
RefreshList
End Sub

That's it.

The code for this example can be found in folder number 10.

Back to top

winzip iconDownload article

Note: Due to the size or complexity of this submission, the author has submitted it as a .zip file to shorten your download time. Afterdownloading it, you will need a program like Winzip to decompress it.Virus note:All files are scanned once-a-day by Planet Source Code for viruses, but new viruses come out every day, so no prevention program can catch 100% of them. For your own safety, please:
  1. Re-scan downloaded files using your personal virus checker before using it.
  2. NEVER, EVER run compiled files (.exe's, .ocx's, .dll's etc.)--only run source code.
  3. Scan the source code with Minnow's Project Scanner

If you don't have a virus scanner, you can get one at many places on the net including:McAfee.com


Other 16 submission(s) by this author

 


Report Bad Submission
Use this form to tell us if this entry should be deleted (i.e contains no code, is a virus, etc.).
This submission should be removed because:

Your Vote

What do you think of this article (in the Beginner category)?
(The article with your highest vote will win this month's coding contest!)
Excellent  Good  Average  Below Average  Poor (See voting log ...)
 

Other User Comments


 There are no comments on this submission.
 

Add Your Feedback
Your feedback will be posted below and an email sent to the author. Please remember that the author was kind enough to share this with you, so any criticisms must be stated politely, or they will be deleted. (For feedback not related to this particular article, please click here instead.)
 

To post feedback, first please login.