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

Veure el llistat del codi del programa, m7p4.

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


Com creem i gestionem un menú. Afegim-hi una simulació d'una lent divergent

Augmentarem les capacitats didàctiques del programa afegint la característica de poder modelitzar el comportament d'una lent divergent.

El canvi de comportament ho aconseguirem clicant en un menú. Això es pot fer de diverses maneres, per exemple canviant un menú d'etiqueta convergent-divergent. L'estratègia adoptada aquí no és aquesta, ho farem amb dos menús que canvien el seu estat de Checked-UnChecked i Enabled-Disabled i així també aprendrem com gestionar-ho.

L'aspecte dels menús és el que veiem en la figura.




Fase de disseny de la interfície d’usuari

Aquest projecte el desareu a C:\VBCurs\VBActivi\m7\p4 amb el nom m7p4.

Podem partir del programa de la práctica anterior i hi afegirem les modificacions.
  • Creeu el directori.
  • Copieu-hi els fitxers de la pràctica anterior m7p3.vbp i m7p3.frm
  • Crideu Visual Basic fent doble clic a m7p3.vbp.
  • Guardeu el fitxer, save as..., amb el nom m7p4.frm i guardeu el projecte amb l'altre nom m7p4.vbp.
  • Un cop fet això podeu borrar els fitxers m7p3.vbp, i m7p3.frm.

Fase de disseny del menú

Hi afegim un nou menú, Tipus de lent, que conté 2 submenús: Convergent i Divergent amb les respectives propietat (Nombre), mnuConvergent i mnuDivergent. Les seves característiques: Checked-UnChecked i Enabled-Disabled les modificarem en temps d'execució.



menú Opcions:

 

(Nombre)

mnuOpcions

   

Caption

&Opcions

 

Sub menú Feixos

(Nombre)

mnuFeixos

   

Caption

&Feixos de llum

   

Checked

True

 

Sub menú Separator

(Nombre)

mnuRes

   

Caption

-

 

Sub menú Sortir

(Nombre)

mnuSortir

   

Caption

&Sortir

menú Tipus de lent

 

(Nombre)

mnuTipus

   

Caption

&Tipus de lent

 

Sub menú Convergent

(Nombre)

mnuConvergent

   

Caption

&Convergent

   

Checked

True

   

Enabled

False

 

Sub menú Divergent

(Nombre)

mnuDivergent

   

Caption

&Divergent




Fase de programació de respostes a events

Variables d'àmbit a tot el formulari

No hi ha cap canvi respecte la pràctica anterior.


Procediments d'àmbit a tot el formulari

El procediment iniciar és el mateix que l'anterior, pero hi afegim la inicialització de l'aspecte dels submenús mnuConvergent i mnuConvergent.

Tema: Enabled Subtema: Enabled Property

Fa que un menú es presenti amb un color grayed i no estigui actiu, o sigui que si es clica no funciona.
    Sub iniciar ()
      yT = 175
      xL = 300
      xO = 100
      yO = 50
      F = 100
    
      CalMoureObjecte = 0
      CalMoureLent = 0
      CalMoureFocus = 0
      CalCanviarTamanyObjecte = 0
      CalMoureTerra = 0
      
      HiHaHint = 0
      HintX = 0
      HintY = 0
      
      mnuConvergent.Checked = True
      mnuDivergent.Checked = False
      mnuConvergent.Enabled = False
      mnuDivergent.Enabled = True
    End Sub

