Visual Basic Projects

WritePrivateProfileString: Creating a Quiz Application
Step 2: Building the 'TopScores' Form
Posted:   Tuesday August 24, 1999
Updated:   Monday December 26, 2011
Applies to:   VB4-32, VB5, VB6, and VB3, VB4-16 with appropriate declarations
Developed with:   VB6, Windows NT4
OS restrictions:   None
Author:   VBnet - Randy Birch
Step 1: Introduction and BAS Module
Step 2: Building the 'TopScores' Form
Step 3: Building the Quiz Topic Selection Form
Step 4: Building the Main Quiz Form
Form Illustration Layouts
Downloadable KidzQuiz INI file


WritePrivateProfileString: INI Files - The Basics
WritePrivateProfileString: INI Files - Saving Entire Sections
Step 1 completed..

kidz5topscores.gif (4564 bytes)This page concerns itself with he code surrounding the Top Scores form and its child, the Add Name form.










 Form Code: frmHiScores
Add a new form to the project and name it frmHiScores. This form has a list (List1), a command button (Command1), and a few labels of any name. The 'Top Scores' name at the top of the form is picture inside an image control; you can replace this with anything you want. Add the following to this form:

Option Explicit
' Copyright 1996-2011 VBnet/Randy Birch, All Rights Reserved.
' Some pages may also contain other copyrights by the author.
' Distribution: You can freely use this code in your own
'               applications, but you may not reproduce 
'               or publish this code on any web site,
'               online service, or distribute as source 
'               on any media without express permission.
Private Sub Command1_Click()

 'just hide it

End Sub

Private Sub Form_Activate()

 'if GetHiScoreNameFlag flag > 0, in the
 'calling procedure show the add name dialog
  If GetHiScoreNameFlag > 0 Then
     frmHiScoreName.Show 1
  End If

End Sub

Private Sub Form_Load()

  Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
 'load the existing high scores data
  Dim totalscores As Long
  Call LoadTopScores(totalscores)
 'if there was a file error, or there is nothing
 'yet to show, then just exit at this point
  If totalscores <> 0 Then
   'must be some data there, so...
    Call UpdateList(totalscores)
   'pause a second to let Windows display the list
  End If
End Sub

Private Sub LoadTopScores(totalscores As Long)

  Dim hFile As Long
  Dim cnt As Long
  hFile = FreeFile
 'assure that the specified file exists
  If Not FileExists(sHighScoreFile) Then
    Select Case MsgBox("The quiz High Scores file was not found!" & _
                        vbCrLf & vbCrLf & sHighScoreFile & vbCrLf & vbCrLf & _
                        "Do you want to create a new one now?", _
                        vbYesNo Or vbQuestion, "Quiz Error")
      Case vbYes:
         Open sHighScoreFile For Random Access Write As hFile Len = Len(TopScores)
            Put #hFile, , TopScores
         Close hFile
         totalscores = 0
      Case Else
         Exit Sub
    End Select
  End If
 'open the scores file, and gulp in the whole thing in 1 call
  Open sHighScoreFile For Random Access Read As hFile Len = Len(TopScores)
    Get #hFile, , TopScores
  Close hFile

 'because some might be blank, and we don't want
 'blank records in the listbox, determine where
 'the data ends by finding the first score = 0.
  For cnt = 1 To 40
    If TopScores.SScores(cnt) = 0 Then Exit For
    totalscores = cnt
  Next cnt

End Sub

Private Sub UpdateList(totalscores As Long)

  Dim r As Long, cnt As Long
 'As the data is stored in a random fashion
 '(ie in the order of the entry), sort the
 'data in descending order form the highest scorer
  QuickSortScores TopScores, 1, totalscores
 'add the sorted data to the listbox, separating
 'each line item with a tab character
  For cnt = 1 To totalscores
      List1.AddItem Trim$(TopScores.SNames(cnt)) & vbTab & _
                    TopScores.SScores(cnt) & vbTab & _
                    Format$(TopScores.SDate(cnt), "MMM DD, YYYY") & _
                    vbTab & Format$(cnt, "@@")
  Next cnt 

 'set the listbox tabstops for the above info
  ReDim Tabs(1 To 3) As Long
  Tabs(1) = 77
  Tabs(2) = 118
  Tabs(3) = 195
 'and set the tabs & refresh
  Call SendMessage(List1.hwnd, LB_SETTABSTOPS, 0&, ByVal 0&)
  Call SendMessage(List1.hwnd, LB_SETTABSTOPS, 3, Tabs(1))

