Erweiterte Dialoge

Standardmäßig bietet Ihnen VDP 3 verschiedene Möglichkeiten, um mit dem Benutzer zu interagieren:

1. Die Message()-Anweisung,

2. die Input()-Eingabeaufforderung und

3. den modalen Aufruf eines Formulars per ExecDialog().

 

Für die meisten Fälle reichen diese Dialoge vollkommen aus. Spezielle Aufgaben lassen sich mit Ihnen jedoch nur schwer bzw. gar nicht realisieren. Deshalb enthält die TDBDLGS.DLL fünf weitere Dialogformen:

1. Die ExtInput()-Box,

2. die SelectDlg()-Box und

3. die MultiSelectDlg()-Box zur Auswahl mehrere Optionen.

4. die ShowCalendar()-Funktion zur Auswahl von Datumsangaben.

5. die Progressbar-Fortschrittsanzeige.

Zum besseren Verständnis der Funktionsweise der Dialoge sollten Sie sich unbedingt den Quellcode im Modul DIALOGE.MOD des TDBTOOLS-Projektes ansehen.

ExtInput() - Die erweiterte Input-Box

Die ExtInput()-Box ist ein Dialog, der auf den ersten Blick dem Input-Fenster VDPs gleicht. Wenn Sie jedoch genauer hinsehen, dann erkennen Sie, daß sich z.B. die Eingabeaufforderung hier über drei Zeilen erstreckt. Sie haben außerdem die Möglichkeit eine Längenbeschränkung der Eingabe zu definieren; ein Datum benötigt nun mal nie mehr als zehn Zeichen. Auch in der Gestaltung von Passwort-Eingaben sind Sie freier, als mit dem Standard-Inputdialog.

siehe auch Procedure Demo_ExtInput im Toolbox-Projekt

Parameter:

ExtInput(cPrompt : string, cCaption : string, VAR cInput : string, nPassword : integer, nLen : integer) : integer

cPrompt enthält die Eingabeaufforderung, die sich auf bis zu vier Zeilen ausdehnen läßt. Mit cCaption bestimmen sie die Überschrift (=blauer Balken) der ExtInput-Box.Die Eingabe des Anwenders wird in cResult festgehalten; wenn Sie cResult vor Aufruf der ExtInput-Box befüllen, wird dieser Wert als Vorgabe verwendet.

Wichtig: cResult muss eine String-Variable sein, damit ExtInput einen Wert zurückliefern kann!

nPassword enthält den ASCII-Code des Zeichens, daß zur "Verdeckung der Eingabe" dient. Ist nPassword gleich 0, ist die Eingabe im Klartext lesbar, ansonsten steht anstelle jedes Zeichens das durch den ASCII-Code bestimmte Zeichen. Sinnvoll kann dies bei der Eingabe von Passwörten oder anderen geheimen Informationen sein.

Tip: Zum Ermitteln eines ASCII-Codes für ein bestimmtes Zeichen verwenden Sie am Besten die WinEASY Funktion Asc() (z.B. Asc("*"))

Das Ergebnis von ExtInput() ist 0 bei Bestätigung mit OK und 1 bei Drücken der Cancel-Schaltfläche.

SelectDlg() - Ein komfortabler Selektionsdialog

SelectDlg() erlaubt es dem Anwender eine von mehreren Optionen komfortabel auszuwählen. Die Anzahl der zur Auswahl stehenden Optionen ist theoretisch unbegrenzt, wird jedoch in der Praxis im Bereich von 2 bis 10 liegen.

Parameter:

SelectDlg(cOptions : string; nNumOptions : integer; cPrompt : string; cCaption : string; iPreset : integer) : integer

cOptions enthält die einzelnen Optionsbeschriftungen getrennt durch ein "#". In obigem Dialog wurde cOptions wie folgt befüllt:

cOptions := "Nie#Seltenst#Gelegentlich#Häufig#Regelmäßig#Täglich#"

nNumOptions enthält die Anzahl der in cOptions enthaltenen Optionen. Ist nNumOptions kleiner als die tatsächliche Anzahl Optionen in cOptions, so werden nur die Optionen 1 bis nNumOptions angezeigt; die übrigen werden nicht zur Auswahl bereitgestellt.

Wichtig: nNumOptions darf jedoch niemals mehr Optionen angeben als in cOptions enthalten.

cPrompt enthält den Text der Eingabeaufforderung und mit cCaption legen Sie die Fensterüberschrift fest.

Mit iPreset können Sie einen Vorgabewert übergeben.

Das Ergebnis von SelectDlg() ist ein Wert zwischen 1 und nNumOptions bei Bestätigung des Dialogs mit OK, oder 0 bei Abbruch.

MultiSelectDlg() - Ein komfortabler Selektionsdialog zur Auswahl mehrerer Optionen

Der MultiSelect-Dialog ist dem SelectDlg()-Dialog sehr ähnlich. Lediglich die Tatsache, daß Sie hier mehrere Optionen gleichzeitig auswählen können, macht ihn besonders interessant.

 

Parameter:

Der Aufruf von MultiSelectDlg() entspricht exakt dem von SelectDlg(). Lediglich der Rückgabewert ist komplett anders zu interpretieren.

MultiSelectDlg(cOptions : string; nNumOptions : integer; cPrompt : string; cCaption : string) : integer

cOptions enthält die einzelnen Optionen durch ein "#" voneinander getrennt und nNumOptions übergibt die Anzahl der darzustellenden Optionen (beginnend bei der ersten.).

