PROGRAMACIÓ D'APLICACIONS EDUCATIVES AMB VISUAL BASICMÒDUL 5ENRERA
PRÀCTICA 1 2 3 4 (pràctica optativa)
 
Part segona: utilitzant un fitxer i dades estructurades per a emmagatzemar les preguntes i respostes


Executar el programa m5p2.exe per conèixer el seu comportament.

Veure el llistat del codi del programa, m5p2.

Executar Visual Basic per editar el projecte (acabat): m5p2.vbp.


Preguntes i respostes utilitzant un fitxer

Feu un altre formulari, molt semblant al de la primera part, podeu partir del mateix i canviar el nom del projecte; i afegiu-li els botons Acabar i Afegir i l'etiqueta i text que ensenyaran el número de registre escollit aleatòriament. El formulari final és semblant al següent:




Desarem el projecte en el mateix directori: C:\VBCurs\VBActivi\m5\p2 i un nou projecte, en aquest directori, que anomenareu m5p2. En ell, desareu tots els fitxers d'aquesta activitat.


Fase de disseny de la interfície d’usuari

En el formulari anterior les propietats inicials dels objectes nous són:


Objecte

Propietat

Valor

Etiqueta

(Nombre)

lblNúmRegistres

 

Caption

Número de registres

Caixa de Text NúmRegs

(Nombre)

txtNúmRegistres

 

Text

 

Botó Preguntar

(Nombre)

cmdPreguntar

 

Caption

Realitzar una pregunta

Botó Afegir

(Nombre)

cmdAfegir

 

Caption

Afegir una nova pregunta al fitxer de dades.

Botó Acabar

(Nombre)

cmdAcabar

 

Caption

Acabar



Fase de programació de respostes a events

Declaracions globals a tot el programa

Com les dades s'emmagatzemaran en un fitxer cal fer algunes definicions i declaracions noves.

Creeu doncs un nou mòdul. Per fer-ho cliqueu amb el botó dret damunt de la finestra de proyecto i s'obrirà un menú contextual. Cliqueu en la opció, Agregar i es deplegarà un nou submenú. Cliqueu en la opció, Módulo.



Apareixerà un nou quadre de diàleg on cal clicar Abrir.




per tal de posar-hi la definició d'un nou tipus de dades del qual heu de fer-ne ús i deseu-lo amb el nom m5p2ModB.BAS:




I escriviu-hi en el lloc de les declaracions generals.



    Type Preguntes
      Pregunta As String * 400
      Resposta As String * 112  'La grandària d'aquest tipus de dades és: 512 bytes
    End Type


Tema: Type Subtema: Type Statement


Aquesta declaració suposa que el fitxer que més tard declarareu i definireu estarà compost de dades estructurades en registres. Per exemple, el codi següent:
    Dim RegistrePregunta as Preguntes
    RegistrePregunta.Pregunta=" A quina població porten tots els camins?"
    RegistrePregunta.Resposta=" Roma"

implica la declaració i l'assignació de dades a una variable estructurada RegistrePregunta que es compon dels dos camps Pregunta i Resposta. De manera gràfica, aquest registre es pot representar així:


Pregunta

Resposta

400 bytes

112 bytes



Fixeu-vos que a la finestra de projecte apareix un nou fitxer anomenat m5p2modB.BAS.




En aquests mòduls s'escriuran totes les variables globals a les quals han de tenir accés tots els formularis, així com els nous tipus de dades i els procediments o funcions que també han de poder veure-les tots els formularis.

Tornem al formulari principal del programa m5p1.frm

Declaració de variables d'àmbit el formulari:
Recordeu que no cal que escriviu aquest codi. Llegiu-lo, per tal de saber per a què serveix i com ho fa. A continuació, el podeu copiar a la carpeta i enganxar-lo en la finestra d'edició de Visual Basic.
    Dim m As Integer
    Dim NomFitxer As String
    Dim Preg As Preguntes, Pregaux As Preguntes
    Dim NúmRegs As Integer

Mètodes associats a l'event Load:

Per al formulari principal:
    Sub Form_Load ()
      NomFitxer = "pregs.dat"
      Open NomFitxer For Random As #1 Len = 512
      NúmRegs = LOF(1) / 512
      txtNúmRegistres = Str(NúmRegs)
      txtPregunta.Visible = False
      lblResposta.Visible = False
      txtResposta.Visible = False
      txtAvaluacióResposta.Visible = False
    End Sub

