Archive for February 8th, 2007

Posted on Feb 8th, 2007

With Events and Handles clause requires form us to declare the object variable and the event handler as we write our code, so linkage is created upon compilation. On the other hand, with AddHandler and RemoveHandler, linkage is created and removed at runtime, which is more flexible.

Let’s assume that we want to load several MDI child forms, allowing each of them to be loaded only once, and of course to know when one of the child forms is closed. Since we have several forms to load we would like to use the AddHandler and RemoveHandler keywords so we can be flexible and write the minimal code we can.

Let’s get dirty.

1. In each MDI child form we have to declare a public event.
Public Event FormClosed(ByVal f As Form)

2. In each MDI child form we have to use the Form_Closed method which handles the MyBase.Closed class and raise the FormClosed event.

Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles MyBase.Closed RaiseEvent FormClosed(Me)End Sub

3. On our MDI form we need to declare two member variables. The first’s of type Form and the second’s type is ArrayList.
Private m_f(0) as Form
Private m_sLoadedChildForms As New ArrayList

4. We need to implement a method the will search the MDI child forms that are loaded. We’ll also use this method when we unload the MDI child forms.

Private Function SearchChildForm(ByVal strSearchForm As String, _Optional ByVal idxEventHandler As Long = -1) As Long Dim i As Long = 0

 For i = 0 To m_sLoadedForms.Count - 1 If m_sLoadedForms.Item(i) = strSearchForm Then Dim j As Long = 0 For j = m_f.GetLowerBound(0) To m_f.GetUpperBound(0) If m_f(j).Name = strSearchForm Then idxEventHandler = j Next j Return i End If Next Return -1End Function

5. We need to implement a method to load the mdi child forms and use the SearchChildForm method in order not to load the same mdi child form second time.

Private Sub LoadChildForms(ByVal f As Form) If m_f.GetUpperBound(0) > 0 Then ReDim Preserve m_f(m_f.GetUpperBound(0) + 1) End If m_f(m_f.GetUpperBound(0)) = f

 If Not SearchChildForm(m_f(m_f.GetUpperBound(0)).Name()) >= 0 Then m_f(m_f.GetUpperBound(0)).MdiParent = Me

 AddHandler m_f(m_f.GetUpperBound(0)).Closed, _ AddressOf UnloadChildForm m_f(m_f.GetUpperBound(0)).Show()

 m_sLoadedChildForms.Add(m_f(m_f.GetUpperBound(0)).Name) Else If m_f.GetUpperBound(0) > 0 Then ReDim Preserve m_f(m_f.GetUpperBound(0) - 1) End If End IfEnd Sub

6. At last we need to implement a method to take out our mdi child form from the array list so we can load it again if we want.

Private Sub UnloadForm(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim i As Long Dim s As String = sender.GetType().Name Dim IndexForEventHandler = -1 i = SearchChildForm(s, IndexForEventHandler)

 If i >= 0 Then m_sLoadedForms.RemoveAt(i)

 If IndexForEventHandler >= 0 Then RemoveHandler m_f(IndexForEventHandler).Closed, AddressOf UnloadForm m_f(IndexForEventHandler) = Nothing End If

End Sub

Thomas is an experienced Visual Basic developer, with expertise of 7+ years developing especially financial applications. His main IT skills are VB, SQL, Crystal Reports - should you need a Visual Basic developer for your projects feel free to contact Thomas through his personal website Kaloyani.com or through VBprofs - the newest Visual Basic and VB.NET resources portal.

Posted on Feb 8th, 2007

Whether you are a small consultancy firm, a medium sized accountancy practice, or a code warrior for hire in a back room of your house then you have at least one thing in common: you are in business to get paid quickly, and for the work you have done. Timesheets are the usual method for tracking time you spent working and thus are the key to timely invoice generation. Timely invoice generation and despatch is important for two reasons:

1. You are more likely to get paid for your services the closer you present the invoice for payment to the time you did the work.

2. Poor cash flow kills more businesses than poor profitability.

Timesheets used to be monthly, then weekly, daily, and now can be updated to the minute. A timesheet software package like Timesheets MTS or Timesheets Lite is simple to administer, is simple for the casual user to enter time, and most importantly is simple for the accounts department to use and generate the reports they need for prompt invoicing.

So, throw out those paper based timesheet systems, throw out the spreadsheet timesheet systems that the wheels are falling of off, and move to a modern timesheet software system today. When you have a system be vigilant! Make sure your people are accurate and timely with their entries, and make sure accounts are prompt in issuing invoices! Of course don’t forget normal debt collection practices, there’s no point issuing invoices promptly and then having poor follow up!

About The Author

Mark Nemtsas, Moving Target Software

Get low cost, efficient, timesheet software! This article is © Moving Target Software, 2004. It can however be reproduced in full on any web page as long as it is edited in no way whatsover.