| As New Classmodul |
| |
| |
| Typisierte Datei: Für das Sichern von numerischen Daten bietet sich statt einer Textdatei eine typisierte Datei an. |
| Sie ist durch eine konstante Datensatzlänge gekennzeichnet; zwischen den einzelnen Datensätzen ist kein |
| Trennzeichen (wie z.B. bei einer Textdatei). Man muß also genau wissen, wie groß ein Datensatz ist. |
| Eine typisierte Datei läßt sich nicht als Textdatei lesen; es ist nur ein Fragment des ersten Datensatzes lesbar. |
| Einen Append-Modus (wie bei einer Textdatei) gibt es hier nicht. |
| |
| Quellcode im Formular | |
| Private aktPerson As New Datenschicht | Datenschicht ist der Name des Klassenmoduls. |
| |
| Sub maskeSpeichern() | Methode Speichern. |
| On Error GoTo fehler | |
| With aktPerson | |
| .nachname = Text1(0).Text | |
| If Text1(1).Text <> "" Then .geburtstag = CDate(Text1(1).Text) | |
| .student = Check1.value | |
| End With | |
| Exit Sub | |
| fehler: | |
| Resume Next | |
| End Sub | |
| |
| Sub maskeAnzeigen() | Methode Anzeigen. |
| On Error GoTo fehler | |
| With aktPerson | |
| Text1(0).Text = .nachname |
| Text1(1).Text = Format$(.geburtstag, "dd.mm.yyyy") |
| Check1.value = -.student |
| Text2.Text = Str$(.nr) |
| End With |
| Text1(0).SetFocus |
| Exit Sub |
| fehler: |
| Resume Next |
| End Sub |
| |
| Private Sub Command1_Click(Index As Integer) | Alle Schaltflächen wurden als Steuerelementefeld |
| maskeSpeichern | mit den Indizes 1 bis 6 realisiert. |
| With aktPerson | |
| Select Case Index | Datenbanknavigator. |
| Case 1: .zurueck | |
| Case 2: .vor | |
| Case 3: .letzter | |
| Case 4: .erster | |
| Case 5: .neu | |
| Case 6: .entferne | |
| End Select | |
| End With | |
| maskeAnzeigen | |
| End Sub | |
| |
| Private Sub Form_Load() | Dateimenü. |
| With CommonDialog1 | |
| .Flags = &H802 | Warnung vor Überschreiben. |
| .Filter = "Personendatei (*.dat)|*.dat" | |
| End With | |
| mnuFSave.Enabled = False | Die Enabled-Eigenschaft stellt zugleich fest, ob |
| End Sub | bereits ein Dateiname zugewiesen wurde. |
| |
| Private Sub aenderung() | Menüaufrufe koordinieren. |
| If MsgBox("Änderungen speichern?", 36, "Frage") = 6 Then | |
| If mnuFSave.Enabled Then | |
| mnuFSave_Click | |
| Else | |
| mnuFSaveAs_Click | |
| End If | |
| End If | |
| End Sub | |
| |
| Private Sub mnuFOpen_Click() | Menüaufruf Datei öffnen. |
| aenderung | |
| With CommonDialog1 | |
| .ShowOpen | |
| If .FileName = "" Then Exit Sub | |
| aktPerson.leseDatei (.FileName) | |
| Me.Caption = .FileName | Die Caption-Eigenschaft des Formulars dient als |
| mnuFSave.Enabled = True | Zwischenspeicher für den Dateinamen. |
| End With | |
| maskeAnzeigen | |
| End Sub | |
| |
| Private Sub mnuFSave_Click() | Menüaufruf Datei speichern. |
| maskeSpeichern | |
| aktPerson.schreibeDatei (Me.Caption) | |
| End Sub | |
| |
| Private Sub mnuFSaveAs_Click() | Menüaufruf Datei speichern unter. |
| maskeSpeichern | |
| With CommonDialog1 | |
| .ShowSave | |
| If .FileName = "" Then Exit Sub | |
| aktPerson.schreibeDatei (.FileName) | |
| Me.Caption = .FileName | |
| mnuFSave.Enabled = True | |
| End With | |
| Exit Sub | |
| End Sub | |
| |
| Private Sub mnuFExit_Click() | Menüaufruf Exit. |
| Unload Me | |
| End Sub | |
| |
| Private Sub Form_Unload(Cancel As Integer) | |
| aenderung | |
| End Sub | |
| |
| Klasse BusinessDataTier (Datenschicht mit |
| Quellcode im Klassenmodul | Objektmodell und Persistenz). |
| Option Base 1 | Array-Indizierung (Datensatzzeiger) beginnt mit 1. |
| |
| Private Type TPerson | Datensatzstruktur. |
| nachname As String * 20 | |
| geburtstag As Date | |
| student As Boolean | |
| End Type | |
| |
| Private dynArray() As TPerson | Pufferarray und weitere private Klassenmitglieder. |
| Private pers As TPerson | Hilfsvariable für Längenbestimmung. |
| Private max% | Anzahl Datensätze. |
| Private pos% | Aktuelle Position. |
| Private file% | Filenummer. |
| |
| Public Sub vor() | Bewegungsmethoden vor, zurück, erster und letzter... |
| pos = pos + 1 | |
| If pos > max Then pos = max | |
| End Sub | |
| |
| Public Sub zurueck() | |
| pos = pos - 1 | |
| If pos < 1 Then pos = 1 | |
| End Sub | |
| |
| Public Sub erster() | |
| pos = 1 | |
| End Sub | |
| |
| Public Sub letzter() | |
| pos = max | |
| End Sub | |
| Kapselung der Klasseneigenschaften durch |
| Public Property Get nr() As Integer | Zugriffsmethoden (hier ReadOnly). |
| nr = pos | |
| End Property | |
| |
| Public Property Get nachname() As String | |
| nachname = dynArray(pos).nachname | |
| End Property | |
| |
| Public Property Let nachname(value As String) | |
| dynArray(pos).nachname = value | |
| End Property | |
| |
| Public Property Get geburtstag() As Date | |
| geburtstag = dynArray(pos).geburtstag | |
| End Property | |
| |
| Public Property Let geburtstag(value As Date) | |
| dynArray(pos).geburtstag = value | |
| End Property | |
| |
| Public Property Get student() As Boolean | |
| student = dynArray(pos).student | |
| End Property | |
| |
| Public Property Let student(value As Boolean) | |
| dynArray(pos).student = value | |
| End Property | |
| |
| Public Sub neu() | Das Erzeugen und Löschen eines Datensatzes |
| Dim i% | geschieht ausschließlich im Pufferspeicher. |
| max = max + 1 | |
| ReDim Preserve dynArray(max) | |
| For i = max To pos + 1 | |
| dynArray(i) = dynArray(i - 1) | |
| Next i | |
| pos = pos + 1 | |
| dynArray(pos).nachname = "" | |
| End Sub | |
| |
| Public Sub entferne() | |
| Dim i% | Den letzten Datensatz kann man nicht löschen. Er |
| If max = 1 Then Exit Sub | kann nur überschrieben werdebn. |
| If MsgBox("Soll Datensatz wirklich gelöscht werden?", 36, "Achtung!") = 6 Then |
| If pos = max Then pos = pos - 1: GoTo marke | |
| For i = pos + 1 To max | |
| dynArray(i - 1) = dynArray(i) | |
| Next i | |
| marke: max = max - 1 | |
| ReDim Preserve dynArray(max) | |
| End If | |
| End Sub | |
| |
| Private Sub Class_Initialize() | |
| pos = 1: max = 1 | |
| ReDim dynArray(max) | |
| End Sub | |
| |
| Private Sub oeffneDatei(name As String) | Persistente Methoden. |
| file = FreeFile | Open = Datei öffnen. |
| Open name For Random As file Len = Len(pers) | Wenn Datei noch nicht existiert, wird sie angelegt. |
| End Sub | |
| |
| Public Sub leseDatei(name As String) | Datei an Dynamisches Array: alle Datensätze werden |
| Dim i% | von der Festplatte in das dynamische Array gelesen. |
| Call oeffneDatei(name) | |
| max = LOF(file) \ Len(pers) | |
| ReDim dynArray(max) | |
| For i = 1 To max | |
| Get file, , dynArray(i) | Get = Datensatz lesen. |
| Next i | |
| Close file | Close = Datei schließen (wenn man's vergisst, kann |
| pos = 1 | der Inhalt verlorengehen). |
| End Sub | |
| |
| Public Sub schreibeDatei(name As String) | Dynamisches Array an Datei: alle Datensätze werden |
| Dim i% | vom dynamischen Array auf die Festplatte |
| max = UBound(dynArray) | geschrieben. |
| Call oeffneDatei(name) | |
| For i = 1 To max | |
| Put file, , dynArray(i) | Put = Datensatz schreiben. |
| Next i | |
| Close file | Close = Datei schließen (wenn man's vergisst, kann |
| End Sub | der Inhalt verlorengehen). |
| |