El procediment (mètode) Pintar és el mateix modificat. La diferència és que pinta el comportament de la lent divergent segons els submenús mnuConvergent i mnuConvergent estiguin Checked o no.
    Sub Pintar ()
      Dim r As Integer
      'variables per la imatge de la lent divergent
      Dim a1, b1, a2, b2 As Integer
    
      Cls
      
      'Trama
      ForeColor = RGB(128, 128, 128)
      If mnuTrama.Checked Then
        r = 25
        While r <= 480
          Line (0, r)-(640, r)
          r = r + 25
        Wend
        r = 25
        While r <= 640
          Line (r, 0)-(r, 480)
          r = r + 25
        Wend
      End If
    
      '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)
      If mnuConvergent.Checked = True Then
        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)
      Else
        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)
      End If
      
      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"
    
      'Feixos de llum
      If mnuFeixos.Checked Then
        'Feix de llum paral.lel al terra
        If Abs(F) > 1 Then
          Line (xO, yT - yO)-(xL, yT - yO), QBColor(2)
          'Feix de llum que passa pel focus
          If mnuConvergent.Checked = True Then
    	Line (xL, yT - yO)-(1300, yT - yO + (1300 - xL) / F * yO), QBColor(2)
          Else
    	Line (xL, yT - yO)-(1300, yT - yO - (1300 - xL) / F * yO), QBColor(2)
    	DrawStyle = 2
    	Line (xL, yT - yO)-(xL - F, yT), QBColor(2)
    	DrawStyle = 0
          End If
        End If
        'Feix de llum que passa pel centre de la lent
        If xL <> xO Then
          Line (xO, yT - yO)-(1300, yT - yO + (1300 - xO) / (xL - xO) * yO), QBColor(2)
        End If
      End If
      
      'Imatge
      If (xL - xO) <> F And xL <> xO Then
        ForeColor = QBColor(4)
        If mnuConvergent.Checked = True Then
          xI = (xO - xL * (xL - xO) / F) / (1 - (xL - xO) / F)
          yI = yT - yO + (xI - xO) / (xL - xO) * yO
          Line (xI, yT)-(xI, yI)
          If (xO > xI) Then r = r * (-1)
          Line (xI - 10 * r, yI - 10 * r)-(xI, yI)
          Line (xI + 10 * r, yI - 10 * r)-(xI, yI)
          If xI < 1300 And xI > 0 Then
    	CurrentX = xI
    	CurrentY = 20
    	If xI < xL Then
    	  Print "Imatge virtual"
    	  ForeColor = QBColor(2)
    	  DrawStyle = 2
    	  Line (xI, yI)-(xO, yT - yO)
    	  Line (xI, yI)-(xL, yT - yO)
    	  DrawStyle = 0
    	Else
    	  Print "Imatge"
    	End If
          End If
        Else
          If xL <> xO Then
    	a1 = -yO / (xL - xO)
    	b1 = yO - a1 * xO
    	a2 = yO / F
    	If a2 <> a1 Then
    	  b2 = -a2 * (xL - F)
    	  xI = (b1 - b2) / (a2 - a1)
    	  yI = yT - (a1 * xI + b1)
    	  Line (xI, yT)-(xI, yI)
    	  If yI > yT Then r = 1 Else r = -1
    	  Line (xI - 10 * r, yI - 10 * r)-(xI, yI)
    	  Line (xI + 10 * r, yI - 10 * r)-(xI, yI)
    	End If
          End If
        End If
      End If
    
      If HiHaHint Then
        ForeColor = QBColor(4)
        CurrentX = HintX
        CurrentY = HintY
        Print "Prem butó esquerra i arrossega"
      End If
    End Sub

Mètodes associats a l'event Load i Paint

Són els mateixos de la pràctica anterior.


Mètodes associats als events que controlen les accions de la rata. MouseDown, MouseMove, MouseUp.

Són els mateixos de la pràctica anterior.


Mètodes associats als events que controlen les accions sobre els menús

Només hi posem aquí els que afecten als nous.
    Sub mnuConvergent_Click ()
      mnuConvergent.Checked = True
      mnuDivergent.Checked = False
      mnuConvergent.Enabled = False
      mnuDivergent.Enabled = True
      Pintar
    End Sub
    
    Sub mnuDivergent_Click ()
      mnuConvergent.Checked = False
      mnuDivergent.Checked = True
      mnuConvergent.Enabled = True
      mnuDivergent.Enabled = False
      Pintar
    End Sub

L'únic que fan és canviar les Properties: Checked i Enabled segons es cliquin.