ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 04.05.2001

Diese Seite wurde zuletzt aktualisiert am 04.05.2001
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Versions-Vergleiche

Zurück...


Anzeige

(-hg) mailto:hg_vercompare@aboutvb.de

Wie können Sie Versionsnummern vergleichen, die als kompletter String vorliegen, beispielsweise "1.001.2.04711" und "1.001.2.047101" und ähnlich? Ein reiner String-Vergleich, etwa mittels der Visual Basic-Funktion StrComp, kann den Vergleich nicht leisten, da ja die einzelnen Abschnitte jeweils miteinander verglichen werden müssen.

Der einfachste Weg führt über die ab Visual Basic 6 zur Verfügung stehende Split-Funktion (einen Ersatz der Split-Funktion für VB 5 und früher finden sie

unter Teile-Haberschaft"Teile-Haberschaft"). Damit zerlegen Sie zwei zu vergleichende Versions-Strings in zwei Arrays, deren Elemente Sie Stufe für Stufe miteinander vergleichen können. Sobald sich die beiden Elemente einer Stufe voneinander unterscheiden, ist der Vergleichsvorgang beendet - das im direkten Vergleich jeweils größere Element bestimmt, welche Version insgesamt die höhere ist. Der Vergleich erfolgt hierbei über StrComp. Die möglichen Vergleichsresultate sind identisch mit den Werten einer eigenen Enumeration VersionsCompareConstants, die lediglich zur einfacheren Handhabung der Werte im Kontext des Versionsvergleichs dient.

Ein erster Ansatz zu einer Vergleichs-Funktion könnte somit so aussehen:

Public Enum VersionsCompareConstants
  vcFirstVersionLower = -1
  vcFirstVersionEquals = 0
  vcFirstVersionHigher = 1
End Enum

Public Function VCompare1(Version1 As Variant, Version2 As Variant) _
 As VersionsCompareConstants

  Dim nVer1 As Variant
  Dim nVer2 As Variant
  Dim i As Integer
  Dim nCompare As Integer
  
  nVer1 = Split(Version1, ".")
  nVer2 = Split(Version2, ".")
  For i = 0 To UBound(nVer1)
    nCompare = StrComp(nVer1(i), nVer2(i))
    If nCompare <> vcFirstVersionEquals Then
      Exit For
    End If
  Next 'i
  VCompare1 = nCompare
End Function

Dieser erste Ansatz hat den kleinen Nachteil, dass die beiden zu vergleichenden Versions-Strings die gleiche Anzahl an Versions-Stufen enthalten müssen. Ein Vergleich von zwei Versions-Strings wie "1.001" und "1.001.1" würde mit einem Laufzeitfehler quittiert.

In einem zweiten Ansatz vergleichen wir daher zusätzlich zunächst die Obergrenzen der aus den Zerlegungen mit Split resultierenden Arrays. Die niedrigre Obergrenze ergibt die Anzahl der zu vergleichenden Stufen. Dazu gilt die sinnvolle Annahme, dass ein Versions-String in jedem Fall der höhere ist, wenn er mehr Stufen enthält, so lange die auf beiden Seiten gleichen Stufen jeweils gleich sind. Beim Vergleich der Obergrenzen wird daher gleich in der Variablen nDifferentLevels festgehalten, welche der beiden Versionen die höhere sein soll, falls der nachfolgende Vergleich der gemeinsamen Versions-Stufen unentschieden ausgehen sollte.

Public Function VCompare2(Version1 As Variant, Version2 As Variant) _
 As VersionsCompareConstants

  Dim nVer1 As Variant
  Dim nVer2 As Variant
  Dim i As Integer
  Dim nUBound As Integer
  Dim nCompare As Integer
  Dim nDifferentLevels As Integer

  nVer1 = Split(Version1, ".")
  nVer2 = Split(Version2, ".")
  Select Case UBound(nVer1)
    Case Is > UBound(nVer2)
      nUBound = UBound(nVer2)
      nDifferentLevels = vcFirstVersionHigher
    Case UBound(nVer2)
      nUBound = UBound(nVer2)
    Case Is < UBound(nVer2)
      nUBound = UBound(nVer1)
      nDifferentLevels = vcFirstVersionLower
  End Select
  For i = 0 To nUBound
    nCompare = StrComp(nVer1(i), nVer2(i))
    If nCompare <> vcFirstVersionEquals Then
      Exit For
    End If
  Next 'i
  If nDifferentLevels Then
    If nCompare = vcFirstVersionEquals Then
      nCompare = nDifferentLevels
    End If
  End If
  VCompare2 = nCompare
End Function

Im Sinne der Aufgabenstellung funktioniert dieser zweite Ansatz tadellos. Für den Fall jedoch, dass vielleicht eine der beiden Versions-Information (oder sogar beide) nicht in der Form eines Strings vorliegen sollte, sondern als einzelne Werte für jede Stufe oder bereits als Array, erhöhen wir den Komfort der Funktion ein wenig. In der folgenden endgültigen Version können sowohl Strings als auch Arrays übergeben werden, wobei Einzelwerte zunächst mittels der Array-Funktion zu einem Array zusammengefasst werden müssen. Voraussetzung ist allerdings, dass bereits vorhandene Arrays mit der Untergrenze 0 beginnen müssen.

Public Function VersionsCompare(Version1 As Variant, _
 Version2 As Variant) As VersionsCompareConstants

  Dim nVer1 As Variant
  Dim nVer2 As Variant
  Dim i As Integer
  Dim nUBound As Integer
  Dim nCompare As Integer
  Dim nDifferentLevels As Integer
  
  If IsArray(Version1) Then
    nVer1 = Version1
  ElseIf VarType(Version1) = vbString Then
    nVer1 = Split(Version1, ".")
  Else
    Err.Raise 380
  End If
  If IsArray(Version2) Then
    nVer2 = Version2
  ElseIf VarType(Version2) = vbString Then
    nVer2 = Split(Version2, ".")
  Else
    Err.Raise 380
  End If
  Select Case UBound(nVer1)
    Case Is > UBound(nVer2)
      nUBound = UBound(nVer2)
      nDifferentLevels = vcFirstVersionHigher
    Case UBound(nVer2)
      nUBound = UBound(nVer2)
    Case Is < UBound(nVer2)
      nUBound = UBound(nVer1)
      nDifferentLevels = vcFirstVersionLower
  End Select
  For i = 0 To nUBound
    nCompare = StrComp(nVer1(i), nVer2(i))
    If nCompare <> vcFirstVersionEquals Then
      Exit For
    End If
  Next 'i
  If nDifferentLevels Then
    If nCompare = vcFirstVersionEquals Then
      nCompare = nDifferentLevels
    End If
  End If
  VersionsCompare = nCompare
End Function

Modul modVersionsCompare (modVersionsCompare.bas - ca. 1,7 KB)


Artikel
Zum Download-Bereich dieses Artikel
Mail an den Autor dieses Artikels

KnowHow
Zur KnowHow-Übersicht

KnowHow-Themen
Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche




Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer