Informaticasite van het Lauwers College te Buitenpost                 © R.J. van der Beek
 

Hoofdstuk 8: Visual Basic

8.5. Een figuur laten bewegen.

  8.5.1 Een figuur naar rechts laten bewegen.

We willen een formulier dat er als volgt uitziet:
We laten in dit formulier een figuur bewegen.

Zet bovenaan in het formulier een pictureBox en noem die picBeweeg
Onderaan zet je een button met het opschrift "stop", noem die cmdStop.

Klik dan in de toolbox op de wekker (dat is de zogenaamde "timer", zie hier linksonder), en zet die rechtsboven in het venster.

Die wekker zie je wel in het ontwerpscherm, maar niet als het programma echt loopt.

Zet in het propertiesvenster van de timer Interval op 10.
Daarmee stel je in dat er om de 10 milliseconden iets gebeurt, en wat dan wel, dat zie je hierna.
En "Enabled" zet je op true, want als die op false staat dan is de timer niet geactiveerd, en dan gebeurt er niets.

Dubbelklik in het ontwerpformulier op de timer, dan kun je programmaregels invoeren. En wat daar staat, dat wordt om de 10 milliseconden uitgevoerd. Telkens als er weer 10 millisec. om zijn dan "loopt de wekker af", en dan gaat de computer uitvoeren wat hier in de procedure onder timer staat.

Tik eerst maar eens het volgende in: picBeweeg.left = picBeweeg.left + 100

Als je het programma dan laat lopen dan zul je merken dat de pictureBox naar rechts beweegt.

In picBeweeg.left wordt namelijk vastgelegd hoeveel "twips" de linker-rand van de picturebox van de linkerrand van het formulier verwijderd is.
En daar wordt om de 10 milliseconden 100 bij opgeteld, dus schuift hij op naar rechts.

Er wordt in Visual Basic gemetene in twips. Eén twip is 1/20 van een punt, en één punt is 1/72 van een inch (2,54 cm). Dus een twip is 0.00176 cm, dat betekent dat er in één centimeter 567 twips gaan.
En 3.5 cm is ongeveer 2000 twips, dus je hebt snel grote getallen.

Als je in de procedure onder timer het volgende intikt:
picBeweeg.left = picBeweeg.left + 100
picBeweeg.top = picBeweeg.top + 10
dan verschuift de pictureBox scheef naar beneden: hij gaat naar rechts en tegelijk naar beneden,want met picBeweeg.top wordt vastgelegd hoeveel "twips" de boven-rand van de picturebox van de bovenrand van het formulier verwijderd is.

  8.5.2 Heen en weer bewegen.

Op een gegeven moment verdwijnt de pictureBox uit beeld.

Het zou mooier zijn dat hij, als hij aan de rechter rand toe is, de andere kant op gaat.
Dat kunnen we ook wel programmeren, maar dat wordt wel wat ingewikkelder.
We moeten dan bijhouden of de pictureBox naar rechts moet of naar links.
Dat leggen we vast in de variabele "rechts".
Als die variabele de waarde true heeft betekent dat dat de pictureBox naar rechts moet bewegen, en als hij de waarde false heeft dan moet de pictureBox naar links bewegen.
De variabele rechts is dus van het type boolean.

Als rechts gelijk is aan true, dan moet de opdracht zijn :
picBeweeg.left = picBeweeg.left + 100 ,
en anders moet de opdracht zijn: picBeweeg.left = picBeweeg.left - 100

Verder moet nog bekeken worden wanneer de richting om moet draaien.

Veranderen van links naar rechts moet gebeuren als de box net voorbij de linker rand komt, dus als geldt: picBeweeg.left < 0

Veranderen van rechts naar links moet gebeuren als de picturebox net voorbij de rechter rand komt.
Maar picBeweeg.Right bestaat niet, alleen picBeweeg.Left.
Toch je kunt het aantal twips, dat de rechter rand van de picturebox van de linkerkant verwijderd is, wel berekenen met picBeweeg.left + picBeweeg.width
En als dat meer dan de breedte van het formulier is (en dat is frmBeweeg. width) dan moet de beweging omdraaien.
Eigenlijk moet de beweging al iets eerder omdraaien, omdat de besturingselementen een rand van ongeveer 100 twips hebben, zodat de rechterrand al begint te verdwijnen als geldt:
picBeweeg.left + picBeweeg.width > frmBeweeg. width - 200

