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.

VB.NET, C# und weitere .NET-Framework-Sprachen sind weitgehend austauschbar. Sie kompilieren alle in dieselbe Zwischensprache und nutzen gemeinsam dieselbe Klassenbibliothek. Wenn Sie in einem Beispiel oder in der Dokumentation Code nur in einer Sprache sehen, können Sie davon ausgehen, dass sich derselbe Ansatz mit geringen syntaktischen Anpassungen auch in der jeweils anderen Sprache umsetzen lässt. In dieser Dokumentation werden Beispiele nach Möglichkeit sowohl für VB.NET als auch für C# bereitgestellt. Konzepte, die nur in einer Sprache gezeigt werden, gelten jedoch gleichermaßen für die andere.

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:

using System;
using System.Globalization;

namespace Introduction
{
    public class DateHandler
    {
        static readonly string[] valid_date_formats =
        {
            "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"
        };

        // ... methods follow below ...
    }
}

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 bool IsValidDate(string date)
{
    return DateTime.TryParseExact(
        date,
        valid_date_formats,
        CultureInfo.InvariantCulture,
        DateTimeStyles.None,
        out _
    );
}

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 string ParseDate(string input)
{
    bool ok = DateTime.TryParseExact(
        input,
        valid_date_formats,
        CultureInfo.InvariantCulture,
        DateTimeStyles.None,
        out DateTime date
    );

    if (ok)
    {
        return date.ToString(
            "dddd, MMMM d, yyyy",
            new CultureInfo("en-US")
        );
    }

    return "";
}

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 string ChangeDate(
    string input, int days = 0, int months = 0, int years = 0)
{
    foreach (var format in valid_date_formats)
    {
        if (DateTime.TryParseExact(
            input, format,
            CultureInfo.InvariantCulture,
            DateTimeStyles.None,
            out DateTime date))
        {
            date = date.AddDays(days);
            date = date.AddMonths(months);
            date = date.AddYears(years);
            return date.ToString(
                format, CultureInfo.InvariantCulture);
        }
    }
    return "";
}

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.