L'arxiu pregs.dat es troba en el directori, C:\VBCurs\VBHtml\vibam5\m5p2. El podeu copiar en el vostre directori de treball, C:\VBCurs\VBActivi\m5\p2.

Observeu que obriu el fitxer amb una cadena de caràcters que indica el camí i el nom. La grandària del registre és de 512 bytes (400 bytes per al camp Pregunta i 112 per al camp Resposta). El càlcul del número de registres es fa dividint la grandària total del fitxer (LOF(1)) per la grandària del registre (512 bytes).


Tema: LOF Subtema: LOF Function


El fitxer d'accés aleatori tindrà registres com l'esmentat anteriorment, numerats per la posició física que ocupen dins del fitxer. Així, podeu fer-vos una imatge física del fitxer com la següent:


Registre 1

 

Registre 2

 

Registre 3

 

Pregunta

Resposta

Pregunta

Resposta

Pregunta

Resposta

400 bytes

112 bytes

400 bytes

112 bytes

400 bytes

112 bytes



En aquest gràfic estan representats els tres primers registres del fitxer PREGS.DAT.


Mètodes associats a l'event Click

Per al botó Realitzar una pregunta:
    Sub cmdPreguntar_Click ()
      If NúmRegs > 0 Then
        txtAvaluacióResposta.Visible = False
        Randomize
        m = Int(NúmRegs * Rnd + 1)
        Get #1, m, Preg
        txtPregunta.Text = Preg.Pregunta
        lblResposta.Visible = True
        txtPregunta.Visible = True
        txtResposta.Visible = True
        txtResposta.Text = ""
      End If
    End Sub

La lectura de la pregunta escollida aleatòriament i de la pregunta corresponent es fa mitjançant la instrucció Get que té tres paràmetres: #1 (el fitxer), m (el número de registre a llegir) i Preg (el registre en el qual s'emmagatzemaran les dades obtingudes del fitxer).


Tema: Get Subtema: Get Statement


Per al botó Afegir pregunta:
    Sub cmdAfegir_Click ()
      Dim Títol as string, Missatge as string
    
      Títol="Introducció de la pregunta a afegir"
      Missatge="Escriviu la pregunta que voleu incorporar:"
      Pregaux.Pregunta = InputBox$(Missatge,Títol)
      Títol="Introducció de la resposta"
      Missatge="Escriviu la resposta a la pregunta anterior:"
      Pregaux.Resposta = InputBox$(Missatge,Títol)
      If Pregaux.Pregunta <> "" Or  Pregaux.Resposta <> "" Then
        NúmRegs = NúmRegs + 1
        Put #1, NúmRegs, Pregaux
        txtNúmRegistres = Str(NúmRegs)
      End If
    End Sub

El procediment anterior utilitza un registre auxiliar (PregAux) del tipus Preguntes i assigna als seus camps els valors entrats interactivament fent ús de les instruccions:

    Pregaux.Pregunta = InputBox$(Missatge,Títol)

Els valors introduïts s'emmagatzemen finalment en el fitxer: Put #1, NúmRegs, Pregaux. Els paràmetres utilitzats són: #1 (el fitxer), NúmRegs (el número de registre a afegir) i Pregaux (el registre en el qual s'emmagatzemaran les dades obtingudes de l'usuari).


Tema: Put Subtema: Put Statement


Mètodes associats a l'event KeyDown

Per a la caixa de text txtResposta:
    Sub txtResposta_KeyDown (keycode As Integer, Shift As Integer)
      Dim resp As String
    
      If keycode = 13 Then
        txtAvaluacióResposta.Visible = True
        resp = txtResposta.Text
        If (RTrim$(Preg.Resposta) = resp) Then
          txtAvaluacióResposta.Text = "Molt bé"
        Else
          txtAvaluacióResposta.Text = "La resposta correcta és: " & Preg.Resposta
        End If
      End If
    End Sub

La funció Rtrim$ retorna una cadena de caràcters on s'han eliminat els espais en blanc de la dreta. Això és necessari perquè, en cas contrari, la comparació donaria False.


Tema: RTrim Subtema: Ltrim, Ltrim$, Rtrim, Rtrim$, Trim, Trim$ Functions


Per al botó Acabar:
    Sub cmdAcabar_Click ()
      Close #1
      End
    End Sub

Aquest procediment tanca el fitxer i acaba el programa.



Exercicis

No n'hi ha.