Einführung in die Programmierung mit Visual Basic.NET Dipl.-Kfm. Lars Burmester WS 2006/2007 Einführung in die Programmierung mit VB.NET Literatur • Kofler, Michael: Visual Basic.NET, Addison-Wesley, München, Boston u.a. 2002 (~50 €) • Monadjemi, Peter: Jetzt lerne ich Visual Basic .NET, Markt & Technik, München 2004 (25 €) • Martin, René: Einstieg in VB.NET, Galileo Computing, 2002 (20 €) • Craig, John Clark; Webb, Jeff: Visual Basic 5.0 - Entwickler-Workshop, Microsoft Press, Redmond, Washington 1997 (85 DM) Einführung in die Programmierung mit VB.NET 1 Programmiersprachen • Erzeugung von Code, den der Computer ausführen kann • 2 wesentliche Unterscheidungsmerkmale für Programmiersprachen: – Art der Symbolik (Syntax) – Art der Code-Erzeugung (Compiler vs. Interpreter) Einführung in die Programmierung mit VB.NET 2 Art der Symbolik - Grad der Abstraktion vom Maschinencode Maschinennahe Sprachen Höhere Programmiersprachen • rechnerspezifisch • kompakt und schnell • z. B. Assembler • • • • • Einführung in die Programmierung mit VB.NET rechnerunabhängig umfangreichere Befehle leichter erlernbar langsamer und größer z.B. Cobol 3 Art der Code-Erzeugung Compiler-Sprachen Interpreter-Sprachen • das in der Programmiersprache verfasste Programm (Quellprogramm) wird komplett in Maschinensprache übersetzt und kann als solches gespeichert (Objektprogramm) und anschließend ausgeführt werden • EXE- bzw. BAT-Datei • z.B. Pascal • Programm wird Zeile für Zeile abgearbeitet, d.h. Anweisungen werden geprüft und unmittelbar ausgeführt • kein Objektprogramm • Entwicklungsumgebung bzw. Engine zum Ausführen des Programms notwendig • langsamer • z.B. BASIC, Small-Talk, PHP, ASP, Javascript Mischformen • kombinierter Einsatz von Compiler und Interpreter • z.B. Java Einführung in die Programmierung mit VB.NET 4 Programmausführungsmodell von .NET C# VB C++ Java Language compilers MSIL code (plus metadata) Loader JIT + verifier Managed code Execution Einführung in die Programmierung mit VB.NET Unjitted routine call MSIL: Microsoft Intermediate Language JIT: Judiciously Incremental Translation Historie der Programmiersprachen Jahr VB.NET C# 2000 PHP ASP Java V. Basic 1990 Perl C++ 1980 ADA Modula2 C 1970 Smalltalk Pascal Prolog Algol 68 Simula 1960 PL/1 Basic Algol 60 APL Lisp Cobol Fortran Einführung in die Programmierung mit VB.NET 6 Prozedurales vs. objektorientiertes Programmieren Methode Daten Funktion Methode Funktion Funktion Methode Daten Methode Funktion Funktion Methode Daten Methode Methode Daten Daten Methode Prozedurales Programmieren Einführung in die Programmierung mit VB.NET Objektorientiertes Programmieren 7 Entwicklungsumgebung "VisualStudio.NET" • Hauptfenster • ProjektmappenExplorer • Toolbox • Formularfenster • Eigenschaftsfenster • Codefenster Einführung in die Programmierung mit VB.NET 8 Beispielprogramm „Hello World!“ • Neues Projekt • Steuerelemente einfügen • Eigenschaften festlegen • Programmcode erstellen • Programm speichern Einführung in die Programmierung mit VB.NET 9 Variablen ... sind Platzhalter für Zahlen, Text oder andere Daten. Variablen werden dazu verwendet, Daten während des Programmablaufs vorübergehend zu speichern und Berechnungen mit ihnen auszuführen. Deklaration: – Option Explicit On Variablen müssen vor ihrer ersten Verwendung mit Dim deklariert werden, z.B. Dim intZahl1 – Option Strict On Variablen müssen mit expliziter Typangabe deklariert werden, z.B. Dim intZahl1 As Integer – Initialisierung (erste Wertzuweisung) bei Deklaration möglich, z.B. Dim intZahl1 As Integer = 1 Konstanten: – werden mit Const definiert, z.B. Const Pi As Double = 3.14159265 Vgl. Kofler, VB.NET, S. 116ff. Einführung in die Programmierung mit VB.NET 10 Datentypen in VB.NET Datentyp Suffix Byte Wertebereich Boolean Byte Short Integer Long % & 2 1 2 4 8 True oder False ganze Zahlen: 0 ... 255 ganze Zahlen: -32.768 ... +32.767 ganze Zahlen: -2.147.483.648 und 2.147.483.647 ganze Zahlen: -263 ... 263-1 Single Double Decimal ! # @ 4 8 16 Fließkommazahlen mit einfacher Genauigkeit Fließkommazahlen mit doppelter Genauigkeit Festkommazahlen mit 28 Stellen Genauigkeit $ 2 10+2*n ein Unicode-Zeichen Zeichenketten Date 8 Datumsangaben Object 4+n Defaultdatentyp, selbst anpassend Char String Beispiele für Suffix-Verwendung: Dim i% statt Dim i As Integer Dim Name$ statt Dim Name As String Vgl. Kofler, VB.NET, S. 116ff. Einführung in die Programmierung mit VB.NET 11 Konvertierungsfunktionen Daten bzw. Variablen müssen häufig in verschiedene Datentypen umgewandelt werden. Beispiel: Berechnungen kann man nur mit numerischen Datentypen durchführen. Um mit einer Zeichenkette (z.B. Benutzereingabe in einem Textfeld) rechnen zu können, muss diese zunächst in einen numerischen Datentyp (z.B. Integer, Double) umgewandelt werden. Für explizite Typkonvertierungen sieht VB.NET die Funktionen CBool, CByte, CChar, CDate, CDbl, CDec, CInt, CLng, CObj, CShort, CSng und CStr vor. Beispiel für die Konvertierung eines Strings in eine Integerzahl: intZahl = CInt (txtEingabe.Text) Vgl. Kofler, VB.NET, S. 334ff. Einführung in die Programmierung mit VB.NET 12 Formatierungsmethoden Zum Formatieren von Variablen steht die Methode ToString zur Verfügung, die auf alle elementaren Datentypen und Objekte angewandt werden kann. Allgemeine Form: String = Variable.ToString("Formatcode") Vordefinierte Formatcodes: Code Bedeutung c f f3 n p curreny fixed-point number percent Beispiel Währungsformat Festkommaformat Festkommaformat mit 3 Nachkommastellen Format mit Tausendertrennung Prozentzahlen (Achtung: 1 = 100%) 123.456.789,00 € 123456789,00 123456789,000 123.456.789,00 0.256 25,60% Beispiel: Dim dblWert As Double = 20999.9 txtAusgabe.Text = dblWert.ToString("c") Vgl. Kofler, VB.NET, S. 339ff. Einführung in die Programmierung mit VB.NET 13 Operatoren in VB.NET (I) arithmetische Operatoren: = + * / \ Mod ^ : einfacher Zuweisungsoperator : Addition Beispiele: : Subtraktion int3 = int1 + int2 : Multiplikation x = (r / s) - (d * r) + v^3 : Division : Ganzzahldivision : Restwertdivision (Modulo-Operation) : Potenz (Hochzahl) Verknüpfung von Zeichenketten: + & : verknüpft Zeichenketten : verknüpft beliebige Datentypen, sofern diese in Zeichenketten umgewandelt werden können Beispiele: str1 = "ab" + "bc" str2 = "12" & 3 Vgl. Kofler, VB.NET, S. 181ff. Einführung in die Programmierung mit VB.NET 14 Operatoren in VB.NET (II) Vergleichsoperatoren: > >= < <= = <> Like : größer als : größer als oder gleich : kleiner als : kleiner als oder gleich : gleich : ungleich : Mustervergleich für Zeichenketten logische Operatoren: Not And Or Xor Beispiele: intZahl1 < intZahl2 x <> y (s >= 5) And (x = y) : Negation : UND-Verknüpfung (auch: AndAlso) : ODER-Verknüpfung (auch: OrElse) : exklusives Oder Einführung in die Programmierung mit VB.NET 15 Operatoren in VB.NET (III) VB.NET kennt die von C oder Java bekannten Zuweisungsoperatoren wie +=, -= etc. Damit ist a += 1 also eine Kurzschreibweise für a = a + 1. Zuweisungsoperatoren: += -= *= /= += &= : erhöht bzw. erniedrigt eine Variable um den angegebenen Wert : multipliziert bzw. dividiert eine Variable um den angegebenen Wert : fügt einer Zeichenkette eine andere Zeichenkette hinzu Einführung in die Programmierung mit VB.NET 16 Exkurs: Richtlinien für guten Programmierstil • Elemente (Variablen, Forms, Steuerelemente u.a.) aussagekräftig benennen – Präfixe verwenden • Verwendung von Option Explicit On oder besser Option Strict On • Variablen und Parameter mit geeigneten Datentypen versehen • immer kleinstmöglichen Gültigkeitsbereich für Variablen und Prozeduren verwenden • Inline-Dokumentation – Zweck der Prozedur – Vor Schleifen: Was wird verarbeitet? Ausstiegsbedingung? – ... Vgl. Craig/Webb, Workshop, S. 41ff. Einführung in die Programmierung mit VB.NET 17 Präfixe für die Benennung von Steuerelementen • • • • • • • • • • • • Button CheckBox ComboBox Database Form Label ListBox Menu PictureBox RadioButton TextBox Timer Befehlsschaltfläche Kontrollkästchen Kombinationsfeld (ODBC-)Datenbank Formular Bezeichnungsfeld Listenfeld Menü Bildfeld Optionsfelder Textfeld Zeitgeber but chk cbo db frm lbl lst mnu pic rad txt tmr Vgl. Craig/Webb, Workshop, S. 42f. (angepasst an neue Steuerelemente von VB.NET) Einführung in die Programmierung mit VB.NET 18 Aufgabe 1) Erstellen Sie ein Programm, mit dessen Hilfe Sie in der Lage sind, den Endwert einer Kapitalanlage zu berechnen, wobei Endwert Anfangswert *(1 Zins)Dauer >>>> Anlage Einführung in die Programmierung mit VB.NET 19 Verwendung der .NET-Bibliotheken VB.NET beinhaltet bereits von Hause aus eine Vielzahl an Funktionen und Leistungsmerkmalen, die in der sogenannten .NET-Klassenbibliothek bereitgestellt werden. In VB.NET-Programmen können Sie nur die Klassen, Strukturen und Methoden solcher Bibliotheken nutzen, auf die Sie in Ihrem Programm verweisen. Der Zugriff auf die Klassen erfolgt in der Schreibweise System.Klasse.Subklasse (z.B. System.Windows.Forms.Button). Damit bei der Nutzung von Klassen nicht jedes Mal der gesamte Klassenname angegeben werden muss, kann mit dem Schlüsselwort Imports am Beginn einer Codedatei ein Verweis auf sog. Namensräume eingerichtet werden. Ein Namensraum fasst mehrere Klassen, die inhaltlich zusammengehören, zu einer Gruppe zusammen (z.B. System.Windows.Forms). Ein Imports-Verweis bewirkt, dass der Compiler bei der Auflösung von Klassennamen automatisch die entsprechenden Namensräume durchsucht. Vgl. Kofler, VB.NET, S. 193ff. Einführung in die Programmierung mit VB.NET 20 Arithmetische Funktionen Arithmetische Funktionen sind Teil der System.Math-Klasse. Der Zugriff auf diese Funktionen erfolgt demnach in der Schreibweise: System.Math.Funktion(Parameter) Beispiel: dblVar = System.Math.Sqrt(64) 'Ermittelt die Quadratwurzel der Zahl 64 Wenn Sie häufig arithmetische Funktionen einsetzen, sollten Sie die Anweisung Imports System.Math verwenden: Imports System.Math ... dblVar = Sqrt(64) 'am Beginn des Codes Wichtige Math-Funktionen: Abs(x), Cos(x), Sin(x), Tan(x), Log(x), Log10(x), Sqrt(x), ... Anmerkung: Alle Math-Funktionen erwarten Double-Parameter und liefern DoubleErgebnisse! Vgl. Kofler, VB.NET, S. 293f. Einführung in die Programmierung mit VB.NET 21 Aufgabe 2) Erstellen Sie ein Programm, mit dessen Hilfe die optimale Bestellmenge berechnet werden kann. Die Formel dazu lautet: optimale Bestellmenge bestellfixe Kosten * Jahresbedarf * 2 Pr eis *( Zins Lagerkosten ) >>>> Bestellmenge Einführung in die Programmierung mit VB.NET 22 Die IF-THEN-ELSE-Anweisung Allgemeine Form: Ablauf: If Ausdruck Then Anweisung 1 ... Ausdruck Then ElseIf Anweisung Else Anweisung 2 End If Beispiel: If i=10 Then txtAusgabe.Text = "i ist gleich 10" Else txtAusgabe.Text = "i ist ungleich 10" End If Vgl. Kofler, VB.NET, S. 162 Einführung in die Programmierung mit VB.NET 23 Aufgabe 3) Schreiben Sie ein Programm, das bei Eingabe des zu versteuernden Einkommens die Einkommensteuer berechnet (siehe § 32a EStG). Es gilt: x <= 7235 T=0 7236 <= x <= 9251 T = (768,85*y +1990)*y, mit y=(x-7200)/10000 9252 <= x <= 55007 T = (278,65*z+2300)*z, mit z=(x-9216)/10000 55008 <= x T = 0,485*x - 9872 wobei x = zu versteuerndes Einkommen und T = Einkommensteuer >>>> Steuer Einführung in die Programmierung mit VB.NET 24 Die FOR-NEXT-Schleife Ablauf: Allgemeine Form: For Zähler=Start To Ende [Step Schrittweite] Anweisungsblock Next [Zähler] Beispiel: For i=1 To 10 txtAusgabe.Text = "i = " & i.ToString x=x*i Next i Zähler=Start Zähler>Ende Falsch Wahr Anweisungen next Zähler (gemäß step) nächste Anweisung Vgl. Kofler, VB.NET, S. 165f. Einführung in die Programmierung mit VB.NET *) Das ‚>‘-Zeichen gilt nur für einen positiven Step. Bei negativem Step gilt analog ein ‚<‘-Zeichen. 25 Aufgabe 4) Schreiben Sie ein Programm, mit dessen Hilfe die geometrische Reihe 1 1 1 gn 1 ... n 1 2 4 2 für ein beliebiges n berechnet werden kann. >>>> Reihe Einführung in die Programmierung mit VB.NET 26 Die ListBox (I) Das Steuerelement ListBox bietet die Möglichkeit, Listen darzustellen und ein Element bzw. mehrere Elemente aus diesen auszuwählen. Hinzufügen von Elementen in die ListBox: ListBox.Items.Add (Objekt) : fügt der Liste ListBox ein Element als neue Zeile hinzu ListBox.Items.Insert (Index, Objekt) : fügt der Liste ListBox ein Element an der Stelle Index hinzu Zugriff auf Element aus der ListBox: ListBox.Items (Index) : liefert das Element mit der angegebenen Indexnummer aus der Liste ListBox Listenauswahl auswerten (nur bei Einfachauswahl!): ListBox.SelectedItem : verweist auf das ausgewählte Element (Nothing, wenn nichts ausgewählt) ListBox.SelectedIndex : gibt die Indexnummer des ausgewählten Elementes an (-1, wenn nichts ausgewählt) ListBox.Text : enthält die Zeichenkette des ausgewählten Elementes Einführung in die Programmierung mit VB.NET 27 Die ListBox (II) Entfernen von Elementen aus der ListBox: ListBox.Items.Remove (Objekt) : entfernt ein spezifiziertes Element aus der Liste ListBox; Beispiel: ListBox.Items.Remove (ListBox.SelectedItem) ' entfernt das ausgewählte Element aus der Liste ' ListBox ListBox.Items.RemoveAt (Index) : entfernt das Element mit der angegebenen Indexnummer aus der Liste ListBox; Beispiel: ListBox.Items.RemoveAt (ListBox.SelectedIndex) ' entfernt das ausgewählte Element aus der Liste ' ListBox ListBox.Items.Clear : löscht den Inhalt der gesamten Liste ListBox Anzahl der Elemente in einer ListBox: ListBox.Items.Count : liefert die Anzahl der Elemente der Liste ListBox; Index des letzten Elements: ListBox.Items.Count-1 Anmerkung: Der Index einer ListBox fängt mit Null an! Einführung in die Programmierung mit VB.NET Vgl. Kofler, VB.NET, S. 612ff. 28 Aufgabe 5) Erstellen Sie ein Programm, welches für die Zahlen 1 bis 5 das Einmaleins ausgibt; d.h. 1*1, 1*2, ..., 5*5. Schreiben Sie das Ergebnis in eine Liste. >>>> Einmaleins Einführung in die Programmierung mit VB.NET 29 Die DO-LOOP-Schleifen Ablauf: Allgemeine Form: Do Anweisungsblock Loop [{While | Until} Ausdruck] Beispiel: Do x=i*10 i=i+1 Loop While i<>20 Anmerkung: Auch hinter Do können Bedingungen mit den Schlüsselwörtern While oder Until angegeben werden. Einführung in die Programmierung mit VB.NET Vgl. Kofler, VB.NET, S. 166f. 30 Aufgabe 6) Erstellen Sie ein Programm, welches den Verlauf eines Kredites zeigt. Abgefragt werden soll die Kreditsumme, der Tilgungsbetrag und der Zinssatz (p.a. und in Prozent). Die Tilgung soll monatlich erfolgen. In jedem Monat fallen somit eine Tilgungsrate und eine Zinszahlung in Höhe auf die noch vor der Tilgung vorhandene Restkreditsumme an. Der Kredit ist dann abgelaufen, wenn keine Restkreditsumme mehr vorhanden ist. Ausgegeben werden soll für jede Periode die Nummer des Monats, der Tilgungsbetrag, die geleistete Zinszahlung und der verbleibende Restkreditbetrag. Verwenden Sie dazu auch eine Liste. >>>> Kredit Einführung in die Programmierung mit VB.NET 31 Felder in VB.NET (I) Ein Feld ist eine Zusammenfassung mehrerer Variablen gleichen Datentyps unter einer Bezeichnung. Der Zugriff zu den Feldelementen erfolgt nicht über einen Variablennamen, sondern mittels eines Laufindex. Vorteil von Feldern: Statt umfangreicher Deklarationen ist nur eine Deklaration notwendig; z.B. montag, ..., freitag woche(Index). Bei der Deklaration eines Feldes wird die maximale Zahl der Feldelemente i.d.R. direkt festgelegt. Unabhängig davon muss jedoch nicht jedes Feldelement später mit einem Wert belegt werden. Allgemeine Form der Deklaration eines Feldes: Dim Feldname(Elementzahl) As Datentyp Beispiel: Dim vektor(10) As Integer erzeugt Feld mit 11 Elementen! Der Zugriff erfolgt dann z.B. über vektor(1) = 1 oder intZahl = vektor(9) Anmerkung: Der Index fängt mit Null an! Vgl. Kofler, VB.NET, S. 139ff. Einführung in die Programmierung mit VB.NET 32 Felder in VB.NET (II) Beispiel: Dim i As Integer Dim feld(9) As Integer For i=0 To 9 feld(i) = i+1 Next i feld(3) = feld(3) * 4 feld(7) = feld(5) + feld(8) * feld(2) Einführung in die Programmierung mit VB.NET feld(0) feld(1) feld(2) feld(3) feld(4) feld(5) feld(6) feld(7) feld(8) feld(9) 1 2 3 4 5 6 7 8 9 10 feld(0) feld(1) feld(2) feld(3) feld(4) feld(5) feld(6) feld(7) feld(8) feld(9) 1 2 3 16 5 6 7 33 9 10 33 Aufgabe 7) Schreiben Sie ein Programm zur Berechnung des Kapitalwertes. Die Formel zur Berechnung ist: Kapitalwert Dauer Einzahlungen t 1 t Auszahlungen t * 1 i t Re stwert * 1 i Dauer Anschaffungskosten >>>> Kapitalwert Einführung in die Programmierung mit VB.NET 34 Felder in VB.NET (III) Felder können in Visual Basic auch mehrere Dimensionen haben. Die Deklaration erfolgt in der Form Dim Feldname(x, ...) As Datentyp Beispiel für ein zweidimensionales Feld: Dim Matrix(2,3) As Single erzeugt Feld mit 3*4=12 Elementen! Verwendung im Programm: Matrix(1,2) = x * 27 + 5 Auch wenn ein solches Feld für den Programmierer mehrere Dimensionen umfasst, wird es im Speicher sequentiell abgelegt: Matrix(0,0) 0 1 2 3 0 1 2 Einführung in die Programmierung mit VB.NET Matrix(0,1) Matrix(0,2) Matrix(0,3) Matrix(1,0) Matrix(1,1) Matrix(1,2) Matrix(1,3) Matrix(2,0) Matrix(2,1) Matrix(2,2) Matrix(2,3) 35 Schleife über alle Steuerelemente (I) Bei For-Each-Schleifen durchläuft die Schleifenvariable alle Elemente eines angegebenen Felds bzw. einer Aufzählung. Das folgende Beispiel verdeutlicht die Syntax. Der Datentyp der Schleifenvariable muss mit dem des Felds bzw. der Aufzählung übereinstimmen. Die Schleife kann vorzeitig mit Exit For abgebrochen werden. Beispiel: Dim i As Integer Dim Vektor() As Integer = {12, 7, 4} For Each i In Vektor MsgBox ("Der Vektor enthält: " & i) Next Vgl. Kofler, VB.NET, S. 166 Einführung in die Programmierung mit VB.NET 36 Schleife über alle Steuerelemente (II) Die Eigenschaft Controls von Formularen bzw. von Container-Steuerelementen (z.B. GroupBox, Panel) verweist auf alle Steuerelemente im Formular bzw. Container. Mit einer For-Each-Schleife kann bequem auf diese Aufzählung von Steuerelementen zugegriffen werden. Beispiel: Dim c As Control Dim Farbe As String For Each c In pnlFarbe.Controls Farbe = Mid(c.Name, 4) MsgBox(Farbe, , "Farbe") Next Vgl. Kofler, VB.NET, S. 690-696 Einführung in die Programmierung mit VB.NET 37 Aufgabe 8) Schreiben Sie ein Programm, welches die Multiplikation zweier 3x3-Matrizen vornimmt und das Ergebnis in einer Ergebnismatrix ausgibt. >>>> MatMul Einführung in die Programmierung mit VB.NET 38 Prozeduren (I) Prozeduren sind die Zusammenfassung von Code-Teilen unter einem einheitlichen Namen. Sie können sich gegenseitig aufrufen und dabei Parameter übergeben. Der Aufruf erfolgt durch Nennung des Prozedurnamens sowie der Übergabe der geforderten Parameter. Allgemeine Struktur: Sub Prozedurname (Parameterliste) lokale Variablen Anweisungen End Sub Beispiel: Sub Addiere (ByVal Z1 As Integer, ByVal Z2 As Integer, ByVal txt As TextBox) Dim Ergebnis As Integer Ergebnis = Z1 + Z2 txt.Text = Ergebnis.ToString("n0") End Sub Aufruf mit: Addiere (2, 5, txtAusgabe) Vgl. Kofler, VB.NET, S. 167 Einführung in die Programmierung mit VB.NET 39 Prozeduren (II) Es existieren zwei Arten der Parameterübergabe: (1) Call by value (als Wertparameter) - Übergabe des Wertes der Variablen - Wert wird für die Prozedur im Speicher kopiert - Veränderungen des Wertes innerhalb der Prozedur betreffen nur die Kopie Beispiel: Sub Berechne (ByVal a As Integer, ByVal b As Single) (2) Call by reference (als Rückgabeparameter) - Übergabe der Adresse der Variablen - Adresse wird für die Prozedur im Speicher kopiert - Veränderungen des Wertes innerhalb der Prozedur betreffen auch die aufrufende Prozedur Beispiel: Sub Berechne (ByRef a As Integer, ByRef b As Single) Vgl. Kofler, VB.NET, S. 174 Einführung in die Programmierung mit VB.NET 40 Prozeduren (III) Beispiel: Sub Berechne_Click Dim a As Integer a=5 txtTest.Text = a.ToString Aendere1 (a) txtTest.Text = a.ToString Aendere2 (a) txtTest.Text = a.ToString End Sub Ergebnis: Vor den Prozeduren: txtTest.Text = 5 Innerhalb Aendere1: txtTest.Text = 6 Nach Aendere1: txtTest.Text = 5 Innerhalb Aendere2: txtTest.Text = 6 Nach Aendere2: txtTest.Text = 6 Sub Aendere1 (ByVal a As Integer) a=6 txtTest.Text = a.ToString End Sub Sub Aendere2 (ByRef a As Integer) a=6 txtTest.Text = a.ToString End Sub Einführung in die Programmierung mit VB.NET 41 Fehlerabsicherung mit Try-Catch Um zu vermeiden, dass ein unerwarteter Fehler zur Anzeige eines Fehlerdialoges und zum anschließenden Programmende führt, kann der Code mit einer Try-CatchKonstruktion abgesichert werden. Allgemeine Form: Try Code, der eventuell Fehler auslösen könnte Catch Code, um auf den Fehler zu reagieren End Try Beispiel: Try 'wurde in txtPruef ein Double-Wert eingegeben? Dim Dummy As Double Dummy = CDbl(txtPruef.Text) Catch 'wenn nicht, dann MessageBox.Show("Fehler!") 'Dialogfenster mit Fehlermeldung anzeigen txtPruef.Text = "" 'TextBox wieder leeren txtPruef.Focus() 'Cursor in leerer Textbox blinken lassen End Try Vgl. Kofler, VB.NET, S. 479ff. Einführung in die Programmierung mit VB.NET 42 Validating-Ereignis Es gibt verschiedene Zeitpunkte, zu denen überprüft werden kann, ob Benutzereingaben in einem Steuerelement korrekt sind. Ein möglicher Zeitpunkt ist der des Fokuswechsels, also der Moment, in dem ein Steuerelement wieder verlassen werden soll. Dann tritt das Validating-Ereignis des Steuerelementes auf. Erzeugung einer Code-Schale für das Validating-Ereignis eines Steuerelementes: - Öffnen des Codefensters - im linken Listenfeld das gewünschte Steuerelement auswählen - im rechten Listenfeld das Validating-Ereignis auswählen Hinweis: Analog können auch Code-Schalen für andere Ereignisse erzeugt werden. Vgl. Kofler, VB.NET, S. 590, 727 Einführung in die Programmierung mit VB.NET 43 Aufgabe 9) Erweitern Sie das Programm zur Ermittlung der Optimalen Bestellmenge (Aufgabe 2) um eine Prozedur zur Plausibilitätsprüfung von Benutzereingaben. Die Prozedur soll als Parameter die zu überprüfende TextBox und den geforderten Datentyp übergeben bekommen. Die Prozedur soll jeweils aufgerufen werden, wenn der Benutzer nach einer Eingabe versucht, die TextBox zu verlassen. >>>> Bestellmenge1 Einführung in die Programmierung mit VB.NET 44 Funktionen Funktionen arbeiten ähnlich wie Prozeduren, geben jedoch als Ergebnis einen Wert zurück. Dieser Rückgabewert kann einen beliebigen Datentyp haben. Innerhalb der Funktion erfolgt die Angabe des Rückgabewertes mit dem Schlüsselwort Return oder mit einer Zuweisung an den Funktionsnamen. Allgemeine Struktur: Function Funktionsname (Parameterliste) As Datentyp lokale Variablen Anweisungen End Function Beispiel: Function Summe (ByVal a As Integer, ByVal b As Integer) As Integer Summe = a + b 'auch möglich: Return a+b End Function Aufruf mit: c = Summe(a, b) Vgl. Kofler, VB.NET, S. 167ff. Einführung in die Programmierung mit VB.NET 45 Aufgabe 10) Modifizieren Sie das Programm zur Matrizenmultiplikation (Aufgabe 8): 1. Das Einlesen der Matrizen M1 und M2 soll eine Funktion übernehmen, die als Parameter das Panel-Steuerelement übergeben bekommt, in welchem sich die Textfelder der einzulesenden Matrix befinden. Der Rückgabewert soll die eingelesene 2x2-Matrix enthalten. Tip! Der Funktionskopf könnte so aussehen: Function MatrixEinlesen(ByVal pnl As Panel) As Double(,) 2. Das Ausgeben der Ergebnismatrix soll eine Prozedur übernehmen, die als Parameter das Panel-Steuerelement, in welchem sich die Textfelder für die Matrix-Ausgabe befinden, und die auszugebende 2x2-Matrix erhält. Tip! Der Prozedurkopf könnte so aussehen: Sub MatrixAusgeben(ByVal pnl As Panel, ByVal M As Double(,)) >>>> MatMul1 Einführung in die Programmierung mit VB.NET 46 Arbeiten mit mehreren Forms (I) Visual-Basic-Programme bestehen i.d.R. aus mehreren Forms. Mit dem Menüpunkt "Projekt - Windows Form hinzufügen ..." können zu einem Projekt weitere Forms hinzugefügt werden. Üblicherweise werden die Forms dann im Windows Form Designer gestaltet, womit man im Prinzip jedes Mal eine neue Klasse entwirft. Anschließend können von den so neu geschaffenen Form-Klassen während der Laufzeit Objektinstanzen erzeugt (New-Konstruktor) und angezeigt werden. Vgl. Kofler, VB.NET, S. 718, 722, 757ff. Einführung in die Programmierung mit VB.NET 47 Arbeiten mit mehreren Forms (II) Unterscheidung beim Anzeigen neuer Form-Objekte: (1) Modale Forms (ShowDialog) Wird eine Form modal angezeigt, so bedeutet dies, dass der Anwender auf diese Form reagieren muss. Solange eine modale Form am Bildschirm angezeigt wird, kann kein anderes Fenster mehr bedient werden - die Codeausführung stoppt, bis die modale Form wieder geschlossen wird. (2) Gleichberechtigte Forms (Show) Wird eine Form gleichberechtigt angezeigt, so können die anderen Fenster weiterhin parallel bedient werden. Code-Beispiel: Dim frm As New frmInfo frm.Show() Code-Beispiel: Dim frm As New frmInfo frm.ShowDialog() In beiden Fällen kann ein angezeigtes Form-Objekt mit - Me.Close wieder geschlossen oder mit - Me.Hide ausgeblendet werden. Vgl. Kofler, VB.NET, S. 758ff. Einführung in die Programmierung mit VB.NET 48 Aufgabe 11) Erweitern Sie das Kapitalwertprogramm, indem Sie einen "Info"-Button in die Hauptform einfügen, bei dessen Betätigung sich eine neue Form modal öffnet, die den Namen des Programms sowie dessen Autor ausweist. >>>> Kapitalwert1 Einführung in die Programmierung mit VB.NET 49 MDI-Anwendungen Problem beim Arbeiten mit mehreren Forms ist, dass diese unabhängig voneinander auf dem Bildschirm dargestellt werden. Häufig ist es sinnvoll, ein Hauptfenster zu bestimmen. MDI-Anwendungen ermöglichen dies. MDI steht für Multiple Document Interface und bedeutet, dass in einem meist bildschirmfüllenden Hauptfenster mehrere Dokumentfenster angezeigt werden. Es kann pro Anwendung nur eine MDI-Form geben. Sie muss die Start-Form sein. Erstellt wird sie wie eine gewöhnliches Form, lediglich die IsMdiContainer-Eigenschaft wird auf True gestellt. Um dann eine Form als Subfenster der MDI-Form anzuzeigen, muss beim Aufruf der Form die Eigenschaft MdiParent den Wert Me zugewiesen bekommen, der auf das Hauptfenster verweist. Beispiel: Dim frmInfo As New frmInfo() frmInfo.MdiParent = Me frmInfo.Show() Vgl. Kofler, VB.NET, S. 768ff. Einführung in die Programmierung mit VB.NET 50 Menüs Um eine Form mit einem Menü auszustatten, fügt man einfach das Steuerelement MainMenu aus der Toolbox in diese ein. Das noch leere Menü erscheint dann automatisch am oberen Ende der Form. Die Benennung der einzelnen Menüpunkte kann einfach per Tastatur direkt im Formular erfolgen. Alternativ kann für die einzelnen Menüpunkte auch die TextEigenschaft im Eigenschaftsfenster verändert werden. Bevor per Doppelklick Click-Ereignisprozeduren zu den einzelnen Menüeinträgen in den Code eingefügt werden, sollten diese zunächst unbedingt aussagekräftig benannt werden. Dies erfolgt wie üblich durch Verändern der Name-Eigenschaft im Eigenschaftsfenster. Vgl. Kofler, VB.NET, S. 780ff. Einführung in die Programmierung mit VB.NET 51 Aufgabe 12) Erstellen Sie ein Programm bestehend aus einer MDI-Form "Faktur", die folgendes Menü enthält: Aktion Geschäft Ende Verwaltung Kunden Artikel Statistik Info Umsätze Artikel Füllen Sie den Menüpunkt "Ende" mit dem Befehl, der das Programm beendet, und erstellen Sie eine zweite Form, die Informationen über den Programmierer enthält und über den Menüpunkt "Info" angesprochen wird. >>>> Faktur Einführung in die Programmierung mit VB.NET 52 Arbeiten mit Datenbanken: Relationale Datenbanken VB.NET unterstützt das Arbeiten mit unterschiedlichen Datenbanken. Schnittstellen für den Datenzugriff stehen unter anderem für Access- und SQL-ServerDatenbanken, aber auch für Oracle- oder IBM-Datenbanken zur Verfügung. Insbesondere relationale Strukturen können einfach bearbeitet werden. Beispiel einer relationalen Datenbank: Datenbank: Verwaltung KNR Name Vorname KNR ANR 1 1 1 2 1 Roßbach Peter 2 Hasenkamp Ulrich 2 1 3 Meier Erwin 2 2 4 Müller Uwe 2 3 5 Schmidt Hans 3 3 4 4 Tabelle: Kunde Tabelle: Artikel ANR Bezeichnung Preis 1 Rechner 3000 2 Tastatur 200 3 Monitor 900 4 Drucker 700 Tabelle: Geschäft Einführung in die Programmierung mit VB.NET 53 Arbeiten mit Datenbanken: SQL als Abfragesprache Allgemeine Form für SELECT-Abfragen in SQL: SELECT Attribut[,Attribut1,...] FROM Tabelle [WHERE Bedingung] Beispiele: SELECT * FROM Kunde SELECT KNR FROM Kunde WHERE Name='Roßbach' AND Vorname='Peter' SELECT ANR FROM Geschaeft WHERE KNr=1 SELECT Bezeichnung, Preis FROM Artikel WHERE ANR=2 KNR Name Vorname 1 Roßbach Peter 2 Hasenkamp Ulrich 3 Meier Erwin 4 Müller Uwe 5 Schmidt Hans Tabelle: Kunde Datenbank: Verwaltung KNR ANR 1 1 1 2 2 1 2 Tabelle: Artikel ANR Bezeichnung Preis 2 1 Rechner 3000 2 3 2 Tastatur 200 3 3 3 Monitor 900 4 4 4 Drucker 700 Vgl. Kofler, VB4, Tabelle: Geschäft Einführung in die Programmierung mit VB.NET S. 580ff. 54 ADO.NET: Einführung ADO.NET ist eine Datenzugriffsschnittstelle von VB.NET. ADO.NET ist Teil des .NET-Frameworks und wird über zahlreiche Klassen der Bibliothek System.Data verwendet. Eine Anwendung benutzt die ADO.NET-Programmierschnittstelle, um abstrahierend auf eine Datenquelle zugreifen zu können. ADO.NET bedient sich so genannter .NET Data Provider, um den eigentlichen Zugriff, z.B. auf OracleDatenbanken oder SQL-Server, zu tätigen. Einen Data Provider kann man sich als eine Art Treiber vorstellen. Um einen Zugriff auf Access-Datenquellen zu realisieren wird der OLEDB .NET Data Provider verwendet, welcher einen Treiber für Access-Datenbanken besitzt (so genannter Jet-Treiber "Microsoft.Jet.OLEDB.4.0"). Quelle: Christian Weyer: XML Web Service-Anwendungen mit MS.NET, Addison-Wesley, München u.a. 2002, S. 118 ff. Einführung in die Programmierung mit VB.NET 55 ADO.NET: Das DataSet-Objekt Das DataSet-Objekt von ADO.NET besitzt die Fähigkeit, komplexe Datenstrukturen (Tabellen und deren Beziehungen) im Hauptspeicher abzubilden und über einen längeren Zeitraum hinweg im Programm zu halten. Wenn man ein DataSet-Objekt erzeugt hat, kann man mit ihm arbeiten als wäre es eine Datenbank im Hauptspeicher. Ein DataSet-Objekt kann gänzlich unabhängig von einer Datenquelle genutzt werden, indem es manuell vom Programmcode aus erstellt und gefüllt wird. Es ist aber auch möglich, ein DataSet-Objekt mit einer Datenquelle, z.B. einer AccessDatenbank, zu verbinden. Als Mediator-Objekt zwischen einem DataSet und einer Datenquelle dient dabei ein DataAdapter, welcher die Verbindung realisiert und kontrolliert. Über den DataAdapter kann man Tabellen in einem DataSet füllen. Außerdem kann der DataAdapter Änderungen, die im DataSet vorgenommen wurden, auch an die Datenquelle weitergeben und dort umsetzen, ohne dass das DataSet von der Quelle weiß. Der DataAdapter wiederum benötigt eine Verbindung über ein Connection-Objekt, um mit der Datenbank zu kommunizieren. Quelle: Christian Weyer: XML Web Service-Anwendungen mit MS.NET, Addison-Wesley, München u.a. 2002, S. 142 ff. Einführung in die Programmierung mit VB.NET 56 ADO.NET: Objekte für den Datenzugriff DataViewObjekt DataViewObjekt DataViewObjekt DataSet-Objekt DataAdapter-Objekt Connection-Objekt • beschreibt eine bestimmte Ausprägung (View) eines DataSet • geeignet für DataBinding von Steuerelementen • für ein DataSet können gleichzeitig mehrere DataViews existieren • Speicherrepräsentation eines (komplexen) Datenbestandes • realisiert und kontrolliert die Verbindung zwischen DataSet und Datenquelle • vollzieht Füll-, Änderungs- und Löschoperationen • verweist auf die Datenquelle • implementiert die Treiberfunktionalität für unterschiedliche Datenquellenarten, z.B. "Microsoft.Jet.OLEDB.4.0"-Treiber für AccessDatenbanken Datenquelle (z.B. Access-Datenbank) Einführung in die Programmierung mit VB.NET 57 ADO.NET: Datenbankzugriff (I) Im Folgenden werden die notwendigen Programmierschritte beschrieben, um von einer Form aus mit den Daten einer externen Access-Datenquelle arbeiten zu können. 1. Einrichten eines Verweises auf die für den Datenzugriff benötigte Klassenbibliothek: Imports System.Data 2. Deklaration der für den Datenzugriff benötigen Objekte: Dim objConnection As OleDb.OleDbConnection = _ New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; _ Data Source=d:\AccessDB.mdb") Dim objDataAdapter As OleDb.OleDbDataAdapter Dim objDataSet As DataSet Dim objDataView As DataView 3. Öffnen der Datenbank-Verbindung: objConnection.Open() Einführung in die Programmierung mit VB.NET 58 ADO.NET: Datenbankzugriff (II) 4. Gleichzeitiges Instanzieren und Konfigurieren des DataAdapters: objDataAdapter = New OleDb.OleDbDataAdapter _ ("SELECT * FROM Tabellenname", objConnection) 5. Instanzieren und Füllen des DataSet: objDataSet = New DataSet() objDataAdapter.Fill(objDataSet, "Tabellenname") 6. Erzeugen eines DataView-Objektes, das auf die gesamte Tabelle im DataSetObjekt verweist: objDataView = New DataView(objDataSet.Tables("Tabellenname")) Hinweis: Das DataView-Objekt zeigt zunächst per Default auf den ersten Datensatz der Tabelle! 7. Anbinden eines Textfeldes an ein Datenfeld (= Spalte in Tabelle): Me.txtTextBox.DataBindings.Add("Text", objDataView, "Feldname") Hinweis: Das Anbinden anderer Steuerelemente erfolgt analog! Einführung in die Programmierung mit VB.NET 59 ADO.NET: Datenbankzugriff (III) Wenn eine Form, von der aus ein Datenbankzugriff erfolgte, geschlossen wird, sollte die Verbindung zur Datenbank getrennt und ein eventuell gefülltes DataSet-Objekt geleert werden: objConnection.Close() objDataSet = Nothing Einführung in die Programmierung mit VB.NET 60 Aufgabe 13) Erweitern Sie das Programm aus Aufgabe 12), indem Sie eine Form Kundenverwaltung erstellen, die über den Menüpunkt "Verwaltung/Kunde" aufgerufen wird. Kopieren Sie dabei zunächst die Datenbank dbFaktur.mdb auf Ihre lokale Festplatte. Beim Aufruf der Form soll der Inhalt der Tabelle tabKunden aus dbFaktur.mdb in ein DataSet geladen und der erste Datensatz angezeigt werden. >>>> Faktur1 Einführung in die Programmierung mit VB.NET 61 ADO.NET: Datenbankzugriff (IV) Austausch von Connection und DataAdapter für den Zugriff auf den SQL-Server 1. Einbinden der Klasse Systems.Data.SQLClient Imports System.Data.SQLClient 2. Einrichten eines Verweises auf die für den Datenzugriff benötigte Klassen-bibliothek: Imports System.Data.SQLClient 3. Deklaration der für den Datenzugriff benötigen Objekte Dim objConnection As SQLConnection Dim objDataAdapter As SQLDataAdapter 4. Instanziieren der Connection objConnection = New SqlConnection _ ("Data Source=localhost; _ Integrated Security=true; _ Initial Catalog = dbFaktur") 5. Instanziieren des Data Adapters objDataAdapter = New SQLDataAdapter _ (“Select * from tabKunden”, _ objConnection) Einführung in die Programmierung mit VB.NET ADO.NET: Navigation mit BindingContext (I) Sobald in einer Form Steuerelemente an eine Datenquelle mit DataBindings.Add gebunden wurden, verwaltet ein Objekt der BindingContext-Klasse (welche von der BindingManagerBase-Klasse erbt) sämtliche Binding-Objekte. Das BindingContext-Objekt sorgt dafür, dass in allen gebundenen Steuerelementen, die sich auf die gleiche Datenquelle beziehen, das jeweils aktuelle Datenelement angezeigt wird. Sind bspw. Textfelder an unterschiedliche Spalten einer Datentabelle gebunden, so zeigen diese Textfelder stets synchron Daten desselben Datensatzes an - wird die Position im BindingContext-Objekt geändert, dann werden alle Textfelder aktualisiert. Einführung in die Programmierung mit VB.NET 63 ADO.NET: Navigation mit BindingContext (II) Wichtige Eigenschaften der BindingContext-Klasse: • BindingContext(DataView).Position - gibt an, auf welchen Datensatz die gebundenen Steuerelemente zeigen oder legt diesen fest - Position ist ein nullbasierter Index! • BindingContext(DataView).Count - liefert die Anzahl der Zeilen, die vom BindingContext-Objekt verwaltet werden - BindingContext(DataView).Count-1 zeigt auf den letzten Datensatz des BindingContext-Objektes Einführung in die Programmierung mit VB.NET 64 Aufgabe 14) Erweitern Sie das Programm aus Aufgabe 13), indem Sie der Form Kundenverwaltung Datensatznavigatoren hinzufügen, die jeweils zum ersten, vorherigen, nächsten oder letzten Datensatz springen. Weiterhin soll in einem Label-Steuerelement jeweils angezeigt werden, auf welchem von wievielen Datensätzen man sich gerade befindet. >>>> Faktur2 Einführung in die Programmierung mit VB.NET 65 ADO.NET: CommandBuilder Um die in einem DataSet-Objekt vorgenommenen Änderungen an einem Datenbestand an die zugrundeliegende Datenquelle weiterzugeben, sind komplexe SQLAnweisungen (Insert-, Delete- und Update-Statements) notwendig. Der OleDbDataAdapter generiert nicht automatisch diese SQL-Anweisungen, die für den Abgleich von Änderungen an einem DataSet mit der zugeordneten Datenquelle erforderlich sind. Man kann jedoch ein OleDbCommandBuilderObjekt erstellen, um SQL-Anweisungen für das Aktualisieren einzelner Tabellen automatisch zu generieren, indem man die SelectCommand-Eigenschaft von OleDbDataAdapter festlegt. Anschließend werden alle zusätzlichen, zuvor nicht festgelegten SQL-Anweisungen vom OleDbCommandBuilder generiert. Code-Beispiel: Dim objCommandBuilder As OleDb.OleDbCommandBuilder objDataAdapter.SelectCommand = New OleDb.OleDbCommand _ ("SELECT * FROM Tabellenname", objConnection) objCommandBuilder = New OleDb.OleDbCommandBuilder(objDataAdapter) Einführung in die Programmierung mit VB.NET 66 ADO.NET: Datenmanipulation (I) Zur Aufnahme neuer Datensätze in ein DataSet-Objekt, muss diesem zunächst eine neue Zeile hinzugefügt werden. Anschließend kann man die neue Zeile beschreiben und dann fest in das DataSet-Objekt übernehmen. Um die am DataSet-Objekt vorgenommenen Änderungen auch in der zugrundeliegenden Datenquelle persistent zu machen, muss der DataAdapter die UpdateMethode ausführen. Code-Beispiel: Dim objZeile As DataRow objZeile = objDataSet.Tables("Tabellenname").NewRow() objZeile.Item("Feldname1") = txtTextfeld1.Text objZeile.Item("Feldname2") = txtTextfeld2.Text objDataSet.Tables("Tabellenname").Rows.Add(objZeile) objDataAdapter.Update(objDataSet, "Tabellenname") Einführung in die Programmierung mit VB.NET 67 ADO.NET: Datenmanipulation (II) Das Ändern von bestehenden Datensätzen erfolgt analog zur Aufnahme. Anstatt eine neue Zeile zu erzeugen, gibt man mit Rows(Index) an, welche Zeile des DataSet man ändern möchte. Danach leitet man das Ändern im DataSet mit der Methode BeginEdit ein und beendet es mit der Methode EndEdit. Zum Übernehmen der am DataSet gemachten Änderungen muss der DataAdapter auch hier die Update-Methode ausführen. Code-Beispiel: Dim objZeile As DataRow objZeile =objDataSet.Tables("Tabellenname").Rows _ (BindingContext(objDataView).Position) objZeile.BeginEdit() objZeile.Item("Feldname1") = txtTextfeld1.Text objZeile.Item("Feldname2") = txtTextfeld2.Text objZeile.EndEdit() objDataAdapter.Update(objDataSet, "Tabellenname") Einführung in die Programmierung mit VB.NET 68 ADO.NET: Datenmanipulation (III) Zum Löschen von bestehenden Datensätzen aus einem DataSet, wendet man die Delete-Methode auf eine bestimmte Zeile des DataSet an. Zum Übernehmen der am DataSet gemachten Änderungen muss der DataAdapter auch hier die Update-Methode ausführen. Code-Beispiel: objDataSet.Tables("Tabellenname").Rows(Index).Delete() objDataAdapter.Update(objDataSet, "Tabellenname") Einführung in die Programmierung mit VB.NET 69 Aufgabe 15) Erweitern Sie das Programm aus Aufgabe 14), indem Sie der Form Kundenverwaltung folgende Buttons zur Datenmanipulation hinzufügen: • Neu-Button: soll die Textfelder des Formulars leeren • Anhängen-Button: soll einen neu eingegebenen Datensatz speichern • Ändern-Button: soll einen geänderten Datensatz speichern • Löschen-Button: soll den angezeigten Datensatz löschen >>>> Faktur3 Einführung in die Programmierung mit VB.NET 70 Aufgabe 16) Erweitern Sie das Programm aus Aufgabe 15), indem Sie eine Form Artikelverwaltung erstellen, die über den Menüpunkt "Verwaltung/Artikel" aufgerufen wird. Beim Aufruf der Form soll der Inhalt der Tabelle tabArtikel aus dbFaktur.mdb in ein DataSet-Objekt geladen und der erste Datensatz angezeigt werden. Des Weiteren sollen analog zur Kundenverwaltung Datensatznavigatoren sowie Buttons zur Datenmanipulation ergänzt werden. >>>> Faktur4 Einführung in die Programmierung mit VB.NET 71 Arbeiten mit Datenbanken: Erweiterte Abfragen mit SQL Mit Hilfe des Schlüsselwortes AS können die Attribute von SQL-Abfragen unter anderem Namen bereitgestellt werden. Allgemeine Form: SELECT Attribut AS Name FROM Tabelle [WHERE Bedingung] Beispiel: Query = "SELECT KNR AS Kundennummer FROM tabKunde" objDataAdapter = New OleDb.OleDbDataAdapter(Query, objConnection) objDataAdapter.Fill(objDataSet, "tabKunde") objDataView = New DataView(objDataSet.Tables("tabKunde")) Me.txtKNr.DataBindings.Add("Text", objDataView, "Kundennummer") Statt Attribute können in SQL-Abfragen auch Funktionen verwendet werden: Allgemeine Form: SELECT Funktion AS Name FROM Tabelle [WHERE Bedingung] Beispiel: Query = "SELECT MAX(KNR) AS Kmax FROM tabKunde" Einführung in die Programmierung mit VB.NET 72 Das ComboBox-Steuerelement (I) Eine ComboBox ist eine Kombination aus einer Liste und einem Textfeld. Die Eigenschaften und Methoden der ComboBox sind weitgehend die gleichen wie bei der Liste. Es existiert darüber hinaus noch ein Textfeld mit dem Eigenschaftsnamen "Text". Es kann direkt beschrieben werden. Eine Auswahl aus der darunter liegenden Liste hat jedoch immer das Überschreiben des Textfeld-Inhalts zur Folge. Vgl. Kofler, VB.NET, S. 625ff. Einführung in die Programmierung mit VB.NET 73 Das ComboBox-Steuerelement (II) Bei der ComboBox kann nicht nur die Text-Eigenschaft an ein konkretes Datenfeld mit Databindings.Add gebunden werden, sondern eine komplette Spalte einer Tabelle kann an das Listenfeld der ComboBox gebunden werden. Um dies zu realisieren weist man der DataSource-Eigenschaft der ComboBox ein DataView-Objekt zu und gibt anschließend mit der DisplayMemberEigenschaft der ComboBox an, welche Spalte des DataView-Objektes in der Liste angezeigt werden soll. Code-Beispiel: Query = "SELECT KNR, [zuname] & ', ' & [vorname] AS Name FROM Kunden" adapterKunden = New OleDb.OleDbDataAdapter (Query, objConnection) adapterKunden.Fill(objDataSet, "Kunden") viewKunden = New DataView(objDataSet.Tables("Kunden")) Me.cboKunde.DataBindings.Add("Text", viewKunden, "Name") Me.cboKunde.DataSource = viewKunden Me.cboKunde.DisplayMember = "Name" Ein Objekt der BindingContext-Klasse sorgt auch hier dafür, dass stets ein Verweis auf den aktuellen Datensatz vorliegt. Einführung in die Programmierung mit VB.NET 74 Das ListView-Steuerelement (I) Das ListView-Steuerelement dient ebenso wie die ListBox dazu, auswählbare Listen darzustellen. Im Gegensatz zur ListBox kann das ListView-Steuerelement jedoch auch mehrspaltige Listen anzeigen und verwalten. Das Einfügen von Daten in ein ListView-Objekt kann wahlweise in der Entwicklungsumgebung oder per Code erfolgen. Initialisierung in der Entwicklungsumgebung: In der Entwicklungsumgebung von VB.NET kann man mit einem Dialog für die Columns-Eigenschaft die Spalten für das ListView-Steuerelement definieren (Beschriftung, Ausrichtung, Breite). Vgl. Kofler, VB.NET, S. 628ff. Einführung in die Programmierung mit VB.NET 75 Das ListView-Steuerelement (II) Die Items-Eigenschaft des ListView-Objektes verweist auf die einzelnen Listeneinträge. Enthält das ListView-Objekt mehrspaltige Einträge, so verweist die SubItems-Eigenschaft eines ListViewItems auf die verschiedenen Spalten. Sowohl die Items- als auch die SubItems-Eigenschaft sind indexiert, wobei der Index jeweils mit Null beginnt. Erzeugen eines neuen Items: Dim LVItem As ListViewItem LVItem = ListView.Items.Add("Listeneintrag") Erzeugen eines neuen SubItems innerhalb eines bestehenden Items: LVItem.SubItems.Add("SubListeneintrag") Mit Clear können evtl. vorhandene Spalten bzw. Listeneinträge gelöscht werden: ListView.Columns.Clear() bzw. ListView.Items.Clear() Der Datenzugriff auf ein Datenelement erfolgt in der Form: ListView.Items(Index).SubItems(Index).Text Einführung in die Programmierung mit VB.NET 76 Aufgabe 17) Erweitern Sie das Programm aus Aufgabe 16), indem Sie eine Form Rechnung erstellen, die über den Menüpunkt "Aktion/Geschäft" aufgerufen wird. Beim Aufruf der Form soll zunächst die größte Rechnungsnummer aus der Tabelle tabUmsatz bestimmt und um Eins als neue Rechnungsnummer hochgezählt werden. Nach der Auswahl eines Kunden in einer ComboBox sollen schließlich die bestellten Artikel ebenfalls in einer ComboBox selektiert und deren Anzahl eingegeben werden. Nach der jeweiligen Eingabe sollen die Daten mit dem Übernehmen-Button in ein ListView-Objekt überführt und der Gesamtbetrag pro Artikel berechnet werden. Der Berechnen-Button dient schließlich der Berechnung der Mehrwertsteuer und des Rechnungsbetrages auf der Basis des ListView-Objektes und der SpeichernButton der Speicherung der Daten in der Tabelle tabUmsatz. >>>> Faktur5 Einführung in die Programmierung mit VB.NET 77 Zugriff auf andere Programme: Word (I) Man kann in VB.NET auch die Programmbibliotheken anderer Applikationen, z.B. die von Word oder Excel, verwenden. Dazu muss zunächst ein Verweis auf die entsprechende Programmbibliothek eingefügt werden. Zum Einfügen eines Verweises auf die Word-Bibliothek geht man folgendermaßen vor: - im Menü "Projekt/Verweis hinzufügen ..." anklicken - Registerblatt "Com" wählen - aus der angezeigten Liste "Microsoft Word x.0 Object Library" selektieren und den Button "Auswählen" anklicken Danach kann man die eingebundene Bibliothek z.B. dazu nutzen, um eigene Klassen zu entwickeln, mit denen man Word von VB.NET aus nutzen und steuern kann. Vgl. Martin, Kapitel 4 & 8 Einführung in die Programmierung mit VB.NET 78 Zugriff auf andere Programme: Word (II) Die Klasse clsWord ist eine selbstprogrammierte Klasse, die Methoden zum "Fernbedienen" von Word aus VB.NET heraus bereitstellt. Um die Klasse nutzen zu können, muss wie zuvor beschrieben ein Verweis auf die WordProgrammbibliothek eingerichtet werden und dem Projekt die Datei clsWord.vb hinzugefügt werden (Menü "Projekt/Vorhandenes Element hinzufügen ...") Danach kann man - wie aus dem Screenshot ersichtlich - die Methoden von clsWord in den anderen Projektbestandteilen benutzen, nachdem man dort ein Objekt der Klasse instanziert hat. Einführung in die Programmierung mit VB.NET 79 Zugriff auf andere Programme: Word (III) Wichtige Methoden der Klasse clsWord: - Dateizugriff (Vorlagenname As String) Öffnet ein neues Word-Dokument basierend auf der angegebenen WordVorlage. - TextmarkeFüllen (Marke As String, Text As String) Füllt die in Text übergebene Zeichenkette, in die mit Marke bezeichnete Textmarke eines Word-Dokumentes ein. - GeheZuTextmarke (Marke As String) Springt zu der mit Marke bezeichneten Textmarke eines Word-Dokumentes. - SchreibeText(Text As String) Schreibt die in Text übergebene Zeichenkette in ein Word-Dokument. - NeueZeile Erzeugt einen Zeilenumbruch in einem Word-Dokument. Einführung in die Programmierung mit VB.NET 80 Aufgabe 18) Erweitern Sie das Programm aus Aufgabe 17), indem Sie der Form Rechnung einen Drucken-Button hinzufügen. Durch Anklicken des Buttons sollen die angezeigten Rechnungsdaten an ein neu zu erzeugendes Word-Dokument übergeben werden, das man dann bequem ausdrucken kann. Kopieren Sie zunächst die Dateien "clsWord.vb" und "Rechnung.dot" auf Ihre lokale Festplatte. "clsWord.vb" enthält die Klasse clsWord und deren Methoden zum Nutzen und Steuern von Word. "Rechnung.dot" ist eine Word-Dokumentvorlage für eine Rechnung, in der folgende Textmarken definiert sind: >>>> Faktur6 Einführung in die Programmierung mit VB.NET 81 Eigene Klassen (I) VB.NET ermöglicht als objektorientierte Programmiersprache nicht nur die Nutzung bereits vorhandener Klassen, sondern bietet auch die Möglichkeit eigene Klassen zu programmieren. Klassen bieten die Grundlage für eine umfangreiche Wiederverwendung von Code. Statt ein immer wiederkehrendes Problem immer wieder neu zu lösen, kann man für dieses eine Klasse entwickeln und diese dann in verschiedenen Projekten entweder als Code (durch simples Einfügen) oder als Bibliothek (durch eine Referenz) nutzen. Eine Klasse ist die abstrakte Beschreibung (der Bauplan) eines objektorientierten Datentyps. Die Schnittstelle nach außen (also zur Anwendung der Klasse) wird in erster Linie durch Eigenschaften und Methoden hergestellt. Vgl. Kofler, VB.NET, S. 217ff. Einführung in die Programmierung mit VB.NET 82 Eigene Klassen (II) Auf der Codeebene wird die Definition einer Klasse durch Class name eingeleitet und durch End Class abgeschlossen. Innerhalb dieses Blocks werden die Elemente der Klasse definiert - also Variablen, Prozeduren (alias Methoden), Eigenschaften usw. Allgemeine Struktur: Class Klassenname Private x As Datentyp Public y As Datentyp Private Sub p()... Sub m() .... Property e() As Datentyp End Class 'interne Klassenvariable 'öffentliche Klassenvariable 'interne Prozedur 'von außen zugängliche Methode 'von außen zugängliche Eigenschaft Entscheidend bei Entwurf einer Klasse ist die Überlegung, welche Elemente der Klasse nur für die interne Programmierung innerhalb der Klasse gedacht sind und welche Elemente extern zur Verfügung stehen sollen. Einführung in die Programmierung mit VB.NET 83 Aufgabe 19) Modifizieren Sie das Programm aus Aufgabe 9), indem Sie die Plausibilitätsprüfung nicht mehr als Prozedur innerhalb eines Formulars deklarieren, sondern als Methode innerhalb einer Klasse. >>>> Bestellmenge2 Einführung in die Programmierung mit VB.NET 84 1 2 3 4 b aa ** 11 ++ bb ** 33 a*2 + b*4 d c*1 + dd **33 c*2 + d*4 x a c Einführung in die Programmierung mit VB.NET 85