Visual Basic 11 ActiveX EXE / Objektorientierung Ein ActiveX EXE ist eine selbständige Programmkomponente. Ein früherer Name war „OLE Automation Server“. Er enthält public Klassen, die von anderen Programmen benutzt werden können (out-process Server). Erzeugung eines Klassenmoduls: - Wähle ein ActiveX EXE oder ->Project->Add Class Module Erzeugung einer public variable: public str1 As String Erzeugung einer public procedure (wie üblich) Erzeugung von Ereignissen Benutzung einer Klasse vom Programm aus: - Erzeugung des Objektes mit dem Declaration statement oder mit dem Set statement Setzen und lesen von Werten von Eigenschaften Benutzung von Methoden Freigeben eines Objektes Grundlagen der objektorientierten Programmierung: Kapselung: Ein Objekt hat zwei Teile, die von aussen zugänglichen Oberflächenfunktionen und deren interne Realisierung (Klasse, neuer Datentyp) Vererbung: Ein neues Objekt kann von einem bereits existierendem Objekt mit allen Eigenschaften und Methoden abgeleitet werden und neue Eigenschaften dazu erhalten. (Hierarchie der Klassen) Polymorphie: Die Methoden eines Objektes können - unter Beibehaltung des Namens - anders implementiert werden. (Klassenspezifische Funktionen) Visual Basic hat davon nur die Kapselung. (vorläufig ?) Erzeugung eines Klassenmoduls: - Wähle ein ActiveX EXE oder ->Project->Add Class Module Erzeugung einer public variable: public str1 As String Erzeugung einer public procedure (wie üblich) Erzeugung von Ereignissen Benutzung einer Klasse vom Programm aus: - Erzeugung des Objektes mit dem Declaration statement oder mit dem Set statement Setzen und lesen von Werten von Eigenschaften Benutzung von Methoden Freigeben eines Objektes TFH Berlin/Steyer 11-1 Visual Basic Klassenbeispiel 1 Klasse enthält nur einen Text Formular Klasse Public name As String Diese Klasse kann von Projekten benutzt werden. Code 'Deklaration eines Exemplars Dim x As New Class1 Private Sub Command1_Click() 'Benutzung zur Ausgabe MsgBox x.name End Sub Private Sub Command2_Click() 'Benutzung zur Eingabe x.name = InputBox("Bitte was eingeben") End Sub TFH Berlin/Steyer 11-2 Visual Basic Klassenbeispiel 2 Klasse enthält zwei Texte Formular Klasse: Public title As String Public author As String Code: 'Zwei Deklarationen Dim b1 As New Class1 Dim b2 As New Class1 Private Sub Command1_Click() 'Buch 1 anlegen b1.title = InputBox("Titel eingeben") b1.author = InputBox("Autor eingeben") End Sub Private Sub Command3_Click() 'Buch 1 ausgeben MsgBox b1.title MsgBox b1.author End Sub Private Sub Command2_Click() 'Buch 2 anlegen b2.title = InputBox("Titel eingeben") b2.author = InputBox("Autor eingeben") End Sub Private Sub Command4_Click() 'Buch 2 ausgeben MsgBox b2.title MsgBox b2.author End Sub TFH Berlin/Steyer 11-3 Visual Basic Klassenbeispiel 3 Personenklasse Klasse: Public nummer As Integer Public name As String Public geburtsdatum As Date Public Function alter() alter = DateDiff("yyyy", geburtsdatum, Now) End Function Public Sub wahlspruch() i = Int(1 + Rnd * 5) Select Case i Case 1 MsgBox "Suchet, so werdet ihr finden." Case 2 MsgBox "Bleib immer dir selber treu." Case 3 MsgBox "Üb immer Treu und Redlichkeit." Case 4 MsgBox "Du sollst nicht Ehebrechen." Case 5 MsgBox "Nach dem Sieg binde den Helm fester." End Select End Sub Code: 'Deklaration für 1 Person Dim p1 As New Class1 Private Sub Command1_Click() 'eingeben p1.nummer = InputBox("Nummer eingeben") p1.name = InputBox("Name eingeben") p1.geburtsdatum = InputBox("Geburtsdatum eingeben") End Sub TFH Berlin/Steyer Private Sub Command2_Click() 'ausgeben MsgBox p1.nummer MsgBox p1.name MsgBox p1.geburtsdatum MsgBox p1.alter p1.wahlspruch End Sub 11-4 Visual Basic Klassenbeispiel 4 Klasse mit Zahl und Ereignis Klasse: Public Event error(ByVal errnr As Integer) Public wert As Integer Public Sub meinemethode(ByVal wert As Integer) If wert < 0 Then RaiseEvent error(-1) Else RaiseEvent error(1) End If End Sub Code: 'Deklaration Dim WithEvents x As Class1 Private Sub Form_Load() 'Generierung eines Exemplars Set x = New Class1 End Sub Private Sub Command1_Click() 'Wert besetzen x.wert = InputBox("wert:") End Sub Private Sub Command2_Click() 'Fehler hervorrufen x.meinemethode (x.wert) End Sub TFH Berlin/Steyer Private Sub x_error(ByVal errnr As Integer) 'Fehler abfragen MsgBox errnr End Sub 11-5 Visual Basic Collection erzeugen mit New einfügen Es werden nur Zeiger eingetragen, es kann also jedes beliebige Objekt eingefügt werden. mit Add Schlüssel zweiter Parameter Zugriff mit Eigenschaften und Methoden Count Remove, RemoveAll Exists Keys (nur Schlüssel), Items (Elemente) For each element in <collection> TFH Berlin/Steyer 11-6 Visual Basic Klassenbeispiel 5 Klasse Person mit Collection Klasse: Public nummer As Integer Public name As String Public gebdat As Variant Public Function alter() As Integer alter = DateDiff("yyyy", gebdat, Now) End Function Code: 'Variable für Person, Variable für Collection Dim p As Class1 Dim c As New Collection Private Sub Command1_Click() 'neue Person erzeugen, zur Collection hinzufügen Dim datum As String Set p = New Class1 p.nummer = InputBox("Nummer eingeben") p.name = InputBox("Name eingeben") p.gebdat = InputBox("Geburtsdatum eingeben") c.Add p, Str(p.nummer) End Sub Private Sub Command2_Click() Print c.Count End Sub TFH Berlin/Steyer Private Sub Command4_Click() nr = InputBox("Nummer eingeben") c.Remove Str(nr) End Sub Private Sub Command3_Click() For Each element In c MsgBox element.nummer MsgBox element.name MsgBox element.gebdat MsgBox element.alter Next element End Sub 11-7 Visual Basic Klassenbeispiel 6 Klasse Person mit Collection und Formular TFH Berlin/Steyer 11-8 Visual Basic Klasse: Public nummer As Integer Public name As String Public geburtsdatum As Date Public Function alter() alter = DateDiff("yyyy", geburtsdatum, Now) End Function Code: 'deklarieren Dim p As Class1 Dim c As New Collection Private Sub Command1_Click() 'Formular öffnen Form2.Show End Sub Private Sub Command2_Click() 'Länge der Collection anzeigen Print c.Count End Sub Private Sub Command3_Click() Form3.Show For Each element In c MsgBox element.nummer MsgBox element.name MsgBox element.geburtsdatum MsgBox element.alter Next element End Sub Private Sub Command4_Click() Set p = New Class1 p.nummer = Val(Form2.Text1) p.name = Form2.Text2 p.geburtsdatum = Val(Form2.Text3) MsgBox p.nummer MsgBox p.name MsgBox p.geburtsdatum MsgBox p.alter c.Add p, Str(p.nummer) End Sub TFH Berlin/Steyer 11-9 Visual Basic Klassenbeispiel 7 Klasse Person mit Datenbank TFH Berlin/Steyer 11-10 Visual Basic Klasse: Public nummer As Integer Public name As String Public geburtsdatum As Date Public Function alter() alter = DateDiff("yyyy", geburtsdatum, Now) End Function Code: Dim p As Class1 Dim c As New Collection Private Sub Command1_Click() Form2.Show End Sub Private Sub Command3_Click() Form3.Show End Sub Private Sub Command4_Click() 'in Datenbank schreiben Set p = New Class1 p.nummer = Val(Form2.Text1) p.name = Form2.Text2 p.geburtsdatum = Val(Form2.Text3) Dim db As Database Dim ta As Recordset Set db = DBEngine.Workspaces(0).Databases(0) Set ta = db.OpenRecordset("person") ta.AddNew ta![nummer] = p.nummer ta![name] = p.name ta![geburtsdatum] = p.geburtsdatum ta![alter] = p.alter ta.Update ta.Close End Sub Private Sub Command1_Click() aus Datenbank holen Set p = New Class1 Dim db As Database Dim ta As Recordset Set db = DBEngine.Workspaces(0).Databases(0) Set ta = db.OpenRecordset("person") ta.MoveFirst While Not ta.EOF [Text1] = ta![nummer] [Text2] = ta![name] [Text3] = ta![geburtsdatum] [Text4] = ta![alter] MsgBox "Weiter?" ta.MoveNext Wend ta.Close End Sub TFH Berlin/Steyer 11-11 Visual Basic Projekttypen Standard EXE Standard-Windows-Programm mit Formularen ActiveX Control Eigenes Kontrollelement (OCX), z.B. Treiber, Plug-In Kann in vielen anderen Windows-Anwendungen benutzt werden ActiveX EXE Programm mit public Klassen, die von einem anderen Programm aufgerufen werden können ("OLE automation server") ActiveX DLL Wie ActiveX EXE, aber in Form einer DLL, kann von einem anderen Programm aufgerufen werden, läuft innerhalb des aufrufenden Prozesses als thread Standard EXE ActiveX Control (einbettbar über Toolbox oder Menü) ActiveX EXE (einbettbar über Menü, einzelnes Programm, out-of-process) ActiveX DLL (n Funktionen, in-process) TFH Berlin/Steyer 11-12 Visual Basic Erzeugung einer eigenen Klasse ->Projekt->Klassenmodul hinzufügen: Es öffnet sich das Codefenster. Vorteil: Kapselung von Daten und Code, überall verwendbar Hinzufügen von Eigenschaften entweder als einfache public-Variable (zugreifbar mit Klassenname als Präfix) Bsp.: nur Datensatz oder intelligenter Datensatz Public title As String Public author As String oder mit Eigenschaftsprozeduren (wenn beim Lesen oder Setzen noch Code ausgeführt werden soll) Public Property Get BackColor1() As OLE_COLOR BackColor1 = UserControl.BackColor End Property Public Property Let BackColor2(ByVal New_BackColor As OLE_COLOR) UserControl.BackColor = New_BackColor PropertyChanged "BackColor" End Property Hinzufügen von Methoden als einfache public-Sub oder public-Funktion (zugreifbar mit Klassenname als Präfix) Bsp.: Mehrwertsteuer Hinzufügen von Ereignissen In der Klasse können Ereignisse erzeugt werden, auf die andere Windows-Prozeduren reagieren können. 1) Deklaration des Ereignisses in der Klasse 2) Erzeugung des Ereignisses mit dem Befehl RaiseEvent 3) Schreiben einer entsprechenden Ereignisprozedur ausserhalb. Bsp.: Ausgabe von Statusmeldungen bei lange laufenden Klassenaktionen TFH Berlin/Steyer 11-13 Visual Basic Hauptprogramm kommuniziert mit der Klasse über Eigenschaftsprozeduren Routinen in der Klasse: Public Property Get BackColor1() As OLE_COLOR BackColor1 = UserControl.BackColor End Property Public Property Let BackColor2(ByVal New_BackColor As OLE_COLOR) UserControl.BackColor = New_BackColor PropertyChanged "BackColor" End Property Aufrufe ausserhalb im Hauptprogramm: Private Sub Command1_Click() MsgBox UserControl.BackColor1 End Sub Private Sub Command2_Click() UserControl.BackColor2 = 255 End Sub Private Sub Command3_Click() UserControl.BackColor2 = 65535 End Sub TFH Berlin/Steyer 11-14 Visual Basic Collection Dim c As New Collection Dim element, summe As Integer Liste aufbauen Private Sub Command2_Click() c.Add "eine Zeichenkette", "abc" End Sub Private Sub Command3_Click() c.Add 123123, "def" End Sub Private Sub Command4_Click() c.Add Form1, "ghi" End Sub Private Sub Command5_Click() c.Add Command1, "jkl" End Sub Private Sub Command6_Click() Print c.Count End Sub TFH Berlin/Steyer 11-15 Visual Basic Zugreifen, Manipulieren Private Sub Command11_Click() Print c(1) End Sub Private Sub Command9_Click() Print c("def") End Sub Private Sub Command10_Click() Print c![jkl].Caption End Sub Private Sub Command7_Click() c.Remove "abc" End Sub Private Sub Command8_Click() Print c(1) End Sub Zahlencollection, Schleife, Addieren Private Sub Command12_Click() c.Remove "def" c.Remove "ghi" c.Remove "jkl" Print c.Count c.Add 1, "a" c.Add 2, "b" c.Add 3, "c" Print c.Count End Sub Private Sub Command13_Click() summe = 0 For Each element In c summe = summe + element Next element MsgBox summe End Sub TFH Berlin/Steyer 11-16