Galileo Computing < openbook >
Galileo Computing - Bücher zur Programmierung und Softwareentwicklung
Galileo Computing - Bücher zur Programmierung und Softwareentwicklung

...powered by haas.homelinux.net...

Einstieg in VB.NET von René Martin
- Für Programmiereinsteiger -
Einstieg in VB.NET
gp Kapitel 8 Eine Rechnung in Word
  gp 8.1 Die neue Klasse
  gp 8.2 Die Klasse wird verwendet
  gp 8.3 Eine Klasse für den Excel-Zugriff
  gp 8.4 Eine Klasse für den Word-Zugriff
  gp 8.5 Einige Objekte in Word
    gp 8.5.1 Der Makrorekorder
    gp 8.5.2 Application
    gp 8.5.3 Methoden und Eigenschaften von Document und Documents
    gp 8.5.4 Text in Word schreiben
    gp 8.5.5 Tabellen in Word
    gp 8.5.6 Eine Klasse für den Word-Zugriff
    gp 8.5.7 clsWord wird verwendet – Variante 1: Text hineinschreiben
    gp 8.5.8 Variante 2: Text in eine Dokumentvorlage an Textmarken schreiben
    gp 8.5.9 Variante 3: Eine geschützte Dokumentvorlage mit Formularfeldern
    gp 8.5.10 Word-Formulare steuern
  gp 8.6 Zusammenfassung

Kapitel 8 Eine Rechnung in Word

In diesem Kapitel wird das Wissen der vorhergehenden Kapitel verwendet und gezeigt, wie aus Excel alle Namen herausgeholt werden können. Dem Benutzer wird dann die Möglichkeit gegeben, einen davon auszuwählen und eine Rechnung erstellen zu lassen.

Sie erinnern sich: In Kapitel 5 wurde beschrieben, wie in eine Excel-Datei Informationen hineingeschrieben werden. Zwar könnte man an diesem Projekt weiterarbeiten, aber die Gefahr liegt nahe, dass Anforderungen auftreten, die den Code unübersichtlich machen. Wenn ein Projekt in großem Rahmen angelegt wird, stärker wächst als geplant oder es noch weitere, ähnliche Projekte gibt, dann sollten Sie immer objektorientiert denken und arbeiten und eigene Objekte erstellen.


Galileo Computing

8.1 Die neue Klasse  toptop

In unserem Beispiel kann das Gerüst bleiben – es wird nur etwas anders organisiert. Der Kaffeeautomat erhält eine Klasse clsDateiZugriff. Da mehrmals die Objekte StreamReader und StreamWriter verwendet werden, wird vor die Zeile

Public Class clsDateizugriff

der folgende Befehl eingefügt:

Imports System.IO

Die Funktion einer Konstanten wird durch eine schreibgeschützte Eigenschaft übernommen. Sie gibt die Zeichenkette »info.txt« zurück:

ReadOnly Property IniDateiname() As String
   Get
      Return "info.txt"
   End Get
End Property

Eine zweite schreibgeschützte Eigenschaft dieses Objekts überprüft, ob diese Datei »info.txt« existiert. Zugegeben, dies habe ich der Methode File.Exists abgesehen. Sie gibt »Wahr« oder »Falsch« zurück und ist folgendermaßen aufgebaut:

ReadOnly Property IniDateiExistiert(ByVal Dateiname As _
   String) As Boolean
   Get
   Dim strWinVerz As String = _
   System.Environment.SystemDirectory.ToString
   If File.Exists(strWinVerz & "\" & _
      Dateiname) = False Then
      Return False
   Else
      Return True
   End If
   End Get
End Property

Wichtig ist hierbei, dass diese Eigenschaft einen Wert, das heißt den Namen der Datei, erhält. Er wird im Systemverzeichnis gesucht. Falls er dort nicht gefunden wird, wird diese Datei erstellt. Die Befehle sind bekannt – sie wurden ausführlich in Kapitel 5 beschrieben.

Sub IniDateiErstellen()
   Dim objDateiMacher As StreamWriter
   Dim strWinVerz As String = _
   System.Environment.SystemDirectory.ToString
   objDateiMacher = New StreamWriter(& _
   "\" & strWinVerz)
   objDateiMacher.Close()
   objDateiMacher = Nothing
End Sub

Später wird der Benutzer nach dem nicht vorhandenen oder falschen Eintrag suchen, der sich in dieser Datei befindet. Er muss dazu in die Ini-Datei geschrieben werden. Man könnte nun eine zweite Methode erstellen – oder (kurz und knapp:) die Methode IniDateiErstellen wird überladen. Das heißt, sie wird ein zweites Mal verwendet. Diesmal wird ihr allerdings ein Parameter (DateinameMitPfad) übergeben, in welchem der Name der Excel-Datei steht. Und dieser Wert wird in die Ini-Datei geschrieben. Das Ergebnis ähnelt der oberen Prozedur, weist allerdings diese beiden Unterschiede auf:

Sub IniDateiErstellen(ByVal DateinameMitPfad As String)
   Dim objDateiMacher As StreamWriter
   Dim strWinVerz As String = _
   System.Environment.SystemDirectory.ToString
   objDateiMacher = New StreamWriter(strWinVerz & _
   "\" & strWinVerz)
   objDateiMacher.Write(DateinameMitPfad)
   objDateiMacher.Close()
   objDateiMacher = Nothing
End Sub

Schließlich wird noch eine Eigenschaft benötigt, welche den Dateinamen der Excel-Mappe speichert. Er wird aus der Datei herausgeholt, die dieser Eigenschaft übergeben werden muss:

ReadOnly Property ExcelDateiname(ByVal Datei As String) _
As String
   Get
      Dim objDateiLeser As StreamReader
      Try
         Dim strExcelDateiname As String
         Dim strWinVerz As String = _
         System.Environment.SystemDirectory.ToString
         objDateiLeser = _
         New StreamReader(strWinVerz & "\" & Datei)
         strExcelDateiname = objDateiLeser.ReadToEnd
         objDateiLeser.Close()
         Return strExcelDateiname
      Catch ex As EndOfStreamException
         MessageBox.Show(ex.Message)
      Catch ex As FileNotFoundException
         MessageBox.Show(ex.Message)
         Exit Property
      Finally
         objDateiLeser = Nothing
      End Try
   End Get
End Property

Vielleicht wäre die Try … Catch … End Try-Klammer zum Abfangen möglicher Fehler überflüssig – aber ich möchte auch hier noch einmal darauf hinweisen, dass Fehler in jedem Programm abgefangen werden müssen! Ansonsten ist zu beachten, wo die Variablen deklariert werden. Da objDateiLeser im Finally-Zweig erneut verwendet wird, kann er nicht wie strExcelDateiname und strWinVerz innerhalb der Try-Klammer gesetzt werden.

Zugegeben, als ich mich mit dem Thema objektorientierte Programmierung beschäftigt habe, fand ich das alles schrecklich umständlich. Warum sollte man die Befehle auslagern und warum sollte ich mehr Code für die gleiche Sache schreiben? Eine Antwort ist: Der Code ist leichter veränder- und skalierbar. Sollten nun andere Anforderungen an den Namen oder Speicherort der Ini-Datei gestellt werden, so kann dies schnell in der zugehörigen Eigenschaft modifiziert werden. Und wenn das Projekt wächst, kann mit diesem Klassenobjekt sehr einfach umgegangen werden. Nämlich so:

  

VB.NET

Einstieg in ASP.NET

Einstieg in C#

Visual C#

VB.NET und Datenbanken

Einstieg in XML