Multi Dlg
Zuletzt geändert: 28.06.2026 14:37

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 #

EigenschaftTypStandardBeschreibung
TitleStringTitel im Kopfbereich (groß, fett)
SubTitleStringUntertitel im Kopfbereich
CaptionString"Eingabedialog"Fenstertitel in der Titelleiste
IconUrlStringSymbol im Kopfbereich (z.B. "folder", "gearwheel")
GridLinesInteger0Gitterlinien (siehe Konstanten)
HeightIntegerautoDialoghöhe in Zeilen (je 18 Pixel)
HelpStringHTML-Hilfe oder URL im unteren Bereich (eingebetteter WebView)
HtmlHelpStringAlias für Help
HtmlHelpHeightInteger0Höhe des Hilfebereichs in Pixeln
HelpUrlStringExterne URL für „Hilfe"-Button, öffnet im Standardbrowser (seit MinorVersion 4)
HelpCaptionString"Hilfe"Beschriftung des „Hilfe"-Buttons (seit MinorVersion 4)
ExplorerStyleBooleanFalseExplorer-Stil für Kategorien
DotNetStyleBooleanFalseDotNet-Darstellung
FlowStyleBooleanFalseBand-Layout (mehrere Spalten)
MajorVersionInteger2Hauptversion (nur lesen)
MinorVersionInteger4Nebenversion (nur lesen)
DeletePressedBooleanFalseTrue wenn Löschen gedrückt wurde (nur lesen)

Button-Eigenschaften #

EigenschaftTypStandardBeschreibung
OkVisibleBooleanTrueOK-Button anzeigen
OkCaptionString"Übernehmen"Beschriftung OK-Button
CancelVisibleBooleanTrueAbbrechen-Button anzeigen
CancelCaptionString"Verwerfen"Beschriftung Abbrechen-Button
DeleteVisibleBooleanFalseLöschen-Button anzeigen
DeleteCaptionString"Löschen"Beschriftung Löschen-Button
PrintVisibleBooleanFalseDrucken-Button anzeigen
PrintCaptionString"Drucken"Beschriftung Drucken-Button
PrintPreviewVisibleBooleanFalseVorschau im Kontextmenü
PrintPreviewCaptionString"Vorschau"Beschriftung Vorschau
ExportVisibleBooleanFalseExport-Button anzeigen
ExportCaptionString"Exportieren"Beschriftung Export-Button

Druck- und Export-Eigenschaften #

EigenschaftTypStandardBeschreibung
ReportTitleString(= Caption)Titel im Druckbericht
PrintJobTitleString(= Caption)Name des Druckauftrags
ExportFileNameStringDesktop + Caption + .xlsStandard-Dateiname für Excel-Export
UserNameVisibleBooleanFalseBenutzername im Druckkopf anzeigen
DateVisibleBooleanTrueDatum im Druckkopf anzeigen
PageNoVisibleBooleanTrueSeitenzahlen im Druckfuß anzeigen

Methoden #

MethodeRückgabeBeschreibung
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)VariantFeldwert lesen
SetHints(Name, Text)Tooltip setzen
Hints(Name)StringTooltip lesen
ExecuteBooleanDialog anzeigen (True = OK)
LoadState(Version)Gespeicherten Zustand laden
SaveStateAktuellen Zustand speichern
ExpandAllAlle Kategorien aufklappen
CollapseAllAlle Kategorien zuklappen
ClearAlle Felder entfernen
SampleDemo-Daten einfügen
AddHandler(Handler)Event-Handler registrieren
NativeFieldType(Typ)StringNativen Datentyp eines Feldtyps ermitteln
StrToFilename(Text)StringText in gültigen Dateinamen umwandeln

Feldtypen #

Der zweite Parameter von AddField bestimmt den Typ des Eingabefeldes.

Standard-Typen #

TypWert in VBSEditorBeschreibung
"String"StringTexteingabeEinzeiliger Text
"Memo"StringMehrzeiligMehrzeiliger Text (Blob-Editor)
"Integer"IntegerZahleneingabeGanzzahl
"Float"DoubleDezimaleingabeDezimalzahl (2 Nachkommastellen)
"Currency"CurrencyWährungWährungsbetrag
"Calc"DoubleTaschenrechnerZahl mit Rechner-Popup
"Boolean"BooleanCheckboxWahr/Falsch
"DateTime"DateKalender + UhrDatum und Uhrzeit
"Date"DateKalenderNur Datum (mit Kalenderwochen)
"Time"DateZeiteingabeNur Uhrzeit
"Combo"StringDropdownAuswahlliste (siehe AddFieldItem)
"Radio"IntegerRadiogruppeOptionsschalter (0-basiert)
"Spin"IntegerDrehfeldZahl mit Hoch/Runter-Buttons
"Track"IntegerSchiebereglerSlider (Standard: 0-100)
"Color"IntegerFarbauswahlFarbwähler mit Palette
"Font"StringSchriftauswahlDropdown mit Schriftarten
"Shell"StringOrdnerauswahlDatei-/Ordner-Browser
"Image"VariantBildfeldBild-Anzeige und -Auswahl

Typ-Modifikatoren (Prefix) #

Feldtypen können mit Präfixen kombiniert werden:

PräfixSyntaxBeschreibung
+"+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)
ParameterBeschreibung
NameFeldname (oder "Anzeige@Schlüssel")
TypFeldtyp (siehe Tabelle oben), optional mit Präfix
DefaultVorgabewert (Null für leer)
HintTooltip-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:

OptionGilt fürWertBeschreibung
"FIXED"ComboDropdown nicht editierbar
"EDIT"ComboDropdown editierbar (Freitext möglich)
"READONLY"Alle1/0Schreibschutz
"HEIGHT"AlleIntegerZeilenhöhe (Vielfaches von 17px)
"HIDEFIELDNAME"Alle1/0Feldbezeichnung ausblenden
"DECIMALS"Float, CalcIntegerNachkommastellen: 0 = keine, 1-6 = fest, >6 = Fließkomma
"SEPARATOR"Float, Calc, Integer1/0Tausendertrennzeichen (Standard: 1 = aktiv)
"COLORSET"ColorStringFarbpalette ("DELPHI", "HTML", "X11")
"INLINE"ImageBild in Originalgröße anzeigen
"ICON"ImageBild als Symbol anzeigen
"EXPAND"KategorieKategorie aufklappen
"COLLAPSE"KategorieKategorie 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 #

WertRAP-KonstanteBeschreibung
0vglNoneKeine Gitterlinien
1vglHorizontalNur horizontal
2vglVerticalNur vertikal
3vglBothHorizontal 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:

EreignisAuslöserBeschreibung
Dialog_OnConnectNach Erstellung, vor AnzeigeInitialisierung
Dialog_OnDisconnectNach SchließenAufrä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

JScripttry/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;
ParameterBedeutung
Reportdas eingebaute Report-Objekt des Berichts
Engine"VBScript" oder "JScript"
Statementder Script-Code als String
HasResultFalse = 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ückgabeTrue = 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 #

ColorSetBeschreibung
"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 #