Was das Handling von MultiSelectDlg() ein wenig komplizierter gestaltet ist die Auswertung der Selektion. Der Rückgabewert von MultiSelectDlg() errechnet sich nämlich aus der "binären Summe" der Auswahl. Lediglich bei Abbruch des Dialogs mit Cancel ist das Ergebnis gleich 65535 (d.h es kann max. 15 Auswahloptionen geben!).

Beispiel für Rückgabewerte

1 = 1. Option nur

2 = 2. Option

4 = 3. Option

64 = 7. Option

6 = 2. und 3. Option zugleich

11 = 1., 2. und 4. Option zugleich

usw.

Tip: Um nun herauszufinden, ob eine bestimmte Option ausgewählt wurde können Sie die WinEASY-Funktion TestBit() verwenden. Diese liefert 1 zurück, wenn die Option gesetzt wurde, sonst ist das Ergebnis gleich 0. Nähere Informationen zu TestBit finden Sie in der VDP-Hilfe.

ShowCalendar() - Der Kalender

Mit dem Kalender können Datumseingaben fehlerfrei von statten gehen, Sie als Entwickler brauchen keine Angst mehr vor ungültigen Eingaben des Anwenders haben. Außerdem macht der Toolboxkalender auch noch optisch einen professionellen Eindruck.

Sehen Sie sich auch das Beispiel im Toolbox-Projekt, Modul DIALOGE.MOD an.

Parameter:

Beim Aufruf von ShowCalendar() müssen Sie der Funktion eine String-Variable cDatum übergeben. Diese kann wahlweise mit einem Datumseintrag vorbelegt sein, muß es aber nicht. Wichtig ist nur, daß es sich dabei um eine Variable handelt, da in diese das Ergebnis (sprich das vom Anwender gewählte Datum) zurückgeschrieben wird. Mit cPrompt und cCaption bestimmen Sie die Fensterbeschriftung. Das Ergebnis der Funktion ist 1 bei Bestätigung mit OK, ansonsten 0.

ShowCalendar(VAR cDatum : string; cPrompt : string; cCaption : string) : integer

Progressbar - Die Fortschrittsanzeige

Mit der Progressbar stellt Ihnen die Toolbox 3 eine optisch ansprechende Darstellung des Arbeitsfortschritts zur Verfügung, mit der Sie Ihre Anwendungen aufpeppen können.

Die Steuerung ist denkbar einfach:

Übergeben Sie der Progressbar einfach den aktuellen Fortschritt in Prozent und die Beschriftung des Fensters.

 

ShowProgress()

Erstellt das Fenster bzw. aktualisiert dieses, wenn bereits vorhanden.

Parameter:

ShowProgress(nProgress : integer; cPrompt : string; cCaption : string; nMode : integer)

nProgress enthält den Prozentwert des Fortschritts (es gilt 0 <= nProgress <= 100). In cPrompt übergeben Sie den Beschriftungstext für die Fortschrittsanzeige, während cCaption den Titel des Fensters enthält.nMode hat in der aktuellen Version keine Bedeutung, wurde lediglich für geplante Erweiterungen reserviert. Geben Sie hier immer 0 an.

 

HideProgress()

Schließt das Fortschrittsfenster wieder.

Hinweis: Stellen Sie sicher, daß am Ende einer Funktion immer HideProgress aufgerufen wird, da die Fortschrittsanzeige sonst am Bildschirm stehen bleibt.

 

Zur Ermittlung des Fortschritts:

Nehmen wir an, Sie haben in Ihr Projekt eine Funktion eingebaut, die einmal wöchentlich alle Kundendaten als TXT-Datei auf Diskette sichert. Solange die Anzahl der Datensätze überschaubar bleibt (einige Dutzend, evtl. hunderte) reicht hier sicherlich ein kurzer Hinweis, vielleicht ein Bestätigungsdialog, vor Ausführung des Exports. Der Vorgang selbst dauert nur wenige Sekunden. Bei einigen Tausend oder gar Zehntausend Datensätzen ist es sicherlich sinnvoll, den Anwender über den Fortschritt der Aktion zu informieren, denn hier ist von Minuten oder gar Stunden auszugehen. Die Ungewißheit darüber, ob der Rechner noch "lebt" oder vielleicht längst "abgestürzt" ist, bringt viele Ungeduldige auf die Idee mal eben <STRG><ALT><Entf>, den Drei-Finger-Gruß, zu drücken. Das kann dann u.U. sogar zu inkonsistenden Daten führen. Verwenden Sie also am besten immer eine Fortschrittsanzeige, wenn Sie wissen, daß eine Aktion mehr Zeit in Anspruch nimmt.

Die Progressbar erwartet den Fortschritt in Prozent.

Beispiel zur Ermittlung des Prozentwertes:

Eine Tabelle soll zwecks Datensicherung komplett in eine Textdatei exportiert werden. Angenommen in der Tabelle befinden sich 3432 Kundendatensätze. Jetzt gilt es zu ermitteln, wieviele Datensätze einem Prozent entsprechen:

100% -> FileSize(TABELLE) = 3432

1% -> 3432 DIV 100 = 34

Es müssen also je 34 Datensätze exportiert werden, damit sich der Fortschrittsbalken um ein Prozent erhöht.

Als kleines Beispiel zur Veranschaulichung der Funktionsweise dient Ihnen die Procedure Demo_Progressbar im Toolbox-Projekt.