·  Start ·  Programme ·  Codes ·  Tipps ·  ActiveX ·  Tutorials · 




Was sind benutzerdefinierte Datentypen ? Wozu brauche ich diese ? Diese Fragen sollen im vorliegenden Tutorial behandelt werden.
Eine kleine Einleitung:
Eine Variable kann auch einen vom Benutzer (Programmierer) definierten Typ besitzen, eben ein "benutzerdefinierter Datentyp", im englischen "User Defined Datatype" genannt. UDTs werden über die Type-Anweisung definiert. Nach Erstellung eines solchen Datentyps kann man über die DIM-Anweisung Variablen dieses Typs generieren.

Übersicht:

Allgemeines
Type-Anweisung
Strukturfeld-Variablen
Speichern
Variablen und Prozeduren
UDTs und API
Zusammenfassung
 
 Allgemeines

Welchen Vorteil bringen mir nun die UDTs ? Nun, sie machen das Programmieren etwas einfacher, weil komplexe Datenstrukturen angesprochen werden können. Ein beliebtes Beispiel ist eine Liste oder Datenbank mit dem Namen, Alter und Telefonnummer:
Private Type MyFirstType
    Name As String
    Alter As Byte
    TelNummer As String * 20
End Type
Nun kann man mit diesem neuen Typ Variablen deklarieren:
Private MyDatenbank (0 To 1000) As MyFirstType
Sehen Sie den Vorteil jetzt schon ? Sie müssen nur mehr ein Feld statt drei verschiedene verwalten. Die Arbeit mit UDTs läuft immer gleich ab:
1. Zuerst das Anlegen des Strukturtyps (Type-Anweisung)
2. Das Definieren einer Variable des neuen Datentyps (Private oder Dim)

 Type-Anweisung

Zuerst muss die Struktur des Typs festgelegt werden:
Type Bezeichnung
    Variable As DatenTyp
    Variable As DatenTyp
End Type
Die UDTs bestehen also aus einer oder mehreren Untervariablen. Diese wiederum haben ihren eigenen Datentyp. Jetzt könnten auch diese Variablen wieder ein UDT sein:
Type Wohnflaeche
    Breite As String * 100
    Hoehe As String * 100
End Type

Type Wohnung
    Flaeche() As Wohnflaeche
    Preis As Single
End Type
Anmerkung: Der Datentyp der Untervariable (in diesem Beispiel "Wohnflaeche") muss schon vorher definiert werden, sonst kann der Typ "Wohnung" keine Referenz setzen.

Kommen wir zu einem ersten brauchbaren Beispiel. Zuerst wird der Type definiert:
Private Type Wohnung
    Preis As Single
    Baujahr As Integer
    Geschosse As Integer
    Fassadenfarbe As String
    Einrichtung As Boolean
End Type
Diese Type-Anweisung definiert noch keine Variable, es wird nur eine Struktur festgelegt. Erst mit der jetzt folgenden Dim-Anweisung wird eine Variable vom Typ "Wohnung" definiert:
Dim NeueWohnung As Wohnung
Nun besitzt diese Variable ("Neue Wohnung") noch keine Werte, diese müssen erst zugewiesen werden:
With NeueWohnung
   .Preis = "10000"
   .Baujahr = "1980"
   .Geschosse = "2"
   .Fassadenfarbe = "hellblau"
   .Einrichtung = True
End With
Man muss jeder Untervariablen einen Wert einzeln zuweisen, Wertzuweisung als Ganzes funktioniert in VB nicht.

 Strukturfeld-Variablen

Interessanter wird das Anlegen einer Feldbvariablen. So kann bereits eine einfache Datenbank angelegt werden:
Type Wohnflaeche
    Breite As String * 100
    Laenge As String * 100
End Type

Private Type Wohnung
    Preis As Single
    Baujahr As Integer
    Geschosse As Integer
    Fassadenfarbe As String
    Einrichtung As Boolean
    Flaeche() As Wohnflaeche
End Type

Private NeueWohnung(0 To 100) As Wohnung
Somit haben wir 101 Variablen vom Typ "Wohnung" erstellt. Diese können zB über Schleifen schnell angesprochen werden. Denkbar wäre das Füllen einer Listbox mit Werten aus der Variablen:
Dim i As Integer
For i = 0 To UBound(NeueWohnung) - 1
   If NeueWohnung(i).Preis < 5000 Then
       List1.AddItem NeueWohnung(i).Preis & vbTab & NeueWohnung(i).Baujahr
   End If
Next 'i
Im vorigen Beispiel wurden also alle Datensätze in eine Liste übertragen, die weniger als 5000 (Euro) kosten. Zusätzlich wurde das Baujahr des Hauses angegeben.
Die Zuweisungen können zB so erfolgen:
NeueWohnung(0).Flaeche(0).Breite = "25"
NeueWohnung(0).Flaeche(0).Laenge = "20"

 Speichern

