Rubrik: Variablen/Strings · UDT (Benutzerdefinierte Datentypen) | VB-Versionen: VB4, VB5, VB6 | 11.08.03 |
UDT - Benutzerdefinierte Datentypen vergleichen Dieser Tipp verrät Ihnen, wie sich zwei gefüllte UDT-Strukturen ganz leicht miteinander vergleichen lassen. | ||
Autor: Dieter Otter | Bewertung: | Views: 16.951 |
www.tools4vb.de | System: Win9x, WinNT, Win2k, WinXP, Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Hin und wieder erstellt man sich zum Speichern von Daten ein UDT - eine User-Defined-Type Struktur oder zu deutsch: benutzerdefinierter Datentyp. Hierbei handelt es sich um eine Art "Datensatz", welcher mehrere zusammengehörende Elemente enthält.
Beispiel für einen benutzerdefinierten Datentyp (UDT):
' Anschrift Private Type UDT_Anschrift Anrede As String * 20 Name As String * 30 Vorname As String * 30 Firma As String * 50 Strasse As String * 40 PLZ As String * 8 Ort As String * 30 Land As String * 20 GebDatum As Date Telefon As String * 20 Fax As String * 20 EMail As String * 50 MailInfo As Boolean End Type
Solch ein benutzerdefinierter Datentyp wird dann wie folgt mit den entsprechenden Daten gefüllt:
Dim UDT_Kundenanschrift As UDT_Anschrift With UDT_Kundenanschrift .Anrede = "Herr" .Name = "Otter" .Vorname = "Dieter" .Firma = "Software-Entwicklung & Vertrieb" ... .MailInfo = True End Width
Verwendet man mehrere solcher Datentypen, bzw. ein Array, und muss nun eine Struktur mit einer Zweiten vergleichen, könnte man meinen, man müsse dies wie folgt machen:
With UDT_Kundenanschrift(1) If .Anrede = UDT_Kundenanschrift(2).Anrede AND _ .Name = UDT_Kundenanschrift(2).Name AND _ .Vorname = UDT_Kundenanschrift(2).Vorname AND _ ... .MailInfo = UDT_Kundenanschrift(2).MailInfo Then MsgBox "Beide UDTs sind identisch!" Else MsgBox "UDTs unterscheiden sich!" End If End With
Diese Vorgehensweise ist bei umfangreichen Datenstrukturen natürlich sehr aufwendig.
Es gibt da aber noch eine Alternative!
Mit Hilfe der "CopyMemory"-Funktion aus dem Windows-API lässt sich der gesamte Inhalt eines UDTs in einen String kopieren. Somit braucht man dann einfach nur noch die beiden Strings miteinander zu vergleiche:
If udt2String(udt1) = udt2String(udt2) Then MsgBox "Beide UDTs sind identisch!" End If
Die Funktion udt2String setzt sich wie folgt zusammen:
' benötigte API-Deklaration Private Declare Function CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" ( _ lpvDest As Any, _ lpvSource As Any, _ ByVal nByte As Long) As Long
' UDT in String konvertieren Private Function udt2String(vUDT As UDT_Anschrift) As String Dim sBuffer As String Dim nSize As Long nSize = Len(vUDT) sBuffer = Space$(nSize) CopyMemory ByVal sBuffer, ByVal vUDT, nSize udt2String = sBuffer End Function
Bezogen auf das obige Beispiel, sieht die Abfrage dann wie folgt aus:
If udt2String(UDT_Kundenanschrift(1)) = _ udt2String(UDT_Kundenanschrift(2)) Then MsgBox "Beide UDTs sind identisch!" Else MsgBox "UDTs unterscheiden sich!" End If
Hinweis:
Das ganze funktioniert nur mit benutzerdefinierten Datentypen fester Länge!
D.h. wenn Sie String-Elemente innerhalb der Struktur verwenden, müssen Sie deren maximale Länge fest vorgeben.