The code in Listing 3 shows how to use the control array. The nested For loops walk through each element in the array and position it on the form. Notice that referencing each element in the control array uses the standard "object-dot" syntax to set each property of the text box (that is, Object-dot-Property). The only exception is that you must indicate which element is being referenced by using its index. The notation therefore becomes the following:
Obviously, the same general syntax notation also applies to the object methods.
Listing 3 Using the Control Array
Private Sub ShowMatrix() ' Purpose: This shows the magic squares matrix. ' Argument List: ' none ' ' Return value: ' n/a Dim i, j, k, offset, sum As Integer Dim Coor As Point sum = 0 ' Calculate magic number k = 1 offset = ROWOFFSET ' Spacing between rows For i = 0 To MatrixSize - 1 ' rows For j = 0 To MatrixSize - 1 ' columns Coor.X = BOXWIDTH * j + SPACEBETWEEN ' Position for textbox Coor.Y = offset txtElement(k).Location = Coor ' Set location txtElement(k).Text = CType(Magic(i + 1, j + 1, MatrixSize), _ String) txtElement(k).Visible = True ' Now show it k += 1 Next j sum += CInt(txtElement(i + 1).Text) ' Running total offset += BOXHEIGHT ' Next row offset Next i txtMagicNumber.Text = CType(sum, string) ' Show magic number txtMagicNumber.Visible = True lblMagicNumber.Visible = True End Sub
The Location property of each text box must be set using a Point object. The Point object holds the x and y coordinates for the object. Therefore, Coor determines where each text box appears on the form. The call to the Magic() function calculates the numeric value to be placed in each particular element of the text box matrix. The code for the Magic() function appears in Listing 4.
I pass the matrix size to the function, even though it's not necessary in the sample program, because of the scope of MatrixSize. That is, MatrixSize is visible everywhere within the class simply because of the scope level at which I defined MatrixSize. (Refer to Listing 1.) However, by passing MatrixSize to the function, the function is capable of standing on its own. This means that you could yank the Magic() source code from the program, throw it into a library file, and still be able to use it in other programs without using external data. It's always a good idea not to force a function to rely on external data whenever possible.
Listing 4 Determining Matrix Element Values
Private Function Magic(ByVal row As Integer, ByVal col As Integer, _ ByVal MatrixSize As Integer) As Integer ' Purpose: This does the actual calculation for the magic squares ' matrix. ' Argument List: ' none ' ' Return value: ' integer the value for the specific matrix element Dim term1, term2 As Integer term1 = col - row + (MatrixSize - 1) \ 2 term2 = col + col - row If term1 >= MatrixSize Then term1 -= MatrixSize ElseIf term1 < 0 Then term1 += MatrixSize End If If term2 > MatrixSize Then term2 -= MatrixSize ElseIf term2 <= 0 Then term2 += MatrixSize End If Return term1 * MatrixSize + term2 End Function
You know, I could pretend that I completely understand what the code in Listing 4 does, but I really don't. The original code comes from one of my books that was written more than 20 years ago. Given that I can't remember what I had for breakfast, I leave the understanding of the code as an exercise for the really interested reader.