Daarom wordt de procedure die hoort bij de timer als volgt :

Private Sub Timer1_Timer()

If ((picBeweeg.Left + picBeweeg.Width > frmBeweeg.Width - 200) And 
                                         (rechts = True)) Then
   rechts = False
End If

If (picBeweeg.Left < 0) And (rechts = False) Then
   rechts = True
End If

If (rechts = True) Then
   picBeweeg.Left = picBeweeg.Left + 100
else
   picBeweeg.Left = picBeweeg.Left - 100
End If

End Sub

De variabele rechts moet je wel declareren, en die moet ook bewaard blijven buiten de procedure van de timer, daarom moet je die variabele declareren als globale variabele onder General bij Declarations !
En daar tik je in :

Dim rechts As Boolean

Verder moet die variabele ook een beginwaarde hebben.
Daarom tik je bij de procedure die hoort bij Form_load in:

rechts = True

Probeer het maar eens uit!

  8.5.3 De beweging laten stoppen.

Je kunt de beweging ook laten stoppen.
Als bij de timer "enabled" op false wordt gezet dan doet de timer niets meer, en dan stopt de beweging dus.

Als je op de button met het woord "Stop" klikt, dan is het de bedoeling dat de beweging stopt.
Daar kun je heel gemakkelijk voor zorgen.

Dubbelklik op die button, en tik als programmaregel in:

timer1.enabled = false

Laat het programma lopen en probeer alles uit.

  8.5.4 Even wachten; datum en tijd.

Je kunt een timer ook gebruiken om er voor te zorgen dat er een poosje gewacht wordt voordat er iets gebeurt.
Stel je voor dat je een programma wilt maken waarbij er bij de start een label op het scherm staat met de tekst: "na 5 sec. verschijnt de datum en de tijd, even geduld a.u.b."
En dat de tekst op het label na 5 seconden verandert in de datum + tijd, dan moet je het volgende doen:

Plaats een label op het formulier en noem die lblDatum
Zorg er voor dat het opschrift van dat label "na 5 sec. verschijnt de datum en de tijd, even geduld a.u.b." wordt, door die tekst bij Caption in te voeren.

Plaats dan een timer op het formulier en noem die tmrDatum
Zet in het propertiesvenster van de timer Interval op 5000.
Daarmee stel je in dat er na 5000 milliseconden (dus 5 sec) iets gebeurt.
En "Enabled" zet je op true, want als die op false staat dan gebeurt er niets.
Dubbelklik op de timer, dan kun je de eventhandler (dat is de programma-code voor de timer) invoeren.

Tik het volgende in:
lblDatum.Caption = "Datum: " & Date & " Tijd: " & Time
tmrDatum.Enabled = False

Als je het programma dan laat lopen zul je merken dat het na 5 seconden de datum en de tijd op het label verschijnen.



In Visual Basic geeft Date dus automatisch de datum en Time geeft automatisch de tijd
Als je er een & tussen zet dan worden de strings achter elkaar geplakt (dat kan meestal ook met een + , maar dat werkt hier niet).
Wil je alleen de maand, dan kan dat ook. Die krijg je met Month(Now)
De dag (d.w.z. het nummer van de dag in de maand) krijg je met Day(Now)
En het jaar krijg je met Year(Now)
Dus Day(Now) & "-" & Month(Now) & "- " & Year(Now) heeft hetzelfde resultaat als Date

Verder heb je ook nog Hour(Now), Minute(Now), Second(Now) en Weekday(Now)
Dus Hour(Now) & ":" & Minute(Now) & ":" & Second(Now) heeft hetzelfde resultaat als Time

En Weekday(Now) geeft het nummer van de dag van de week. Zondag = 1, Maandag = 2, enz.

  8.5.5 Opdrachten.

Opgaven.
Maak nu opgave 5 van de oefenopgaven van hoofdstuk 8