Zelf objecten maken in VBA Ynte Jan Kuindersma, BIRD Automation Nationale Officedag 2009 EDE, 14 Oktober 2009
Wat is een Objectgeoriënteerd programmeren? Objectgeoriënteerd, vaak afgekort tot OO, is een paradigma dat gebruikt wordt bij het objectgeoriënteerd programmeren en objectgeoriënteerde opslag van data. Bij deze benadering wordt een systeem opgebouwd uit objecten, waarbij ieder object gemaakt is vanuit de definitie van een klasse.paradigmasysteemklasse Belangrijke eigenschappen van objectgeoriënteerd programmeren zijn: Encapsulation (Informatie verbergen): het kunnen verbergen van de interne werking van objecten, waardoor op een hoger niveau geprogrammeerd kan worden. Modulariteit: programma's zijn eenvoudig uit te breiden en klasses zijn makkelijk te hergebruiken (Overerving: het specifieker kunnen maken van een klasse, waarbij (een deel van) een generieke klasse kan worden overgeërfd.) (Polymorfisme: een functie kan geschreven worden voor generieke objecten, en uitgevoerd worden op specifiekere objecten, zonder dat de functie van het bestaan van de specifiekere objecten hoeft af te weten.)Polymorfisme
Objecten Eigenschappen (Word: activedocument.name) Methoden (Word: activedocument.save) Gebeurtenissen (Word: Document_Close())
Begin van OO Type Employee Name As String Address As String Salary As Double End Type
Eigenschappen - I P ublic strNaam As String In klassemodule (bijv. clsUser) Publieke eigenschap Geen code mogelijk
Gebruik van object Declareren Dim x As New clsUser Vullen x.strNaam = "Jan“ Lezen Msgbox x.strNaam
Eigenschappen = II Nu wel code mogelijk Members / Property Get / Property Let Private mAdres As String Property Get strAdres() As String strAdres = mAdres End Property Property Let strAdres(strAdres As String) mAdres = strAdres End Property
Methode (als Sub) Private mBericht As String Private mMailAdres As String Property Let strMailAdres(strAdres As String) mMailAdres = strAdres End Property Property Let strBericht(strBericht As String) mBericht = strBericht End Property Public Sub mailenmaar() Rem code voor mail Rem mail.to = mMailAdres Rem mail.body = strBericht Rem mail.send MsgBox "Bericht voor " & mAdres & vbCr & mBericht End Sub
Methode (als Function) Public Function mailenmaar2() As Boolean Rem code voor mail Rem mail.to = mMailAdres Rem mail.body = strBericht Rem mail.send On Error GoTo foutje: MsgBox "Bericht voor " & mAdres & vbCr & mBericht mailenmaar2 = True Exit Function foutje: mailenmaar2 = False End Function
Gebruik van methoden Dim x As New clsUser x.strNaam = "Jan" x.strAdres = “Gracht 13" x.strMailAdres = x.strBericht = "Groeten " & Time x.Mailenmaar If x.mailenmaar2 = True Then MsgBox "Mail is verzonden" End If
Collections.. Dim objlistNamen As New Collection objlistNamen.Add x Dim intAantal As integer intAantal = objlistNamen.Count For i = 1 To intAantal MsgBox objlistNamen.Item(i).strNaam Next Dim objTest As New clsUser For Each objTest In objlistNamen MsgBox objTest.strNaam Next
Demo – Formulier en Klasse Klasse met gebeurtenissen Updatemax updatetext Formulier dat regeert op gebeurtenissen in Klasse objTikker_UpdateMax objTikker_UpdateText
Events in de Klasse Public Event Updatetext(ByVal dblJump As Double) Public Event UpdateMax(ByVal intqwerty As Integer) Public Sub tikkenmaar() RaiseEvent UpdateMax(mintMax) For j = 1 To 15 For i = 1 To Next RaiseEvent Updatetext(j) Next End Sub
Reageren in het formulier op Klasse-events Private WithEvents objTikker As clstimer Private Sub objTikker_UpdateMax(ByVal intqwerty As Integer) Me.Label3.Caption = intqwerty End Sub Private Sub objTikker_Updatetext(ByVal dblJump As Double) Me.Label1.Caption = dblJump Me.Label2.Width = dblJump * 15 DoEvents End Sub
Start en einde Klasse Private Sub Class_Initialize() Rem code bij initialiseren van de klasse MsgBox "Welkom" mintMax = 200 mintMin = 0 End Sub Private Sub Class_Terminate() Rem code bij afsluiten van de klasse MsgBox "Tot ziens" End Sub
Complete code op formulier Private WithEvents objTikker As clstimer Private Sub CommandButton1_Click() Set objTikker = New clstimer Call objTikker.tikkenmaar End Sub Private Sub objTikker_UpdateMax(ByVal intqwerty As Integer) Me.Label3.Caption = intqwerty End Sub Private Sub objTikker_Updatetext(ByVal dblJump As Double) Me.Label1.Caption = dblJump Me.Label2.Width = dblJump * 15 DoEvents End Sub
Formulier met progressbar
Public Event Updatetext(ByVal dblJump As Double) Public Event UpdateMax(ByVal intqwerty As Integer) Private mintMax As Integer Private mintMin As Integer Property Get intMax() As Integer intMax = mintMax End Property Property Let intMax(intinvoer As Integer) If intinvoer > 200 Then intinvoer = 200 If intinvoer < 0 Then intinvoer = 100 mintMax = intinvoer End Property Public Sub tikkenmaar() RaiseEvent UpdateMax(mintMax) For j = 1 To 15 For i = 1 To Next RaiseEvent Updatetext(j) Next End Sub Private Sub Class_Initialize() Rem code die wordt doorlopen bij initialiseren van de klasse MsgBox "Welkom" mintMax = 200 mintMin = 0 End Sub Private Sub Class_Terminate() Rem code die wordt doorlopen bij afsluiten van de klasse MsgBox "Tot ziens" End Sub
Hyperlinks nl.wikipedia.org/wiki/Objectgeori%C3%AB nteerd nl.wikipedia.org/wiki/Objectgeori%C3%AB nteerd