Solved

Create a "Grid" inside Picture Box

Posted on 2002-07-20
4
181 Views
Last Modified: 2008-03-04
Check out this immage, http://www.temecularodrun.com/temp/grid.jpg

I know how to do the code loops to create the output results, but how do you do the "grid"?  All those neat little black lines that contain the results.

In .asp this is a simple <tr><td> loop, how do you do it in VB?

If more points are necessary let me know.
0
Comment
Question by:mgfranz
  • 2
  • 2
4 Comments
 
LVL 38

Expert Comment

by:PaulHews
Comment Utility
Here is a complete example, but 100 pts would be nice as it took some time to code.

Add a picturebox and a button to a form.  Make the picture box a fair size.

Option Explicit
Private mGrid(1 To 10, 1 To 10)
Private Sub Command1_Click()
    Dim i As Integer
    Dim j As Integer
   
    For i = 1 To 10
        For j = 1 To 10
            mGrid(i, j) = i * j
        Next j
    Next i
   
    Call sDrawGrid
       
   
   
End Sub

Public Sub sDrawGrid()
   
    Dim sngStartX As Single, sngStartY As Single
    Dim sngEndX As Single, sngEndY As Single
    Dim i As Integer, j As Integer
    Dim x As Single, y As Single, xx As Single, yy As Single
    Dim sngW As Single, sngH As Single
    Dim strCell As String
    Dim lngColor As Long
   
    With Picture1
   
    sngStartX = 45
    sngStartY = 45
    sngEndX = .ScaleWidth - 45
    sngEndY = .ScaleHeight - 45
   
    'With keyword does not work with certain graphic methods, because of MS laziness.
   
   
    For i = 1 To 10
        If i Mod 2 = 0 Then   'alternate every second column
            lngColor = vbWhite
        Else
            lngColor = RGB(255, 255, 192)  'light yello
        End If
       
        x = i / 10 * sngEndX 'right edge of coloured block
        xx = (i - 1) / 10 * sngEndX 'left edge of coloured block
        If xx = 0 Then xx = sngStartX  'correction to formula for first line
        Picture1.Line (xx, sngStartY)-(x, sngEndY), lngColor, BF
    Next i
    For i = 1 To 10
        x = i / 10 * sngEndX 'current position of line being drawn
        Picture1.Line (x, sngStartY)-(x, sngEndY)
    Next i
   
    y = 1 / 10 * sngEndY
    'Line at table head
    Picture1.Line (sngStartX, y)-(sngEndX, y)
    'Line at left edge
    Picture1.Line (sngStartX, sngStartY)-(sngStartX, sngEndY)
    'line at top
    Picture1.Line (sngStartX, sngStartY)-(sngEndX, sngStartY)
    'line at bottom
    Picture1.Line (sngStartX, sngEndY)-(sngEndX, sngEndY)
   
    'Tricky part, center numbers in boxes
    For i = 1 To 10
        For j = 1 To 10
            strCell = Format(mGrid(i, j))
            sngW = .TextWidth(strCell)
            sngH = .TextHeight(strCell)
            x = (CSng(i) * 2 - 1) / 20 * sngEndX - sngW / 2  'first part is simplification of formula ((i + (i-1))/2)/10 find center of cell
            y = (CSng(j) * 2 - 1) / 20 * sngEndY - sngH / 2
            .CurrentX = x
            .CurrentY = y
            Picture1.Print strCell
        Next j
    Next i
   
   

    End With

End Sub
0
 
LVL 18

Author Comment

by:mgfranz
Comment Utility
OK, Cool.  Now what if I want to have each number in a box?  So that the results are in a full grid?

And your'e right, 100 point is more suiting...
0
 
LVL 38

Accepted Solution

by:
PaulHews earned 100 total points
Comment Utility
>Now what if I want to have each number in a box?  So that the results are in a full grid?<

I assume you mean draw grid lines for each cell?  Make the following changes to the DrawGrid subroutine

Public Sub sDrawGrid()
   
   Dim sngStartX As Single, sngStartY As Single
   Dim sngEndX As Single, sngEndY As Single
   Dim i As Integer, j As Integer
   Dim x As Single, y As Single, xx As Single, yy As Single
   Dim sngW As Single, sngH As Single
   Dim strCell As String
   Dim lngColor As Long
   
   With Picture1
   
   sngStartX = 45
   sngStartY = 45
   sngEndX = .ScaleWidth - 45
   sngEndY = .ScaleHeight - 45
   
   'With keyword does not work with certain graphic methods, because of MS laziness.
   
   
   For i = 1 To 10
       If i Mod 2 = 0 Then   'alternate every second column
           lngColor = vbWhite
       Else
           lngColor = RGB(255, 255, 192)  'light yello
       End If
       
       x = i / 10 * sngEndX 'right edge of coloured block
       xx = (i - 1) / 10 * sngEndX 'left edge of coloured block
       If xx = 0 Then xx = sngStartX  'correction to formula for first line
       Picture1.Line (xx, sngStartY)-(x, sngEndY), lngColor, BF
   Next i
   
   For i = 1 To 10
       x = i / 10 * sngEndX 'current position of line being drawn
       Picture1.Line (x, sngStartY)-(x, sngEndY)
   Next i
   For i = 1 To 10
       y = i / 10 * sngEndY 'current position of line being drawn
       Picture1.Line (sngStartX, y)-(sngEndX, y)
   Next i
   'Commented out lines no longer needed since each line being drawn above
'   y = 1 / 10 * sngEndY
'   'Line at table head
'   Picture1.Line (sngStartX, y)-(sngEndX, y)
   'Line at left edge
   Picture1.Line (sngStartX, sngStartY)-(sngStartX, sngEndY)
   'line at top
   Picture1.Line (sngStartX, sngStartY)-(sngEndX, sngStartY)
'   'line at bottom
'   Picture1.Line (sngStartX, sngEndY)-(sngEndX, sngEndY)
   
   'Tricky part, center numbers in boxes
   For i = 1 To 10
       For j = 1 To 10
           strCell = Format(mGrid(i, j))
           sngW = .TextWidth(strCell)
           sngH = .TextHeight(strCell)
           x = (CSng(i) * 2 - 1) / 20 * sngEndX - sngW / 2  'first part is simplification of formula ((i + (i-1))/2)/10 find center of cell
           y = (CSng(j) * 2 - 1) / 20 * sngEndY - sngH / 2
           .CurrentX = x
           .CurrentY = y
           Picture1.Print strCell
       Next j
   Next i
   
   

   End With

End Sub

0
 
LVL 18

Author Comment

by:mgfranz
Comment Utility
Beautiful... thank you sir!
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

Suggested Solutions

Introduction In a recent article (http://www.experts-exchange.com/A_7811-A-Better-Concatenate-Function.html) for the Excel community, I showed an improved version of the Excel Concatenate() function.  While writing that article I realized that no o…
Introduction While answering a recent question about filtering a custom class collection, I realized that this could be accomplished with very little code by using the ScriptControl (SC) library.  This article will introduce you to the SC library a…
Get people started with the process of using Access VBA to control Excel using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Excel. Using automation, an Access application can laun…
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now