End Sub
 Form Code: frmHiScoreName
kidz4name.gif (3341 bytes)

Add a new form to the project and name it frmHiScoreName. This form has two labels (Label1(0) and Label1(1), a textbox (txtEntry), and two command buttons (cmdSave and cmdCancel). Add the following to this form:

Option Explicit
Private Sub Form_Load()

 'centre this form on the screen (sort-of)
 'but leave most of the highscore list visible
  Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) / 1.35
 'disable the save button until something is entered
  cmdSave.Enabled = False
 'add the messages
  Label1(0).Caption = "Congratulations on reaching " & _
                       CStr(GetHiScoreNameFlag) & " percent correct!!"
  Label1(1).Caption = "Enter your name for the Top of the Class!
End Sub

Private Sub Form_Activate()

 'select & highlight the 'your name' phrase in the textbox
  txtEntry.SelStart = 0
  txtEntry.SelLength = Len(txtEntry.Text)

End Sub

Private Sub cmdCancel_Click()

 'prevent a re-showing of this dialog on
 'subsequent calls to show the high scores,
 'and unload
  GetHiScoreNameFlag = False
  Unload Me

End Sub

Private Sub cmdSave_Click()

'note: you need to add code to assure that you don't
'attempt to save more than 40 records (as dimmed in the 
'Type Array at present.)  A better method however might 
'be to keep this 40-score limit, and add code to determine 
'the file position of the lowest scored member, and 
'overwrite that record.
 'working variables
  Dim hFile As Long
  Dim nextFreeEntry As Long
  Dim sEntry As String
 'the nextFreeEntry is equal to the number of 
 'current names in the HiScores listbox plus 1
  nextFreeEntry = frmHiScores!List1.ListCount + 1
 'add the new record to the disk file
  TopScores.SNames(nextFreeEntry) = (txtEntry)
  TopScores.SDate(nextFreeEntry) = DateValue(Now)
  TopScores.SScores(nextFreeEntry) = GetHiScoreNameFlag

 'save the name to the high scores file
  hFile = FreeFile

  Open sHighScoreFile For Random Access Write As hFile Len = Len(TopScores)
    Put #hFile, , TopScores
  Close hFile

 'format a string for entry into the listbox
  sEntry = Trim$(TopScores.SNames(nextFreeEntry)) & vbTab & _
           TopScores.SScores(nextFreeEntry) & vbTab & _
           Format$(TopScores.SDate(nextFreeEntry), "MMM DD, YYYY") & _
           vbTab & Format$(nextFreeEntry, "@@")
 'and add it to the list
  frmHiScores!List1.AddItem sEntry
 'finally, clear the existing list and call the exposed
 'sub in the frmHiScores to re-sort with the new data
  frmHiScores.UpdateList nextFreeEntry
 'prevent a re-showing of this dialog on
 'subsequent calls to show the high scores, and unload
  GetHiScoreNameFlag = False
  Unload Me

End Sub

Private Sub txtEntry_Change()

  'only enable the save button if there is something to save
   cmdSave.Enabled = Len(txtEntry.Text) > 0

End Sub
Save these two files, and move on to Step 3 - Building the Quiz Topic Selection Form. And don't bother to run the app yet .. all the pieces need to be in place first.


PayPal Link
Make payments with PayPal - it's fast, free and secure!


Copyright 1996-2011 VBnet and Randy Birch. All Rights Reserved.
Terms of Use  |  Your Privacy


Hit Counter