MultiDlg #
Der MultiDlg ist ein universeller Eingabedialog mit vertikalem Property-Grid. Er ermöglicht die Abfrage beliebig vieler Felder unterschiedlicher Typen (Text, Zahlen, Datum, Combos, Farben, Bilder u.v.m.) in einem einzigen Dialog. Felder können in Kategorien gruppiert werden. Der Dialog unterstützt Drucken, Excel-Export und eine integrierte HTML-Hilfe.
Der MultiDlg ist komplett unabhängig von der Datenbankstruktur. Er kann bestehende Datenbankfelder in anderer Sichtweise anzeigen oder eigene Zusatzfelder aus getrennten Tabellen editieren. Über das Dataset-Objekt lässt sich die Maske mit dem am Bildschirm angezeigten Datensatz synchronisieren (z.B. über Dataset.RefreshCurrent nach dem Schließen des Dialogs).
Erzeugt wird der Dialog über CreateDialog auf dem aktiven Mandanten. Im iScript-Editor von EULANDA ist dieser als globales Client-Objekt vorhanden – dort genügt der direkte Aufruf. Extern (VbsEdit, cscript/wscript, PowerShell) gibt es kein globales Client; der Mandant muss zuerst beschafft und aktiviert werden (siehe Schnelleinstieg). PowerShell läuft ausschließlich extern, nie im iScript-Editor:
' iScript-Editor: Client ist global; extern zuvor beschaffen (siehe Schnelleinstieg)
Set Dialog = Client.CreateDialog("Eulanda.MultiDlg", "MeineInstanz")
// iScript-Editor: Client ist global; extern zuvor beschaffen (siehe Schnelleinstieg)
var Dialog = Client.CreateDialog("Eulanda.MultiDlg", "MeineInstanz");
# nur extern: $Client = zuvor beschaffter Mandant (siehe Schnelleinstieg)
$Dialog = $Client.CreateDialog("Eulanda.MultiDlg", "MeineInstanz")
Der zweite Parameter (Instance) steuert die Speicherung des Fensterzustands. Dialoge mit unterschiedlichen Instanznamen merken sich Position und Spaltenbreiten getrennt.
Der MultiDlg lässt sich auch aus dem Berichts-Designer öffnen. Beispiel I weiter unten zeigt diese Report-Implementierung (Pascal-Script/RAP).
Schnelleinstieg #
Option Explicit
' EULANDA-Application instanzieren und Mandant aktivieren
Dim App, Client
Set App = CreateObject("Eulanda.Application")
Set Client = App.Clients(0) ' oder: App.Clients("MeinMandant")
Client.Active = True
Dim Dialog
Set Dialog = Client.CreateDialog("Eulanda.MultiDlg", "")
With Dialog
.Title = "Kundendaten"
.SubTitle = "Bitte die Daten eingeben"
.IconUrl = "folder"
.GridLines = 3 ' eulGridLinesBoth
.AddField "Vorname", "String", "Max", ""
.AddField "Nachname", "String", "Mustermann", ""
.AddField "Alter", "Integer", 42, ""
.AddField "Aktiv", "Boolean", True, ""
If .Execute Then
MsgBox "Vorname: " & .Values("Vorname") & vbCrLf & _
"Nachname: " & .Values("Nachname") & vbCrLf & _
"Alter: " & CStr(.Values("Alter"))
End If
End With
Set Dialog = Nothing
' Aufräumen
Set Client = Nothing
Set App = Nothing
Dasselbe in JScript (Ausgabe über WScript.Echo, da JScript kein MsgBox kennt):
// EULANDA-Application instanzieren und Mandant aktivieren
var App = new ActiveXObject("Eulanda.Application");
var Client = App.Clients(0); // oder: App.Clients("MeinMandant")
Client.Active = true;
var Dialog = Client.CreateDialog("Eulanda.MultiDlg", "");
Dialog.Title = "Kundendaten";
Dialog.SubTitle = "Bitte die Daten eingeben";
Dialog.IconUrl = "folder";
Dialog.GridLines = 3; // eulGridLinesBoth
Dialog.AddField("Vorname", "String", "Max", "");
Dialog.AddField("Nachname", "String", "Mustermann", "");
Dialog.AddField("Alter", "Integer", 42, "");
Dialog.AddField("Aktiv", "Boolean", true, "");
if (Dialog.Execute()) {
WScript.Echo("Vorname: " + Dialog.Values("Vorname") + "\n" +
"Nachname: " + Dialog.Values("Nachname") + "\n" +
"Alter: " + Dialog.Values("Alter"));
}
// Aufräumen
Dialog = null;
Client = null;
App = null;
Dasselbe von außen mit PowerShell – siehe PowerShell / Scripting Host:
# EULANDA-Application instanzieren und Mandant aktivieren
$App = New-Object -ComObject "Eulanda.Application"
$Client = $App.Clients(0) # oder: $App.Clients("MeinMandant")
$Client.Active = $true
$Dialog = $Client.CreateDialog("Eulanda.MultiDlg", "")
$Dialog.Title = "Kundendaten"
$Dialog.SubTitle = "Bitte die Daten eingeben"
$Dialog.IconUrl = "folder"
$Dialog.GridLines = 3 # eulGridLinesBoth
$Dialog.AddField("Vorname", "String", "Max", "")
$Dialog.AddField("Nachname", "String", "Mustermann", "")
$Dialog.AddField("Alter", "Integer", 42, "")
$Dialog.AddField("Aktiv", "Boolean", $true, "")
if ($Dialog.Execute()) {
Write-Host "Vorname: $($Dialog.Values('Vorname'))"
Write-Host "Nachname: $($Dialog.Values('Nachname'))"
Write-Host "Alter: $($Dialog.Values('Alter'))"
}
# Aufräumen -- COM-Objekte freigeben
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Dialog) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Client) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($App) | Out-Null
Übersicht #
Eigenschaften #
| Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
Title | String | Titel im Kopfbereich (groß, fett) | |
SubTitle | String | Untertitel im Kopfbereich | |
Caption | String | "Eingabedialog" | Fenstertitel in der Titelleiste |
IconUrl | String | Symbol im Kopfbereich (z.B. "folder", "gearwheel") | |
GridLines | Integer | 0 | Gitterlinien (siehe Konstanten) |
Height | Integer | auto | Dialoghöhe in Zeilen (je 18 Pixel) |
Help | String | HTML-Hilfe oder URL im unteren Bereich (eingebetteter WebView) | |
HtmlHelp | String | Alias für Help | |
HtmlHelpHeight | Integer | 0 | Höhe des Hilfebereichs in Pixeln |
HelpUrl | String | Externe URL für „Hilfe"-Button, öffnet im Standardbrowser (seit MinorVersion 4) | |
HelpCaption | String | "Hilfe" | Beschriftung des „Hilfe"-Buttons (seit MinorVersion 4) |
ExplorerStyle | Boolean | False | Explorer-Stil für Kategorien |
DotNetStyle | Boolean | False | DotNet-Darstellung |
FlowStyle | Boolean | False | Band-Layout (mehrere Spalten) |
MajorVersion | Integer | 2 | Hauptversion (nur lesen) |
MinorVersion | Integer | 4 | Nebenversion (nur lesen) |
DeletePressed | Boolean | False | True wenn Löschen gedrückt wurde (nur lesen) |
Button-Eigenschaften #
| Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
OkVisible | Boolean | True | OK-Button anzeigen |
OkCaption | String | "Übernehmen" | Beschriftung OK-Button |
CancelVisible | Boolean | True | Abbrechen-Button anzeigen |
CancelCaption | String | "Verwerfen" | Beschriftung Abbrechen-Button |
DeleteVisible | Boolean | False | Löschen-Button anzeigen |
DeleteCaption | String | "Löschen" | Beschriftung Löschen-Button |
PrintVisible | Boolean | False | Drucken-Button anzeigen |
PrintCaption | String | "Drucken" | Beschriftung Drucken-Button |
PrintPreviewVisible | Boolean | False | Vorschau im Kontextmenü |
PrintPreviewCaption | String | "Vorschau" | Beschriftung Vorschau |
ExportVisible | Boolean | False | Export-Button anzeigen |
ExportCaption | String | "Exportieren" | Beschriftung Export-Button |
Druck- und Export-Eigenschaften #
| Eigenschaft | Typ | Standard | Beschreibung |
|---|---|---|---|
ReportTitle | String | (= Caption) | Titel im Druckbericht |
PrintJobTitle | String | (= Caption) | Name des Druckauftrags |
ExportFileName | String | Desktop + Caption + .xls | Standard-Dateiname für Excel-Export |
UserNameVisible | Boolean | False | Benutzername im Druckkopf anzeigen |
DateVisible | Boolean | True | Datum im Druckkopf anzeigen |
PageNoVisible | Boolean | True | Seitenzahlen im Druckfuß anzeigen |
Methoden #
| Methode | Rückgabe | Beschreibung |
|---|---|---|
AddCategory(Caption) | – | Kategorie (Abschnitt) hinzufügen |
AddField(Name, Typ, Default, Hint) | – | Eingabefeld hinzufügen |
AddFieldItem(Name, Item) | – | Eintrag zu Combo/Radio hinzufügen |
SetOption(Name, Option, Wert) | – | Feldoption setzen |
SetValue(Name, Wert) | – | Feldwert setzen |
Values(Name) | Variant | Feldwert lesen |
SetHints(Name, Text) | – | Tooltip setzen |
Hints(Name) | String | Tooltip lesen |
Execute | Boolean | Dialog anzeigen (True = OK) |
LoadState(Version) | – | Gespeicherten Zustand laden |
SaveState | – | Aktuellen Zustand speichern |
ExpandAll | – | Alle Kategorien aufklappen |
CollapseAll | – | Alle Kategorien zuklappen |
Clear | – | Alle Felder entfernen |
Sample | – | Demo-Daten einfügen |
AddHandler(Handler) | – | Event-Handler registrieren |
NativeFieldType(Typ) | String | Nativen Datentyp eines Feldtyps ermitteln |
StrToFilename(Text) | String | Text in gültigen Dateinamen umwandeln |
Feldtypen #
Der zweite Parameter von AddField bestimmt den Typ des Eingabefeldes.
Standard-Typen #
| Typ | Wert in VBS | Editor | Beschreibung |
|---|---|---|---|
"String" | String | Texteingabe | Einzeiliger Text |
"Memo" | String | Mehrzeilig | Mehrzeiliger Text (Blob-Editor) |
"Integer" | Integer | Zahleneingabe | Ganzzahl |
"Float" | Double | Dezimaleingabe | Dezimalzahl (2 Nachkommastellen) |
"Currency" | Currency | Währung | Währungsbetrag |
"Calc" | Double | Taschenrechner | Zahl mit Rechner-Popup |
"Boolean" | Boolean | Checkbox | Wahr/Falsch |
"DateTime" | Date | Kalender + Uhr | Datum und Uhrzeit |
"Date" | Date | Kalender | Nur Datum (mit Kalenderwochen) |
"Time" | Date | Zeiteingabe | Nur Uhrzeit |
"Combo" | String | Dropdown | Auswahlliste (siehe AddFieldItem) |
"Radio" | Integer | Radiogruppe | Optionsschalter (0-basiert) |
"Spin" | Integer | Drehfeld | Zahl mit Hoch/Runter-Buttons |
"Track" | Integer | Schieberegler | Slider (Standard: 0-100) |
"Color" | Integer | Farbauswahl | Farbwähler mit Palette |
"Font" | String | Schriftauswahl | Dropdown mit Schriftarten |
"Shell" | String | Ordnerauswahl | Datei-/Ordner-Browser |
"Image" | Variant | Bildfeld | Bild-Anzeige und -Auswahl |
Typ-Modifikatoren (Prefix) #
Feldtypen können mit Präfixen kombiniert werden:
| Präfix | Syntax | Beschreibung |
|---|---|---|
+ | "+String" | Feld wird Unterelement der letzten Kategorie |
Gruppe. | "Addr.String" | Felder mit gleicher Gruppe erscheinen in einer Zeile |
| Kombination | "+Addr.String" | Beides kombiniert |
Feldname mit Anzeigename #
Der Feldname kann über @ in Anzeigename und internen Schlüssel getrennt werden:
.AddField "Anzeigename@InternerKey", "String", "", ""
Ohne @ wird der Feldname sowohl als Anzeige als auch als Schlüssel verwendet.
Methoden im Detail #
AddCategory #
AddCategory(Caption: String)
Fügt eine Kategorie-Überschrift ein. Alle folgenden Felder mit +-Präfix im Typ werden dieser Kategorie untergeordnet.
.AddCategory "Adresse"
.AddField "Straße", "+String", "", ""
.AddField "PLZ", "+String", "", ""
.AddField "Ort", "+String", "", ""
AddField #
AddField(Name: String, Typ: String, Default: Variant, Hint: String)
| Parameter | Beschreibung |
|---|---|
Name | Feldname (oder "Anzeige@Schlüssel") |
Typ | Feldtyp (siehe Tabelle oben), optional mit Präfix |
Default | Vorgabewert (Null für leer) |
Hint | Tooltip-Text (leerer String für keinen Tooltip) |
AddFieldItem #
AddFieldItem(Name: String, Item: String)
Fügt einen Eintrag zu einem Combo-, Radio- oder Color-Feld hinzu. Muss nach AddField aufgerufen werden.
.AddField "Land@Country", "Combo", "DE", ""
.AddFieldItem "Country", "DE"
.AddFieldItem "Country", "AT"
.AddFieldItem "Country", "CH"
SetOption #
SetOption(Name: String, Option: String, Wert: Variant)
Setzt eine Feldoption. Verfügbare Optionen:
| Option | Gilt für | Wert | Beschreibung |
|---|---|---|---|
"FIXED" | Combo | – | Dropdown nicht editierbar |
"EDIT" | Combo | – | Dropdown editierbar (Freitext möglich) |
"READONLY" | Alle | 1/0 | Schreibschutz |
"HEIGHT" | Alle | Integer | Zeilenhöhe (Vielfaches von 17px) |
"HIDEFIELDNAME" | Alle | 1/0 | Feldbezeichnung ausblenden |
"DECIMALS" | Float, Calc | Integer | Nachkommastellen: 0 = keine, 1-6 = fest, >6 = Fließkomma |
"SEPARATOR" | Float, Calc, Integer | 1/0 | Tausendertrennzeichen (Standard: 1 = aktiv) |
"COLORSET" | Color | String | Farbpalette ("DELPHI", "HTML", "X11") |
"INLINE" | Image | – | Bild in Originalgröße anzeigen |
"ICON" | Image | – | Bild als Symbol anzeigen |
"EXPAND" | Kategorie | – | Kategorie aufklappen |
"COLLAPSE" | Kategorie | – | Kategorie zuklappen |
Values #
Values(Name: String): Variant
Liest den Wert eines Feldes nach Ausführung des Dialogs. Der Name muss dem internen Schlüssel entsprechen (bei @-Syntax der Teil nach dem @).
Execute #
Execute: Boolean
Zeigt den Dialog modal an. Gibt True zurück, wenn der Benutzer “Übernehmen” klickt, False bei “Verwerfen” oder Schließen.
Tastenkürzel: Strg+Enter = Übernehmen, Esc = Verwerfen.
LoadState / SaveState #
LoadState(StateVersion: Integer)
SaveState
LoadState lädt einen gespeicherten Dialogzustand (Spaltenbreiten, auf-/zugeklappte Kategorien). Der Parameter StateVersion stellt sicher, dass bei Änderungen am Feldlayout ein veralteter Zustand nicht geladen wird. Wenn LoadState aufgerufen wurde, wird der Zustand beim Schließen automatisch gespeichert.
Konstanten #
GridLines #
| Wert | RAP-Konstante | Beschreibung |
|---|---|---|
| 0 | vglNone | Keine Gitterlinien |
| 1 | vglHorizontal | Nur horizontal |
| 2 | vglVertical | Nur vertikal |
| 3 | vglBoth | Horizontal und vertikal |
In VBScript/JavaScript als Integer verwenden. In RAP-Scripten stehen die Konstanten auch über consts.eulGridLinesBoth etc. zur Verfügung.
Event-Handler #
Der Dialog unterstützt Event-Handler über AddHandler. Das Handler-Objekt kann folgende Ereignisse implementieren:
| Ereignis | Auslöser | Beschreibung |
|---|---|---|
Dialog_OnConnect | Nach Erstellung, vor Anzeige | Initialisierung |
Dialog_OnDisconnect | Nach Schließen | Aufräumen |
Beispiele #
Die folgenden Beispiele sind so geschrieben, dass jedes eigenständig läuft – in VBScript/JScript (z.B. über VbsEdit oder cscript/wscript) ebenso wie in PowerShell. Jedem Beispiel ist daher dasselbe Grundgerüst vorangestellt: Eulanda.Application erzeugen, den Mandanten über Clients(0) (oder Clients("MeinMandant")) wählen, mit Active = True aktivieren und die COM-Objekte am Ende wieder freigeben (in VBScript/JScript per Set ... = Nothing bzw. = null, in PowerShell per ReleaseComObject). Eulanda.Application sucht die registrierten Mandanten selbst zusammen; einen Pfad zu einer einzelnen .udl-Datei nimmt das Objekt nicht entgegen.
Läuft das Script dagegen innerhalb von EULANDA – im iScript-Editor oder als Registry-Action (siehe Integration in EULANDA) –, ist der Mandant bereits als globales Client-Objekt vorhanden. Dann entfällt das Grundgerüst und man verwendet direkt Client.CreateDialog(...). PowerShell greift immer von außen zu (siehe PowerShell / Scripting Host).
A. Einfacher Eingabedialog #
VBScript:
Option Explicit
' EULANDA-Application instanzieren und Mandant aktivieren
Dim App, Client
Set App = CreateObject("Eulanda.Application")
Set Client = App.Clients(0) ' oder: App.Clients("MeinMandant")
Client.Active = True
Dim Dialog
Set Dialog = Client.CreateDialog("Eulanda.MultiDlg", "")
With Dialog
.Title = "Neuer Artikel"
.SubTitle = "Artikeldaten eingeben"
.IconUrl = "gearwheel"
.GridLines = 3
.AddField "Artikelnummer@ArtNr", "String", "", "Die eindeutige Artikelnummer"
.AddField "Bezeichnung@Bez", "String", "", ""
.AddField "Preis", "Float", 0, "Verkaufspreis in EUR"
.AddField "Aktiv", "Boolean", True, ""
If .Execute Then
MsgBox .Values("ArtNr") & " - " & .Values("Bez") & _
" - " & CStr(.Values("Preis")) & " EUR"
End If
End With
Set Dialog = Nothing
' Aufräumen
Set Client = Nothing
Set App = Nothing
JScript:
// EULANDA-Application instanzieren und Mandant aktivieren
var App = new ActiveXObject("Eulanda.Application");
var Client = App.Clients(0); // oder: App.Clients("MeinMandant")
Client.Active = true;
var Dialog = Client.CreateDialog("Eulanda.MultiDlg", "");
Dialog.Title = "Neuer Artikel";
Dialog.SubTitle = "Artikeldaten eingeben";
Dialog.IconUrl = "gearwheel";
Dialog.GridLines = 3;
Dialog.AddField("Artikelnummer@ArtNr", "String", "", "Die eindeutige Artikelnummer");
Dialog.AddField("Bezeichnung@Bez", "String", "", "");
Dialog.AddField("Preis", "Float", 0, "Verkaufspreis in EUR");
Dialog.AddField("Aktiv", "Boolean", true, "");
if (Dialog.Execute()) {
WScript.Echo(Dialog.Values("ArtNr") + " - " + Dialog.Values("Bez") +
" - " + Dialog.Values("Preis") + " EUR");
}
// Aufräumen
Dialog = null;
Client = null;
App = null;
PowerShell:
# EULANDA-Application instanzieren und Mandant aktivieren
$App = New-Object -ComObject "Eulanda.Application"
$Client = $App.Clients(0) # oder: $App.Clients("MeinMandant")
$Client.Active = $true
$Dialog = $Client.CreateDialog("Eulanda.MultiDlg", "")
$Dialog.Title = "Neuer Artikel"
$Dialog.SubTitle = "Artikeldaten eingeben"
$Dialog.IconUrl = "gearwheel"
$Dialog.GridLines = 3
$Dialog.AddField("Artikelnummer@ArtNr", "String", "", "Die eindeutige Artikelnummer")
$Dialog.AddField("Bezeichnung@Bez", "String", "", "")
$Dialog.AddField("Preis", "Float", 0, "Verkaufspreis in EUR")
$Dialog.AddField("Aktiv", "Boolean", $true, "")
if ($Dialog.Execute()) {
Write-Host "$($Dialog.Values('ArtNr')) - $($Dialog.Values('Bez')) - $($Dialog.Values('Preis')) EUR"
}
# Aufräumen -- COM-Objekte freigeben
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Dialog) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Client) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($App) | Out-Null
B. Kategorien und Combos #
VBScript:
Option Explicit
' EULANDA-Application instanzieren und Mandant aktivieren
Dim App, Client
Set App = CreateObject("Eulanda.Application")
Set Client = App.Clients(0) ' oder: App.Clients("MeinMandant")
Client.Active = True
Dim Dialog, StateVersion
Randomize
StateVersion = CInt(Rnd * 1000)
Set Dialog = Client.CreateDialog("Eulanda.MultiDlg", "Bestellung")
With Dialog
.Title = "Bestellung"
.SubTitle = "Versandoptionen konfigurieren"
.IconUrl = "folder"
.GridLines = 3
.LoadState StateVersion
.AddCategory "Versand"
.AddField "Versandart@Versand", "+Combo", "Standard", ""
.AddFieldItem "Versand", "Standard"
.AddFieldItem "Versand", "Express"
.AddFieldItem "Versand", "Abholung"
.SetOption "Versand", "FIXED", 0
.AddField "Lieferdatum@Datum", "+Date", Now, ""
.AddField "Anmerkung@Notiz", "+Memo", "", "Optionaler Hinweis"
.SetOption "Notiz", "HEIGHT", 3
.AddCategory "Zahlung"
.AddField "Zahlart@Zahl", "+Radio", 0, ""
.AddFieldItem "Zahl", "Rechnung"
.AddFieldItem "Zahl", "Vorkasse"
.AddFieldItem "Zahl", "Nachnahme"
.AddField "Rabatt@Rabatt", "+Track", 0, "Rabatt in Prozent"
If .Execute Then
MsgBox "Versand: " & .Values("Versand") & vbCrLf & _
"Datum: " & CStr(.Values("Datum")) & vbCrLf & _
"Zahlart: " & CStr(.Values("Zahl")) & vbCrLf & _
"Rabatt: " & CStr(.Values("Rabatt")) & "%"
End If
End With
Set Dialog = Nothing
' Aufräumen
Set Client = Nothing
Set App = Nothing
JScript:
// EULANDA-Application instanzieren und Mandant aktivieren
var App = new ActiveXObject("Eulanda.Application");
var Client = App.Clients(0); // oder: App.Clients("MeinMandant")
Client.Active = true;
var stateVersion = Math.floor(Math.random() * 1000);
var Dialog = Client.CreateDialog("Eulanda.MultiDlg", "Bestellung");
Dialog.Title = "Bestellung";
Dialog.SubTitle = "Versandoptionen konfigurieren";
Dialog.IconUrl = "folder";
Dialog.GridLines = 3;
Dialog.LoadState(stateVersion);
Dialog.AddCategory("Versand");
Dialog.AddField("Versandart@Versand", "+Combo", "Standard", "");
Dialog.AddFieldItem("Versand", "Standard");
Dialog.AddFieldItem("Versand", "Express");
Dialog.AddFieldItem("Versand", "Abholung");
Dialog.SetOption("Versand", "FIXED", 0);
Dialog.AddField("Lieferdatum@Datum", "+Date", new Date().getVarDate(), ""); // getVarDate() liefert ein COM-Datum (VT_DATE)
Dialog.AddField("Anmerkung@Notiz", "+Memo", "", "Optionaler Hinweis");
Dialog.SetOption("Notiz", "HEIGHT", 3);
Dialog.AddCategory("Zahlung");
Dialog.AddField("Zahlart@Zahl", "+Radio", 0, "");
Dialog.AddFieldItem("Zahl", "Rechnung");
Dialog.AddFieldItem("Zahl", "Vorkasse");
Dialog.AddFieldItem("Zahl", "Nachnahme");
Dialog.AddField("Rabatt@Rabatt", "+Track", 0, "Rabatt in Prozent");
if (Dialog.Execute()) {
WScript.Echo("Versand: " + Dialog.Values("Versand") + "\n" +
"Datum: " + Dialog.Values("Datum") + "\n" +
"Zahlart: " + Dialog.Values("Zahl") + "\n" +
"Rabatt: " + Dialog.Values("Rabatt") + "%");
}
// Aufräumen
Dialog = null;
Client = null;
App = null;
PowerShell:
# EULANDA-Application instanzieren und Mandant aktivieren
$App = New-Object -ComObject "Eulanda.Application"
$Client = $App.Clients(0) # oder: $App.Clients("MeinMandant")
$Client.Active = $true
$Dialog = $Client.CreateDialog("Eulanda.MultiDlg", "Bestellung")
$Dialog.Title = "Bestellung"
$Dialog.SubTitle = "Versandoptionen konfigurieren"
$Dialog.IconUrl = "folder"
$Dialog.GridLines = 3
$Dialog.LoadState((Get-Random -Maximum 1000))
$Dialog.AddCategory("Versand")
$Dialog.AddField("Versandart@Versand", "+Combo", "Standard", "")
$Dialog.AddFieldItem("Versand", "Standard")
$Dialog.AddFieldItem("Versand", "Express")
$Dialog.AddFieldItem("Versand", "Abholung")
$Dialog.SetOption("Versand", "FIXED", 0)
$Dialog.AddField("Lieferdatum@Datum", "+Date", (Get-Date), "")
$Dialog.AddField("Anmerkung@Notiz", "+Memo", "", "Optionaler Hinweis")
$Dialog.SetOption("Notiz", "HEIGHT", 3)
$Dialog.AddCategory("Zahlung")
$Dialog.AddField("Zahlart@Zahl", "+Radio", 0, "")
$Dialog.AddFieldItem("Zahl", "Rechnung")
$Dialog.AddFieldItem("Zahl", "Vorkasse")
$Dialog.AddFieldItem("Zahl", "Nachnahme")
$Dialog.AddField("Rabatt@Rabatt", "+Track", 0, "Rabatt in Prozent")
if ($Dialog.Execute()) {
Write-Host "Versand: $($Dialog.Values('Versand'))"
Write-Host "Datum: $($Dialog.Values('Datum'))"
Write-Host "Zahlart: $($Dialog.Values('Zahl'))"
Write-Host "Rabatt: $($Dialog.Values('Rabatt'))%"
}
# Aufräumen -- COM-Objekte freigeben
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Dialog) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Client) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($App) | Out-Null
C. Dialog mit Drucken und Export #
VBScript:
Option Explicit
' EULANDA-Application instanzieren und Mandant aktivieren
Dim App, Client
Set App = CreateObject("Eulanda.Application")
Set Client = App.Clients(0) ' oder: App.Clients("MeinMandant")
Client.Active = True
Dim Dialog
Set Dialog = Client.CreateDialog("Eulanda.MultiDlg", "Report")
With Dialog
.Title = "Lagerbestand"
.Caption = "Lagerbestand"
.GridLines = 3
.PrintVisible = True
.ExportVisible = True
.ReportTitle = "Lagerbestand - Übersicht"
.ExportFileName = "Lagerbestand.xls"
.DateVisible = True
.PageNoVisible = True
.AddField "Artikel", "String", "Widget A", ""
.AddField "Bestand", "Integer", 150, ""
.AddField "Mindestbestand", "Integer", 50, ""
.Execute
End With
Set Dialog = Nothing
' Aufräumen
Set Client = Nothing
Set App = Nothing
JScript:
// EULANDA-Application instanzieren und Mandant aktivieren
var App = new ActiveXObject("Eulanda.Application");
var Client = App.Clients(0); // oder: App.Clients("MeinMandant")
Client.Active = true;
var Dialog = Client.CreateDialog("Eulanda.MultiDlg", "Report");
Dialog.Title = "Lagerbestand";
Dialog.Caption = "Lagerbestand";
Dialog.GridLines = 3;
Dialog.PrintVisible = true;
Dialog.ExportVisible = true;
Dialog.ReportTitle = "Lagerbestand - Übersicht";
Dialog.ExportFileName = "Lagerbestand.xls";
Dialog.DateVisible = true;
Dialog.PageNoVisible = true;
Dialog.AddField("Artikel", "String", "Widget A", "");
Dialog.AddField("Bestand", "Integer", 150, "");
Dialog.AddField("Mindestbestand", "Integer", 50, "");
Dialog.Execute();
// Aufräumen
Dialog = null;
Client = null;
App = null;
PowerShell:
# EULANDA-Application instanzieren und Mandant aktivieren
$App = New-Object -ComObject "Eulanda.Application"
$Client = $App.Clients(0) # oder: $App.Clients("MeinMandant")
$Client.Active = $true
$Dialog = $Client.CreateDialog("Eulanda.MultiDlg", "Report")
$Dialog.Title = "Lagerbestand"
$Dialog.Caption = "Lagerbestand"
$Dialog.GridLines = 3
$Dialog.PrintVisible = $true
$Dialog.ExportVisible = $true
$Dialog.ReportTitle = "Lagerbestand - Übersicht"
$Dialog.ExportFileName = "Lagerbestand.xls"
$Dialog.DateVisible = $true
$Dialog.PageNoVisible = $true
$Dialog.AddField("Artikel", "String", "Widget A", "")
$Dialog.AddField("Bestand", "Integer", 150, "")
$Dialog.AddField("Mindestbestand", "Integer", 50, "")
$Dialog.Execute() | Out-Null
# Aufräumen -- COM-Objekte freigeben
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Dialog) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Client) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($App) | Out-Null
D. Einfacher Dialog mit Farbauswahl #
VBScript:
Option Explicit
' EULANDA-Application instanzieren und Mandant aktivieren
Dim App, Client
Set App = CreateObject("Eulanda.Application")
Set Client = App.Clients(0) ' oder: App.Clients("MeinMandant")
Client.Active = True
Dim Dialog
Set Dialog = Client.CreateDialog("Eulanda.MultiDlg", "")
With Dialog
.Title = "Einstellungen"
.SubTitle = "Konfiguration anpassen"
.GridLines = 3
.AddField "Name", "String", "", ""
.AddField "Alter", "Integer", 30, ""
.AddField "Farbe", "Color", 0, "Lieblingsfarbe"
.SetOption "Farbe", "COLORSET", "HTML"
If .Execute Then
MsgBox "Name: " & .Values("Name") & vbCrLf & _
"Alter: " & CStr(.Values("Alter"))
End If
End With
Set Dialog = Nothing
' Aufräumen
Set Client = Nothing
Set App = Nothing
JScript – JScript kennt kein MsgBox, daher Ausgabe über WScript.Echo (cscript/wscript bzw. VbsEdit):
// EULANDA-Application instanzieren und Mandant aktivieren
var App = new ActiveXObject("Eulanda.Application");
var Client = App.Clients(0); // oder: App.Clients("MeinMandant")
Client.Active = true;
var Dialog = Client.CreateDialog("Eulanda.MultiDlg", "");
Dialog.Title = "Einstellungen";
Dialog.SubTitle = "Konfiguration anpassen";
Dialog.GridLines = 3;
Dialog.AddField("Name", "String", "", "");
Dialog.AddField("Alter", "Integer", 30, "");
Dialog.AddField("Farbe", "Color", 0, "Lieblingsfarbe");
Dialog.SetOption("Farbe", "COLORSET", "HTML");
if (Dialog.Execute()) {
WScript.Echo("Name: " + Dialog.Values("Name") +
"\nAlter: " + Dialog.Values("Alter"));
}
// Aufräumen
Dialog = null;
Client = null;
App = null;
PowerShell:
# EULANDA-Application instanzieren und Mandant aktivieren
$App = New-Object -ComObject "Eulanda.Application"
$Client = $App.Clients(0) # oder: $App.Clients("MeinMandant")
$Client.Active = $true
$Dialog = $Client.CreateDialog("Eulanda.MultiDlg", "")
$Dialog.Title = "Einstellungen"
$Dialog.SubTitle = "Konfiguration anpassen"
$Dialog.GridLines = 3
$Dialog.AddField("Name", "String", "", "")
$Dialog.AddField("Alter", "Integer", 30, "")
$Dialog.AddField("Farbe", "Color", 0, "Lieblingsfarbe")
$Dialog.SetOption("Farbe", "COLORSET", "HTML")
if ($Dialog.Execute()) {
Write-Host "Name: $($Dialog.Values('Name'))"
Write-Host "Alter: $($Dialog.Values('Alter'))"
}
# Aufräumen -- COM-Objekte freigeben
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Dialog) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Client) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($App) | Out-Null
E. Felder in einer Zeile gruppieren #
VBScript:
Option Explicit
' EULANDA-Application instanzieren und Mandant aktivieren
Dim App, Client
Set App = CreateObject("Eulanda.Application")
Set Client = App.Clients(0) ' oder: App.Clients("MeinMandant")
Client.Active = True
Dim Dialog
Set Dialog = Client.CreateDialog("Eulanda.MultiDlg", "")
With Dialog
.Title = "Adresse"
.GridLines = 3
.AddField "Vorname", "Name.String", "", ""
.AddField "Nachname", "Name.String", "", ""
.AddField "PLZ", "Ort.String", "", ""
.AddField "Stadt", "Ort.String", "", ""
.Execute
End With
Set Dialog = Nothing
' Aufräumen
Set Client = Nothing
Set App = Nothing
JScript:
// EULANDA-Application instanzieren und Mandant aktivieren
var App = new ActiveXObject("Eulanda.Application");
var Client = App.Clients(0); // oder: App.Clients("MeinMandant")
Client.Active = true;
var Dialog = Client.CreateDialog("Eulanda.MultiDlg", "");
Dialog.Title = "Adresse";
Dialog.GridLines = 3;
Dialog.AddField("Vorname", "Name.String", "", "");
Dialog.AddField("Nachname", "Name.String", "", "");
Dialog.AddField("PLZ", "Ort.String", "", "");
Dialog.AddField("Stadt", "Ort.String", "", "");
Dialog.Execute();
// Aufräumen
Dialog = null;
Client = null;
App = null;
PowerShell:
# EULANDA-Application instanzieren und Mandant aktivieren
$App = New-Object -ComObject "Eulanda.Application"
$Client = $App.Clients(0) # oder: $App.Clients("MeinMandant")
$Client.Active = $true
$Dialog = $Client.CreateDialog("Eulanda.MultiDlg", "")
$Dialog.Title = "Adresse"
$Dialog.GridLines = 3
$Dialog.AddField("Vorname", "Name.String", "", "")
$Dialog.AddField("Nachname", "Name.String", "", "")
$Dialog.AddField("PLZ", "Ort.String", "", "")
$Dialog.AddField("Stadt", "Ort.String", "", "")
$Dialog.Execute() | Out-Null
# Aufräumen -- COM-Objekte freigeben
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Dialog) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Client) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($App) | Out-Null
Felder mit demselben Gruppennamen (hier Name und Ort) werden in einer Zeile nebeneinander dargestellt.
F. Externer Zugriff über COM #
Wenn ein VBScript außerhalb der EULANDA-Anwendung läuft, wird die Eulanda.Application über COM instanziert. Sie sucht die registrierten Mandanten (UDL-Dateien) selbst zusammen; ein Mandant wird über die Clients-Auflistung gewählt – nach Index (Clients(0)) oder nach UDL-Alias (Clients("MeinMandant")) – und über Active = True aktiviert:
VBScript:
Option Explicit
Dim App, Client
' EULANDA-Application instanzieren und Mandant aktivieren
Set App = CreateObject("Eulanda.Application")
Set Client = App.Clients(0) ' oder: App.Clients("MeinMandant")
Client.Active = True
' Dialog wie gewohnt verwenden
Dim Dialog
Set Dialog = Client.CreateDialog("Eulanda.MultiDlg", "")
With Dialog
.Title = "Externer Zugriff"
.SubTitle = "Dialog wird von externem VBScript aufgerufen"
.GridLines = 3
.AddField "Bemerkung", "String", "", ""
.AddField "Datum", "Date", Now, ""
If .Execute Then
MsgBox "Eingabe: " & .Values("Bemerkung")
End If
End With
Set Dialog = Nothing
' Aufräumen
Set Client = Nothing
Set App = Nothing
JScript:
// EULANDA-Application instanzieren und Mandant aktivieren
var App = new ActiveXObject("Eulanda.Application");
var Client = App.Clients(0); // oder: App.Clients("MeinMandant")
Client.Active = true;
// Dialog wie gewohnt verwenden
var Dialog = Client.CreateDialog("Eulanda.MultiDlg", "");
Dialog.Title = "Externer Zugriff";
Dialog.SubTitle = "Dialog wird von externem JScript aufgerufen";
Dialog.GridLines = 3;
Dialog.AddField("Bemerkung", "String", "", "");
Dialog.AddField("Datum", "Date", new Date().getVarDate(), ""); // getVarDate() liefert ein COM-Datum (VT_DATE)
if (Dialog.Execute()) {
WScript.Echo("Eingabe: " + Dialog.Values("Bemerkung"));
}
// Aufräumen
Dialog = null;
Client = null;
App = null;
PowerShell: Für PowerShell ist dieser externe Zugriff der Normalfall und verwendet exakt dasselbe Muster. Einen bestimmten Mandanten wählt man über seinen UDL-Alias statt über den Index: $App.Clients('MeinMandant'). Einen Pfad zu einer einzelnen .udl-Datei nimmt das COM-Objekt nicht entgegen – es kennt nur die bereits registrierten Mandanten.
# EULANDA-Application instanzieren und Mandant aktivieren
$App = New-Object -ComObject "Eulanda.Application"
$Client = $App.Clients(0) # oder: $App.Clients("MeinMandant")
$Client.Active = $true
# Dialog wie gewohnt verwenden
$Dialog = $Client.CreateDialog("Eulanda.MultiDlg", "")
$Dialog.Title = "Externer Zugriff"
$Dialog.SubTitle = "Dialog wird von externem PowerShell aufgerufen"
$Dialog.GridLines = 3
$Dialog.AddField("Bemerkung", "String", "", "")
$Dialog.AddField("Datum", "Date", (Get-Date), "")
if ($Dialog.Execute()) {
Write-Host "Eingabe: $($Dialog.Values('Bemerkung'))"
}
# Aufräumen -- COM-Objekte freigeben
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Dialog) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Client) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($App) | Out-Null
Hinweis: Für den externen Zugriff muss EULANDA® auf dem System installiert und mindestens ein Mandant (UDL-Datei) eingerichtet sein. Die Eulanda.Application-Klasse stellt die Mandanten über die Clients-Auflistung bereit (Clients(0) nach Index, Clients("Alias") nach UDL-Alias, dazu ClientCount und RefreshClients). Der gewählte und über Active = True aktivierte Mandant liefert dann CreateDialog und die übrigen Objekte.
G. Hilfe-Button mit externer Doku #
Seit MinorVersion 4 blendet HelpUrl einen zusätzlichen „Hilfe"-Button links neben Drucken/Exportieren ein. Ein Klick öffnet die URL im Standardbrowser (Edge, Chrome, Firefox) – nicht im eingebetteten WebView. Damit sind Browser-Features wie Zoom, Bookmarks und Tabs verfügbar, und moderne Doku-Seiten (Hugo, Docusaurus etc.) rendern zuverlässig in allen EULANDA-Versionen – auch wo der eingebettete Browser noch auf IE-Engine basiert.
HelpUrl ist eine Alternative zum Property Help, das den Hilfe-Inhalt im Dialog selbst einbettet und den Feldbereich verkleinert. Beide lassen sich kombinieren.
VBScript:
Option Explicit
' EULANDA-Application instanzieren und Mandant aktivieren
Dim App, Client
Set App = CreateObject("Eulanda.Application")
Set Client = App.Clients(0) ' oder: App.Clients("MeinMandant")
Client.Active = True
Dim Dialog
Set Dialog = Client.CreateDialog("Eulanda.MultiDlg", "")
With Dialog
.Title = "Einstellungen XRechnung"
.SubTitle = "Konfiguration des XFacture-Plugins"
.IconUrl = "gearwheel"
.GridLines = 3
.HelpUrl = "https://doc.eulanda.eu/de/docs/PlugIn-Module/Zugferd-XRechnung/Einstellungen-System/"
' Optional: Button-Beschriftung anpassen
' .HelpCaption = "Online-Doku"
.AddField "Aktiv@Active", "Boolean", True, "Plugin aktivieren"
.AddField "Pfad@OutPath", "String", "C:\Export", "Zielordner"
If .Execute Then
MsgBox "Aktiv: " & .Values("Active") & vbCrLf & _
"Pfad: " & .Values("OutPath")
End If
End With
Set Dialog = Nothing
' Aufräumen
Set Client = Nothing
Set App = Nothing
JScript:
// EULANDA-Application instanzieren und Mandant aktivieren
var App = new ActiveXObject("Eulanda.Application");
var Client = App.Clients(0); // oder: App.Clients("MeinMandant")
Client.Active = true;
var Dialog = Client.CreateDialog("Eulanda.MultiDlg", "");
Dialog.Title = "Einstellungen XRechnung";
Dialog.SubTitle = "Konfiguration des XFacture-Plugins";
Dialog.IconUrl = "gearwheel";
Dialog.GridLines = 3;
Dialog.HelpUrl = "https://doc.eulanda.eu/de/docs/PlugIn-Module/Zugferd-XRechnung/Einstellungen-System/";
// Optional: Button-Beschriftung anpassen
// Dialog.HelpCaption = "Online-Doku";
Dialog.AddField("Aktiv@Active", "Boolean", true, "Plugin aktivieren");
Dialog.AddField("Pfad@OutPath", "String", "C:\\Export", "Zielordner");
if (Dialog.Execute()) {
WScript.Echo("Aktiv: " + Dialog.Values("Active") + "\n" +
"Pfad: " + Dialog.Values("OutPath"));
}
// Aufräumen
Dialog = null;
Client = null;
App = null;
PowerShell:
# EULANDA-Application instanzieren und Mandant aktivieren
$App = New-Object -ComObject "Eulanda.Application"
$Client = $App.Clients(0) # oder: $App.Clients("MeinMandant")
$Client.Active = $true
$Dialog = $Client.CreateDialog("Eulanda.MultiDlg", "")
$Dialog.Title = "Einstellungen XRechnung"
$Dialog.SubTitle = "Konfiguration des XFacture-Plugins"
$Dialog.IconUrl = "gearwheel"
$Dialog.GridLines = 3
$Dialog.HelpUrl = "https://doc.eulanda.eu/de/docs/PlugIn-Module/Zugferd-XRechnung/Einstellungen-System/"
# Optional: Button-Beschriftung anpassen
# $Dialog.HelpCaption = "Online-Doku"
$Dialog.AddField("Aktiv@Active", "Boolean", $true, "Plugin aktivieren")
$Dialog.AddField("Pfad@OutPath", "String", 'C:\Export', "Zielordner")
if ($Dialog.Execute()) {
Write-Host "Aktiv: $($Dialog.Values('Active'))"
Write-Host "Pfad: $($Dialog.Values('OutPath'))"
}
# Aufräumen -- COM-Objekte freigeben
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Dialog) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Client) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($App) | Out-Null
H. Forward-Compatible mit älteren EULANDA-Versionen #
Plugins, die HelpUrl nutzen aber auch auf älteren EULANDA-Installationen laufen sollen, prüfen entweder MinorVersion oder fangen die Zuweisung per On Error Resume Next ab. Beide Pattern liefern den Hilfe-Button auf neuer EULANDA und sind auf alter EULANDA unauffällige No-Ops.
Variante 1 – MinorVersion-Check (empfohlen, Eulanda-Konvention):
VBScript:
Option Explicit
' EULANDA-Application instanzieren und Mandant aktivieren
Dim App, Client
Set App = CreateObject("Eulanda.Application")
Set Client = App.Clients(0) ' oder: App.Clients("MeinMandant")
Client.Active = True
Dim Dialog
Set Dialog = Client.CreateDialog("Eulanda.MultiDlg", "")
With Dialog
.Title = "Einstellungen"
.GridLines = 3
' Hilfe-Button nur setzen wenn MultiDlg neu genug -- sonst silently ignoriert
If .MinorVersion >= 4 Then
.HelpUrl = "https://doc.eulanda.eu/"
End If
.AddField "Wert", "String", "", ""
.Execute
End With
Set Dialog = Nothing
' Aufräumen
Set Client = Nothing
Set App = Nothing
JScript:
// EULANDA-Application instanzieren und Mandant aktivieren
var App = new ActiveXObject("Eulanda.Application");
var Client = App.Clients(0); // oder: App.Clients("MeinMandant")
Client.Active = true;
var Dialog = Client.CreateDialog("Eulanda.MultiDlg", "");
Dialog.Title = "Einstellungen";
Dialog.GridLines = 3;
// Hilfe-Button nur setzen wenn MultiDlg neu genug -- sonst stillschweigend ausgelassen
if (Dialog.MinorVersion >= 4) {
Dialog.HelpUrl = "https://doc.eulanda.eu/";
}
Dialog.AddField("Wert", "String", "", "");
Dialog.Execute();
// Aufräumen
Dialog = null;
Client = null;
App = null;
PowerShell (MinorVersion-Check):
# EULANDA-Application instanzieren und Mandant aktivieren
$App = New-Object -ComObject "Eulanda.Application"
$Client = $App.Clients(0) # oder: $App.Clients("MeinMandant")
$Client.Active = $true
$Dialog = $Client.CreateDialog("Eulanda.MultiDlg", "")
$Dialog.Title = "Einstellungen"
$Dialog.GridLines = 3
# Hilfe-Button nur setzen wenn MultiDlg neu genug -- in PowerShell mit () aufrufen (sonst Methoden-Objekt statt Zahl)
if ($Dialog.MinorVersion() -ge 4) {
$Dialog.HelpUrl = "https://doc.eulanda.eu/"
}
$Dialog.AddField("Wert", "String", "", "")
$Dialog.Execute() | Out-Null
# Aufräumen -- COM-Objekte freigeben
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Dialog) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Client) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($App) | Out-Null
Variante 2 – On Error Resume Next (kompakter, weniger explizit):
VBScript:
Option Explicit
' EULANDA-Application instanzieren und Mandant aktivieren
Dim App, Client
Set App = CreateObject("Eulanda.Application")
Set Client = App.Clients(0) ' oder: App.Clients("MeinMandant")
Client.Active = True
Dim Dialog
Set Dialog = Client.CreateDialog("Eulanda.MultiDlg", "")
On Error Resume Next
Dialog.HelpUrl = "https://doc.eulanda.eu/"
If Err.Number <> 0 And Err.Number <> 438 Then
On Error Goto 0
Err.Raise Err.Number, Err.Source, Err.Description ' echten Fehler durchreichen
End If
Err.Clear
On Error Goto 0
With Dialog
.Title = "Einstellungen"
.GridLines = 3
.AddField "Wert", "String", "", ""
.Execute
End With
Set Dialog = Nothing
' Aufräumen
Set Client = Nothing
Set App = Nothing
JScript – try/catch ist das Pendant zu On Error Resume Next:
// EULANDA-Application instanzieren und Mandant aktivieren
var App = new ActiveXObject("Eulanda.Application");
var Client = App.Clients(0); // oder: App.Clients("MeinMandant")
Client.Active = true;
var Dialog = Client.CreateDialog("Eulanda.MultiDlg", "");
try {
Dialog.HelpUrl = "https://doc.eulanda.eu/";
}
catch (e) {
// Eigenschaft nicht vorhanden (alte EULANDA) -- Zuweisung ignorieren
}
Dialog.Title = "Einstellungen";
Dialog.GridLines = 3;
Dialog.AddField("Wert", "String", "", "");
Dialog.Execute();
// Aufräumen
Dialog = null;
Client = null;
App = null;
PowerShell (try/catch): Das try/catch ist das PowerShell-Pendant zu On Error Resume Next. Eine alte EULANDA ohne HelpUrl wirft beim Zuweisen einen Fehler, der hier abgefangen wird.
# EULANDA-Application instanzieren und Mandant aktivieren
$App = New-Object -ComObject "Eulanda.Application"
$Client = $App.Clients(0) # oder: $App.Clients("MeinMandant")
$Client.Active = $true
$Dialog = $Client.CreateDialog("Eulanda.MultiDlg", "")
try {
$Dialog.HelpUrl = "https://doc.eulanda.eu/"
}
catch {
# Eigenschaft nicht vorhanden (alte EULANDA) -- Zuweisung ignorieren
}
$Dialog.Title = "Einstellungen"
$Dialog.GridLines = 3
$Dialog.AddField("Wert", "String", "", "")
$Dialog.Execute() | Out-Null
# Aufräumen -- COM-Objekte freigeben
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Dialog) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Client) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($App) | Out-Null
Err.Number = 438 ist konkret „Objekt unterstützt diese Eigenschaft oder Methode nicht" – alte EULANDA-Installationen ohne HelpUrl liefern genau diesen Fehler, andere Fehler werden weiterhin nach oben gereicht. Die MinorVersion-Variante ist im Quelltext selbstdokumentierend und Konvention in den cnsoft.modules.*-Plugins; die On Error-Variante ist handlicher wenn mehrere optionale Properties auf einmal probiert werden.
I. Aufruf aus dem Berichts-Designer (RAP/Pascal-Script) #
In den beiden Beispielen (VBScript und JScript) wird das jeweilige Script in das Ereignis ReportBeforePrint eingefügt. Im Berichts-Designer dazu auf der Lasche Berechnungen in Ansicht die Option Ereignisse anwählen und mit der rechten Maustaste auf dem Ereignis ReportBeforePrint die Funktion Neu wählen. Dort das Script wie bei den Beispielen einfügen. Der Editor gibt den Prozedurrumpf bereits vor; passen Sie das Script so an, dass es aussieht wie im jeweiligen Beispiel.
Im Berichts-Designer läuft Pascal-Script (RAP). Dort gibt es kein globales Client und keinen direkten MultiDlg – der Script-Code (VBScript oder JScript) wird über die RAP-Funktion ExecuteScript ausgeführt, der man ihn als String übergibt:
function ExecuteScript(var Report: TppReport; const Engine: String;
const Statement: String; HasResult: Boolean; var ResultMsg: String): Boolean;
| Parameter | Bedeutung |
|---|---|
Report | das eingebaute Report-Objekt des Berichts |
Engine | "VBScript" oder "JScript" |
Statement | der Script-Code als String |
HasResult | False = nur ausführen; True = als Ausdruck auswerten, Ergebnis als String in ResultMsg |
ResultMsg (var) | Bei HasResult=True das Ergebnis des ausgewerteten Ausdrucks (als String). Im Fehlerfall leer – den Fehler signalisiert nur der Rückgabewert False. |
| Rückgabe | True = erfolgreich, False = Fehler |
Innerhalb des Scripts steht kein globales Client zur Verfügung, sondern ein Context-Objekt. Der Mandant – und damit CreateDialog – wird über Context.Client erreicht. Zunächst die VBScript-Variante:
procedure ReportBeforePrint;
var
vbsDlg, ergebnis, msg: string;
begin
// 1) Dialog zeigen und den Wert in Context.UserVars ablegen (überlebt den 2. Aufruf)
vbsDlg :=
'Dim Dlg' + chr(13)+chr(10) +
'Set Dlg = Context.Client.CreateDialog("Eulanda.MultiDlg", "")' + chr(13)+chr(10) +
'Dlg.Title = "Aus dem Bericht"' + chr(13)+chr(10) +
'Dlg.GridLines = 3' + chr(13)+chr(10) +
'Dlg.AddField "Bemerkung", "String", "", ""' + chr(13)+chr(10) +
'Context.UserVars.Add "Bemerkung", ""' + chr(13)+chr(10) +
'If Dlg.Execute Then Context.UserVars.Add "Bemerkung", Dlg.Values("Bemerkung")' + chr(13)+chr(10) +
'Set Dlg = Nothing';
ergebnis := '';
if ExecuteScript(Report, 'VBScript', vbsDlg, False, msg) then
begin
// 2) Wert aus Context.UserVars zurückholen (HasResult=True wertet den Ausdruck aus)
ExecuteScript(Report, 'VBScript', 'Context.UserVars.Values("Bemerkung")', True, ergebnis);
ShowMessage('Eingabe: ' + ergebnis);
end
else
ShowMessage('Script-Fehler');
end;
VBScript kennt keinen Funktionsausdruck (IIFE) wie JScript; ein einzelner ExecuteScript-Aufruf mit HasResult = True kann den mehrzeiligen Dialog nicht zugleich ausführen und einen Wert liefern. Daher zwei Aufrufe mit Context.UserVars als Brücke: Aufruf 1 zeigt den Dialog und legt den Wert in Context.UserVars ab, Aufruf 2 liest ihn per HasResult = True zurück. Wichtig: Eine reine VBScript-Variable überlebt den zweiten Aufruf nicht (ExecuteScript führt jeden String über ExecuteStatement aus, dessen Variablen nicht erhalten bleiben) – Context und damit Context.UserVars schon, weil ExecuteScript dasselbe Context-Objekt je Bericht und Sprache wiederverwendet. Über Context stehen außerdem Context.Dataset (aktueller Berichtsdatensatz) und Context.Application bereit.
Dieselbe Logik als JScript (Engine = 'JScript'). JScript kennt kein MsgBox – den eingegebenen Wert holt man stattdessen in den Bericht zurück: Mit HasResult = True wertet ExecuteScript den Code als Ausdruck aus und legt das Ergebnis in ResultMsg ab. Dazu kapselt man die Dialog-Logik in einen sofort aufgerufenen Funktionsausdruck (IIFE), der den Wert returnt:
procedure ReportBeforePrint;
var
js, ergebnis: string;
begin
js :=
'(function() {' + chr(13)+chr(10) +
' var Dlg = Context.Client.CreateDialog("Eulanda.MultiDlg", "");' + chr(13)+chr(10) +
' Dlg.Title = "Aus dem Bericht";' + chr(13)+chr(10) +
' Dlg.GridLines = 3;' + chr(13)+chr(10) +
' Dlg.AddField("Bemerkung", "String", "", "");' + chr(13)+chr(10) +
' var s = "";' + chr(13)+chr(10) +
' if (Dlg.Execute()) s = Dlg.Values("Bemerkung");' + chr(13)+chr(10) +
' Dlg = null;' + chr(13)+chr(10) +
' return s;' + chr(13)+chr(10) +
'})()';
ergebnis := '';
// HasResult = True -> der Rückgabewert des Ausdrucks kommt in "ergebnis"
if ExecuteScript(Report, 'JScript', js, True, ergebnis) then
ShowMessage('Eingabe: ' + ergebnis);
end;
Den Rückgabewert (ergebnis) kann der Bericht dann weiterverwenden – anzeigen, in eine Variable oder ein Berichtsfeld schreiben. (Hinweis: Context.UserVars aus dem Script erreicht der RAP-Code nicht zurück; der saubere Rückkanal ist HasResult = True/ResultMsg.)
Als Engine sind nur VBScript und JScript möglich. ExecuteScript nutzt den MS Script Control (Active Scripting), und nur diese beiden Engines lassen sich darin hosten. PowerShell steht im Berichts-Designer nicht zur Verfügung – es ist kein Active-Scripting-Engine. PowerShell greift immer von außen auf EULANDA zu (siehe die PowerShell-Beispiele oben) und kann nicht im Bericht ausgeführt werden.
NativeFieldType #
NativeFieldType(Typ: String): String
Gibt den nativen Datentyp zurück, der einem Feldtyp zugrunde liegt. Beispiele: "Combo" liefert "String", "Time" liefert "DateTime", "Color" liefert "Integer".
StrToFilename #
StrToFilename(Text: String): String
Wandelt einen beliebigen String in einen gültigen Dateinamen um. Es dürfen keine Laufwerke, Pfadangaben oder Extensions enthalten sein – nur der reine Dateiname.
Integration in EULANDA #
Wenn ein MultiDlg-Script fertig entwickelt ist, kann es in der SQL-Registry unter ROOT\OBJECTS\Dataobjects\<Abschnitt>\Actions abgelegt werden. Dort lässt sich zusätzlich ein Menütitel, ein Icon sowie ein Tastenkürzel (Shortcut) eintragen. So wird der Dialog in die Werkzeugleiste, Menüs, Infosysteme oder Kurzinfosysteme integriert.
Über das Dataset-Objekt lässt sich der Dialog mit dem aktuellen Bildschirm-Datensatz synchronisieren. Werte die über den MultiDlg direkt in den SQL-Server geschrieben werden, lassen sich über Dataset.RefreshCurrent nach dem Schließen des Dialogs in der Hauptmaske sichtbar machen.
Farbreferenz #
Der Feldtyp Color kann über SetOption "FeldName", "COLORSET", "..." mit verschiedenen Farbpaletten geladen werden. Zusätzlich können über AddFieldItem benutzerdefinierte Farben als "FarbName;Anzeigename" hinzugefügt werden.
Verfügbare ColorSets #
| ColorSet | Beschreibung |
|---|---|
"DELPHI" | Standard-Farben (16 Grundfarben) |
"USER" | Benutzerdefinierte Farben (via AddFieldItem) |
"HTML" | Netscape/HTML-Farben (140+ benannte Farben) |
"X11" | X11-Farben (alphabetisch) |
"X11SORT" | X11-Farben (nach Farbton sortiert) |
Standard-Farben (DELPHI) #
Black, Maroon, Green, Olive, Navy, Purple, Teal, Gray, Silver, Red, Lime, Yellow, Blue, Fuchsia, Aqua, White, MoneyGreen, SkyBlue, Cream, MedGray.
Absolute Farben #
Farben können auch als Hexadezimalwert angegeben werden: #RRGGBB. Beispiele: #FFFFFF = Weiß, #000000 = Schwarz, #FF0000 = Rot.
.AddField "Farbe", "Color", 0, ""
.SetOption "Farbe", "ColorSet", "User"
.AddFieldItem "Farbe", "#FF6600;Mein Orange"
.AddFieldItem "Farbe", "Red;Standardrot"
Dialogaufbau #
graph TB
Top["Kopfbereich
Title · SubTitle · IconUrl"]
Grid["Vertikales Property-Grid
Felder · Kategorien · Unterfelder"]
HelpArea["Hilfebereich
optional, wenn .Help gesetzt -- eingebetteter WebView"]
Btns["Button-Zeile
[Hilfe] [Drucken] [Export] ... [Löschen] [Übernehmen] [Verwerfen]"]
Top --> Grid
Grid --> HelpArea
HelpArea --> Btns
style Top fill:#2e86c1,color:#fff
style Grid fill:#27ae60,color:#fff
style HelpArea fill:#e67e22,color:#fff
style Btns fill:#8e44ad,color:#fff
Der „Hilfe"-Button auf der linken Seite ist nur sichtbar, wenn HelpUrl gesetzt ist. Drucken/Export erscheinen je nach PrintVisible/ExportVisible. Der Hilfebereich (eingebetteter WebView) wird durch Help bzw. HtmlHelp aktiviert und ist unabhängig vom HelpUrl-Button.
Siehe auch #
- Client.CreateDialog - Dialoge erstellen
- MultiSelect-Dialog - Mehrfachauswahl-Dialog
- Mail-Objekt - E-Mail-Versand