Keine Applikation kommt ohne Meldungsfenster (auch Message-Boxen oder Dialogboxen genannt) aus. Sei es um den Anwender zu informieren, seine Bestätigung einzuholen oder eine Entscheidung zu erfragen.
Im Rahmen eigener Entwicklungen haben wir ein Modul zur flexiblen Programmierung von Meldungsfenstern umgesetzt, das ich Ihnen in diesem Artikel vorstellen möchte.
Vorteile
Dialogboxen können in CONZEPT 16 bereits mit der Funktion WinDialogBox()
angezeigt werden. Das am Ende des Artikels als Download angehängte Modul SysMsg bietet gegenüber dieser Funktion einige Vorteile:
- Platzhalter
Im Titel und Text können Platzhalter verwendet werden, die durch Ersetzungstexte und Steuerzeichen ersetzt werden. Beispiele:
„\1
“ – 1. Ersetzungstext
„\n
“ – Zeilenumbruch
„\t
“ – Tabulator - Textausrichtung
Der Meldungstext kann links, rechts oder zentriert und oben, unten oder mittig ausgerichtet werden. - Vergrößerbar
Das Meldungsfenster kann vom Anwender vergrößert werden. - Lokalisierbarkeit
Die Schaltflächenbeschriftungen können in verschiedenen Sprachen angezeigt werden. - Abfragemeldungen
Das Meldungsfenster kann den Anwender zur Eingabe einer Zeichenkette oder einer Zahl auffordern, die während der Eingabe validiert werden kann. - Eigene Objekte
Dem Meldungsfenster können eigene Objekte hinzugefügt werden. - Eigene Schaltflächen
Dem Meldungsfenster können eigene Schaltflächen hinzugefügt werden.
Beispiele
Information
SysMsg:Msg.Info(
'Verzeichnis leeren', // Titel
'Das Verzeichnis "\1" wurde erfolgreich geleert.', // Text
_Msg.Escape | _Msg.SoundNone, // Optionen
0, // Übergeordnetes Fenster
'MyDir' // 1. Ersetzungstext
);
Warnung
switch (SysMsg:Msg.Warn(
'Datei speichern', // Titel
'Eine Datei mit dem Namen "\1" ist bereits vorhanden.', // Text
_Msg.Escape | _Msg.ButtonsAbortRetryIgnore, // Optionen
0, // Übergeordnetes Fenster
'MyFile.txt' // 1. Ersetzungstext
))
{
// Abbrechen (Beenden)
case _Msg.IDAbort : { /*...*/ }
// Wiederholen
case _Msg.IDRetry : { /*...*/ }
// Ignorieren
case _Msg.IDIgnore : { /*...*/ }
}
Fehler
SysMsg:Msg.Error(
'Datei importieren', // Titel
'Die Datei "\1" konnte nicht importiert werden.\n' +
'Beim Lesen des XML-Dokumentes ist ein Fehler aufgetreten:\n' +
'\n' +
'Fehler\t: \2' +
'Zeile\t: \3\n' +
'Spalte\t: \4', // Text
_Msg.Escape | _Msg.TextAlignLeft, // Optionen
0, // Übergeordnetes Fenster
'MyFile.xml', // 1. Ersetzungstext
XMLError(_XMLErrorText), // 2. Ersetzungstext
XMLError(_XMLErrorLine), // 3. Ersetzungstext
XMLError(_XmlErrorColumn) // 4. Ersetzungstext
);
Bestätigung
if (SysMsg:Msg.Confirm(
'Datei löschen', // Titel
'Soll die Datei "\1" wirklich gelöscht werden?\n' +
'\n' +
'Typ\t\t: \2\n' +
'Größe\t\t: \3\n' +
'Änderungsdatum\t: \4', // Text
_Msg.Escape | _Msg.TextAlignLeft | _Msg.ButtonDefault2 | _Msg.Closable, // Optionen
0, // Übergeordnetes Fenster
'MyFile.txt', // 1. Ersetzungstext
'XML-Dokument', // 2. Ersetzungstext
'23,11 KB', // 3. Ersetzungstext
'Mo., 3. Feb. 2014, 15:46 Uhr' // 4. Ersetzungstext
// Ja
) = _Msg.IDYes)
{
// ...
}
Abfrage
if (SysMsg:Msg.PromptAlpha(
var tName, // Wert
'Verzeichnis umbenennen', // Titel
'Name:', // Text
0, // Übergeordnetes Fenster
0, // Optionen
'', '', '', '', '', '', '', '', // Ersetzungstexte
__PROC__ + ':PromptValidate' // Validierungsfunktion
// OK
) = _Msg.IDOK)
{
// ...
}
Angepasste Meldung
// Meldung konfigurieren
SysMsg:Msg.Config(
'Verzeichnis exportieren', // Titel
'Das Verzeichnis "\1" konnte nicht vollständig exportiert werden.\n' +
'Folgende Fehler sind aufgetreten:', // Text
_Msg.Escape | _Msg.IconError | _Msg.TextAlignLeft | _Msg.Resizable | _Msg.ButtonsNone, // Optionen
0, // Übergeordnetes Fenster
'MyDir' // 1. Ersetzungstext
);
// Schaltfläche erzeugen
tWinButton # SysMsg:Msg.ButtonCreate('Gefällt mir!', _Msg.IDOK);
tWinButton->wpDefault # true;
tWinButton->WinFocusSet();
// Textanordnung ändern
SysMsg:Msg.TextAlignGroupingSet(_WinAlignGroupingTop);
// Mindesthöhe erhöhen
SysMsg:Msg.HeightMinSet(120, true);
tWinDataList # WinCreate(_WinTypeDataList);
tWinDataList->wpTabStop # false;
tWinDataList->wpAlignMarginTop # 8;
tWinColumn # WinCreate(_WinTypeListColumn, '', 'Datei', tWinDataList);
tWinColumn->wpClmWidth # 120;
tWinColumn # WinCreate(_WinTypeListColumn, '', 'Fehler', tWinDataList);
tWinColumn->wpClmStretch # true;
tWinDataList->WinLstDatLineAdd('MyFile.xml');
tWinDataList->WinLstCellSet('Datei bereits vorhanden und gesperrt.', 2);
// ...
// Objekt hinzufügen
SysMsg:Msg.ObjectAdd(tWinDataList);
// Meldung anzeigen
SysMsg:Msg.Run();
tWinDataList->WinDestroy();
Fazit
Mit diesem Modul können Sie Meldungsfenster ganz nach Ihren Bedürfnissen gestalten. Im Quelltext lassen sich auch die Abstände und Farben individuell festlegen. Gerne können Sie das Modul ausprobieren und uns hier Rückmeldung geben =).
Hinweis: Zum ordnungsgemäßen Ausführen des Moduls, wird die Version 5.7.07 des CONZEPT 16-Clients vorausgesetzt.
2 Antworten
Ein wesentlicher Vorteil ist zum Beispiel, dass man die Zeichenketten "kontextunabhängig" als define oder in einer Übersetzungstabelle speichern kann. Also etwa "Das Verzeichnis ‚1‘ …" für die Deutsche Sprache und "The directory ‚1‘ …" für die Englische.
Was ist der Vorteil der Ersetzungstexte gegenüber dem Einfügen per String-Verkettung ?
Nur die Übersichtlichkeit ?