PROGRAMACIÓ D'APLICACIONS EDUCATIVES AMB VISUAL BASICMÒDUL 7ENRERA
PRÀCTICA 1 2 3 4 5
 
Executar el programa m7p1.exe per conèixer el seu comportament.

Veure el llistat del codi del programa, m7p1.

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


Simulació d'una lent convergent. Com dibuixar? Fotografia

En un llibre de física de segon de BUP s'explica com va el traçat de feixos de llum a través d'una lent convergent. El que pretenem aquí és fer el dibuix que apareix en aquests llibres. La pràctica és molt semblant a les del mòdul 5.

El dibuix que pretenem aconseguir és el següent:




Aquest projecte el desareu a C:\VBCurs\VBActivi\m7\p1 amb el nom m7p1.


Fase de disseny de la interfície d’usuari

Hem de fer un formulari més o menys de la mida del dibuix anterior. Aquí no hi col·loquem cap objecte, la seva aparença la crearem en temps d'execució mitjançant el procediment pintar.

Important: la propietat del formulari Scale mode l'heu de posar en 3 - Pixel.


Fase de programació de respostes a events

El funcionament del programa és el següent: quan es carrega el formulari, event Form_Load() crida a un procediment Iniciar() que s'encarrega d'iniciar les variables que definirem a nivell d'àmbit global del projecte.

Fins ara quan voliem fer un dibuix (mòdul 5) calia clicar en el formulari o en un menú, és a dir, calia activar un event. Aquí farem servir l'event Form_Paint que és un event que crida el sistema operatiu cada vegada que calgui repintar la finestra. Per la qual cosa el dibuix es veurà sempre que veiem la finestra.

L'event Form_Paint crida senzillament el procediment Pintar que és el que realment cuida de fer aparèixer el dibuix.

Variables d'àmbit a tot el formulari

    Dim yT, xL, xO, yO, F, xI, yI As Integer
Aquestes variables serveixen per definir les posicions dels objectes en la finestra. Així yT, vol dir Coordenada y del Terra i xL, coordenada x de la Lent... Els comentaris (REM ') us ajudaran en la comprensió del significat de les variables.


Procediments d'àmbit a tot el formulari

Per iniciar les variables tenim el següent procediment:
    Sub iniciar ()
      yT = 165
      xL = 300
      xO = 100
      yO = 50
      F = 100
    End Sub

El procediment (mètode) Pintar és el que fa el dibuix. Observeu les diferents instruccions que ens ofereix el Visual Basic per opcions gràfiques: Cls, Print, ForeColor i QBColor.
    Sub Pintar ()
      Dim r As Integer
    
      Cls
      
      'Terra
      ForeColor = QBColor(0)
      Line (0, yT)-(1300, yT)
      
      'Focus
      Line (xL + F, yT - 5)-(xL + F, yT + 5)
      Line (xL - F, yT - 5)-(xL - F, yT + 5)
      CurrentX = xL + F
      CurrentY = 20
      Print "Focus"
      
      'Lent
      ForeColor = QBColor(6)
      Line (xL, yT - 130)-(xL, yT + 130)
      Line (xL - 10, yT - 130 + 10)-(xL, yT - 130)
      Line (xL + 10, yT - 130 + 10)-(xL, yT - 130)
      Line (xL - 10, yT + 130 - 10)-(xL, yT + 130)
      Line (xL + 10, yT + 130 - 10)-(xL, yT + 130)
      CurrentX = xL
      CurrentY = 20
      Print "Lent"
      
      'Objecte
      ForeColor = QBColor(1)
      r = 1
      If yO < 0 Then
        r = -1
      End If
      Line (xO, yT)-(xO, yT - yO)
      Line (xO, yT - yO)-(xO - 10 * r, yT - yO + 10 * r)
      Line (xO, yT - yO)-(xO + 10 * r, yT - yO + 10 * r)
      CurrentX = xO
      CurrentY = 20
      Print "Objecte"
    
      'Feix de llum paral.lel al terra
      ForeColor = QBColor(2)
      If Abs(F) > 1 Then
        Line (xO, yT - yO)-(xL, yT - yO)
        Line (xL, yT - yO)-(1300, yT - yO + (1300 - xL) / F * yO)
      End If
      
      'Feix de llum que passa pel focus
      If xL <> xO Then
        Line (xO, yT - yO)-(1300, yT - yO + (1300 - xO) / (xL - xO) * yO)
      End If
      
      'Imatge
      If (xL - xO) <> F And xL <> xO Then
        ForeColor = QBColor(4)
        xI = (xO - xL * (xL - xO) / F) / (1 - (xL - xO) / F)
        yI = yT - yO + (xI - xO) / (xL - xO) * yO
        Line (xI, yT)-(xI, yI)
        Line (xI - 10 * r, yI - 10 * r)-(xI, yI)
        Line (xI + 10 * r, yI - 10 * r)-(xI, yI)
        CurrentX = xI
        CurrentY = 20
        Print "Imatge"
      End If
    End Sub


Tema: Cls

Esborra la finestra.

Tema: Print Subtema: Print Method

Escriu text a la finestra.

Tema: CurrentX, CurrentY

Coordenades de la finestra on escriu el text o la següent instrucció de dibuix.

Tema: ForeColor Subtema: Setting Colors

Per canviar el color amb què volem escriure o dibuixar a la finestra.

Tema: QBColor Subtema: QBColor Function

Torna el número de color en format RGB (que entén el ForeColor) dels colors del Basic tradicional.


Mètodes associats a l'event Load

Tal com hem dit aquest mètode crida al procediment Iniciar que inicia les variables. Es podria pensar que no caldria fer-ho: per definir les posicions del dibuix es podria escriure directament amb els números. És mala pràctica enterrar números al mig del codi, a més, a les pràctiques següent voldrem que les posicions dels dibuixos canviïn i això només es pot fer si estan definides mitjançant variables.

    Sub Form_Load ()
      iniciar
    End Sub

Mètodes associats a l'event Paint

Tal com hem dit aquest event l'activa el sistema operatiu cada vegada que s'ha de repintar la finestra. Això passa quan s'inicia el programa per primer cop o cada vegada que volem tornar a activar-lo clicant damunt la finestra (o amb Alt+Tab...) i un altre programa (o finestra) l'ha cobert total o parcialment.

    Sub Form_Paint ()
      Pintar
    End Sub

Aquest event ens permet entendre perquè cada vegada que s'activa una finestra, aquesta es torna a mostrar correctament i podem comprendre perquè en els programes del mòdul 5 quan una finestra els cobria i tornavem a ells ja no es veia el dibuix i calia tornar a clicar o activar el corresponent menú. La causa era que no es pintava el seu contingut a través d'aquest event.