![]() ![]() ![]() |
![]() ![]() ![]() ![]() ![]() |
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 fitxerFeu 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’usuariEn el formulari anterior les propietats inicials dels objectes nous són:
Fase de programació de respostes a eventsDeclaracions globals a tot el programaCom 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 ![]() 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í:
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: ![]() 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 ![]() 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). ![]() 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:
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). ![]() 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). ![]() 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. ![]() Per al botó Acabar: Sub cmdAcabar_Click () Close #1 End End Sub Aquest procediment tanca el fitxer i acaba el programa. ExercicisNo n'hi ha. |