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