 |
| Top-Quellcodes |
|
|
| Rubriken |
|
|
| Kontakt |
|
|
| Suchen |
|
|
|
|
|
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 |
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)
|
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.
|
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"
|
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.
|
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
|
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
|
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.
|
|