Mit .NET (VB oder C#) können Sie eigene Funktionen und Klassen erstellen, die von GuiXT über das Schlüsselwort CallVB aufgerufen werden. .NET ist ein Framework von Microsoft, das eine umfangreiche Klassenbibliothek bereitstellt – darunter Funktionen für Datums- und Zeitberechnung, Textverarbeitung, Datenbankzugriff und vieles mehr. Dadurch lassen sich Aufgaben, die in GuiXT allein aufwendig wären, einfach und zuverlässig in VB.NET oder C# lösen.

In diesem Beispiel zeigen wir, wie man mit .NET Datumsangaben prüft, analysiert und verändert. Das GuiXT-Script baut folgende Oberfläche auf:

GuiXT
del (0,0) (20,200)

Box (2,12) (14,62) "Datumsverarbeitung"
InputField (4,14)	"Datum" (4,34) size=20 name="inDate"

Pushbutton	(6,14) "Prüfen" process="validate_date.txt"
Pushbutton	(6,24) "Datum lesen" process="parse_date.txt"


InputField	(8,14) "Tage" (8,34) size=8 name="days" -numerical
InputField	(9,14) "Monate" (9,34) size=8 name="months" -numerical
InputField	(10,14) "Jahre" (10,34) size=8 name="years" -numerical
InputField	(13,14) "Neues Datum" (13,34) size=20 name="newDate" -readonly

Pushbutton	(9,44) "Zeit addieren/subtrahieren" process="change_date.txt"

Der Benutzer gibt ein Datum in das Feld Date ein. Über die drei Drucktasten können dann folgende Aktionen ausgeführt werden:

  • Validate – prüft, ob das eingegebene Datum in einem der unterstützten Formate gültig ist.

  • Parse Date – gibt das Datum in ausgeschriebener Form aus (z.B. "Monday, January 5, 2025").

  • Add/Subtract Time – addiert oder subtrahiert Tage, Monate und Jahre zum eingegebenen Datum und zeigt das Ergebnis im Feld New Date an.

Die zugehörige .NET-Klasse DateHandler im Namespace Introduction enthält drei Funktionen. Zunächst wird ein Array mit allen unterstützten Datumsformaten definiert – von yyyyMMdd bis hin zu deutschen (dd.MM.yyyy) und amerikanischen (MM/dd/yyyy) Schreibweisen. Dieses Array wird von allen drei Funktionen gemeinsam genutzt:

Imports System.Globalization

Namespace Introduction

    Public Class DateHandler

        Private Shared ReadOnly valid_date_formats As String() = {
            "yyyyMMdd",
            "yyyy-MM-dd",
            "yyyy-MM-d",
            "yyyy-M-dd",
            "yyyy-M-d",
            "dd.MM.yyyy",
            "d.MM.yyyy",
            "dd.M.yyyy",
            "d.M.yyyy",
            "MM/dd/yyyy",
            "M/d/yyyy",
            "MM/d/yyyy",
            "M/dd/yyyy"
        }

        ' ... Funktionen folgen unten ...

    End Class

End Namespace

IsValidDate verwendet DateTime.TryParseExact, um das übergebene Datum gegen alle Einträge im Format-Array zu prüfen. Gibt die Funktion True zurück, ist das Datum gültig. In VB.NET wird das Ergebnis der Prüfung über eine temporäre Variable (dummy) aufgenommen, da kein Discard-Operator wie in C# verfügbar ist:

Public Function IsValidDate(ByVal dateStr As String) As Boolean
    Dim dummy As DateTime
    Return DateTime.TryParseExact(
        dateStr,
        valid_date_formats,
        CultureInfo.InvariantCulture,
        DateTimeStyles.None,
        dummy
    )
End Function

ParseDate parst das Datum ebenfalls mit TryParseExact und gibt es bei Erfolg in ausgeschriebener englischer Form zurück – z.B. "Monday, January 5, 2025". Bei einem ungültigen Datum wird ein leerer String zurückgegeben:

Public Function ParseDate(ByVal input As String) As String
    Dim parsedDate As DateTime
    Dim ok As Boolean = DateTime.TryParseExact(
        input,
        valid_date_formats,
        CultureInfo.InvariantCulture,
        DateTimeStyles.None,
        parsedDate
    )

    If ok Then
        Return parsedDate.ToString(
            "dddd, MMMM d, yyyy",
            New CultureInfo("en-US")
        )
    End If

    Return ""
End Function

ChangeDate durchsucht das Format-Array, bis das eingegebene Datum erfolgreich geparst werden kann. Anschließend werden die angegebenen Tage, Monate und Jahre addiert – negative Werte subtrahieren. Das Ergebnis wird im gleichen Format zurückgegeben, in dem das Eingangsdatum erkannt wurde. Die optionalen Parameter werden in VB.NET mit dem Schlüsselwort Optional und einem Standardwert deklariert:

Public Function ChangeDate(ByVal input As String,
                           Optional ByVal days As Integer = 0,
                           Optional ByVal months As Integer = 0,
                           Optional ByVal years As Integer = 0) As String
    For Each format As String In valid_date_formats
        Dim parsedDate As DateTime
        If DateTime.TryParseExact(input, format,
                                  CultureInfo.InvariantCulture,
                                  DateTimeStyles.None,
                                  parsedDate) Then
            parsedDate = parsedDate.AddDays(days)
            parsedDate = parsedDate.AddMonths(months)
            parsedDate = parsedDate.AddYears(years)
            Return parsedDate.ToString(
                format, CultureInfo.InvariantCulture)
        End If
    Next
    Return ""
End Function

Damit die Klasse in GuiXT verwendet werden kann, sind zwei Voraussetzungen zu erfüllen:

  • Klassenbibliothek mit .NET Framework: Das Projekt muss als Klassenbibliothek (DLL) kompiliert werden. Als Zielframework ist das .NET Framework in Version 4.0 oder höher zu verwenden – nicht .NET Core oder .NET 5+.

  • DLL-Verzeichnis: Die kompilierte DLL muss in das im GuiXT-Profil eingetragene Verzeichnis für .NET-Klassenbibliotheken (VBDirectory) kopiert werden. Die Schnittstellenbibliothek guinet.dll (im GuiXT-Setup enthalten) muss sich ebenfalls in diesem Verzeichnis befinden.

Die drei InputScripts rufen die .NET-Funktionen jeweils mit CallVB auf:

validate_date.txt

GuiXT
callvb rval = Introduction.DateHandler.IsValidDate "&V[inDate]"
Message "&V[rval]"

parse_date.txt

GuiXT
callvb rval = Introduction.DateHandler.ParseDate "&V[inDate]"
Message "&V[rval]"

change_date.txt – fehlende Werte werden vor dem Aufruf auf "0" gesetzt:

GuiXT
if V[days=]
  Set V[days] "0"
endif
if V[months=]
  Set V[months] "0"
endif
if V[years=]
  Set V[years] "0"
endif

callvb rval = Introduction.DateHandler.ChangeDate "&V[inDate]" _
  "&V[days]" "&V[months]" "&V[years]"

Set V[newDate] "&V[rval]"

Das Ergebnis von ChangeDate wird direkt in das Feld New Date geschrieben. Leer gelassene Felder für Tage, Monate oder Jahre werden vor dem Aufruf auf "0" gesetzt, damit die .NET-Funktion einen gültigen Integer-Wert erhält.