Programmierung

Flexible Meldungsfenster

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
Informationsmeldung mit Ersetzungstext
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
Warnungsmeldung mit Abbrechen-, Wiederholen- und Ignorieren-Schaltfläche
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
Fehlermeldung mit links ausgerichtetem Text
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
Bestätigungsmeldung mit Nein-Schaltfläche als Standardschaltfläche
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
Abfragemeldung mit ungültiger Eingabe
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
Angepasste Meldung mit Listenobjekt und eigner Schaltfläche
// 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.

Download

Zum downloaden hier klicken SysMsg.zip (65.03 KB)
Sie müssen angemeldet sein, um die Datei herunterladen zu können.

2 Kommentare

2 Kommentare “Flexible Meldungsfenster”

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

Kommentar abgeben