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:
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
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 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
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 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
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 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
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:
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.