Die Arbeit mit den benutzerdefinierten Datentypen hätte wenig Sinn, wenn die Daten bzw. der Inhalt der Variablen nicht gespeichert würde! Die Daten gehen doch beim Beenden der Anwendung verloren. Das folgende Beispiel speichert den Inhalt der Variablen "NeueWohnung" beim Beenden des Programms in einer Datei und liest die Variablen beim Laden:
Option Explicit

Private Type Wohnung
    Preis As Single
    Baujahr As Integer
    Geschosse As Integer
    Fassadenfarbe As String
    Einrichtung As Boolean
End Type

Private NeueWohnung(0 To 100) As Wohnung

Private Sub Command1_Click()
' Zuweisen der Werte

NeueWohnung(1).Preis = "13000"
NeueWohnung(1).Geschosse = "1"
NeueWohnung(1).Baujahr = "1990"

NeueWohnung(2).Preis = "10000"
NeueWohnung(2).Geschosse = "2"
NeueWohnung(2).Baujahr = "1984"

End Sub

Private Sub Form_Load()
' Öffnen der Datei und Zuweisen der Werte an die Variablen
Dim FF As Integer
Dim i As Integer
FF = FreeFile
    Open "E:\test.dat" For Random As FF Len = Len(NeueWohnung(0))
       For i = 1 To UBound(NeueWohnung)
           Get #FF, , NeueWohnung(i)
       Next 'i
    Close FF
' Zur Überprüfung:
MsgBox "Preis der Wohnung 1: " & NeueWohnung(1).Preis

End Sub

Private Sub Form_Unload(Cancel As Integer)
' Speichern
Dim FF As Integer
Dim i As Integer
FF = FreeFile
    Open "E:\test.dat" For Random As FF Len = Len(NeueWohnung(0))
       For i = 1 To UBound(NeueWohnung)
           Put #FF, i, NeueWohnung(i)
       Next 'i
    Close FF
End Sub
Werden die Werte aus der Datei einem Textfeld oder ähnlichem Steuerelement zugewiesen, sollten die Null-Zeichen abgetrennt werden!
Private Function StripNull(Wert As String)
   StripNull = Left(Wert, Instr(Wert, vbNullChar) - 1)
End Function
Eine ähnliche Funktion ist auch bei vielen API-Funktionen notwendig, um einen null-terminierten String zurückzugeben.

 Variablen und Prozeduren

Natürlich kann man auch UDTs als Argument an eine Prozedur übergeben, wie im folgenden Beispiel, um die Werte in ein Listenfeld einzulesen:
Private Sub Listefuellen(wListe() As Wohnung)
Dim i As Integer
Dim preise As String
Dim bj As String

    Do
    i = i + 1
        If i > UBound(wListe) Then Exit Do
        preise = wListe(i).Preis
        bj = wListe(i).Baujahr
        List1.AddItem preise & vbTab & bj
    Loop
End Sub

Private Sub Command2_Click()
' Liste füllen
    Call Listefuellen(NeueWohnung)
End Sub


 UDTs und API

User defined Datatypes finden Sie bei vielen API-Funktionen. Wie wärs mit folgendem Beispiel, um den noch verfügbaren Arbeitsspeicher auszulesen ?
Private Type MEMORYSTATUS
    dwLength As Long
    dwMemoryLoad As Long
    dwTotalPhys As Long
    dwAvailPhys As Long
    dwTotalPageFile As Long
    dwAvailPageFile As Long
    dwTotalVirtual As Long
    dwAvailVirtual As Long
End Type

Private Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As MEMORYSTATUS)

Private Sub Command1_Click()
    Dim MemStat As MEMORYSTATUS
    GlobalMemoryStatus MemStat
    MsgBox "Freier Speicher: " & MemStat.dwAvailPhys / 1024 & " KB"
End Sub


 Zusammenfassung

Ich hoffe, dass ich Ihnen mit diesem kleinen Lehrgang die Verwendung von UDTs etwas näher bringen konnte. Der Umgang mit den benutzerdefinierten Datentypen ist nicht sehr schwer, bietet aber viele Möglichkeiten, um Programme einfacher, schneller und eleganter zu entwickeln.

Aktualisiert: 12.02.2008, 20:49 Uhr Copyright © 2001 - 2010 by ST-software Navigation zurück  |  Navigation vorwärts  |  Zum Seitenanfang     
Ihre IP: 38.107.191.84 ·  Seite erstellt in: 0.438 Sekunden ·  Dateigröße:  12069 Bytes