PBToolboxAI v5 ← Site

messagebox — n_pbt_messagebox #

← Komponentenreferenz · Inhalt des Handbuchs

Modales Dialogfeld im Design der Anwendung, mit synchronem Rückgabewert: der direkte Ersatz für das MessageBox() von PowerBuilder, mit Rich-Text, frei wählbaren Schaltflächen, Symbolen und Kontrollkästchen.

▶ Live ansehen — Demoanwendung, Kachel Message box: die Vorschau, der zugehörige Code und diese Seite, nebeneinander.


Auf einen Blick #

Objektn_pbt_messagebox — nicht visuell: nichts, was im Fenster platziert werden muss
WofürEine Frage stellen oder ein Ergebnis melden, anstelle des starren und nicht gestalteten nativen MessageBox()
RückgabewertSynchron: of_show() blockiert und liefert den Index der angeklickten Schaltfläche

Anders als die visuellen Komponenten wird dieses Objekt nicht in ein Fenster eingefügt: Sie erzeugen, konfigurieren, zeigen und zerstören es.

// Lokale Variablen
n_pbt_messagebox lnv_mb

// Das Dialogobjekt erzeugen
lnv_mb = create n_pbt_messagebox

// ... Konfiguration ...

// Das Dialogobjekt freigeben
destroy lnv_mb

Schnellstart #

// Lokale Variablen
n_pbt_messagebox lnv_mb

// Das Dialogobjekt erzeugen
lnv_mb = create n_pbt_messagebox

// Das Dialogfeld konfigurieren
lnv_mb.is_title   = "Löschen"
lnv_mb.is_icon    = lnv_mb.ICON_WARNING
lnv_mb.is_message = "[b]12 Ordner[/b] endgültig löschen ?[br][br]Diese Aktion kann nicht rückgängig gemacht werden."

// Die Schaltflaechen hinzufuegen : Abbrechen ist die Standardschaltflaeche, die Eingabetaste loescht nichts
lnv_mb.of_add_button(/*text*/ "Löschen", /*default*/ true,  /*cancel*/ false)   // -> 1
lnv_mb.of_add_button(/*text*/ "Abbrechen",   /*default*/ true,  /*cancel*/ true)    // -> 2

// Modal anzeigen, dann auf die erste Schaltflaeche reagieren
if lnv_mb.of_show(/*hwnd*/ Handle(this)) = 1 then
    of_delete()
end if

// Das Dialogobjekt freigeben
destroy lnv_mb

of_show wartet auf die Antwort des Benutzers: Die nächste Zeile wird erst nach dem Klick ausgeführt, genau wie bei MessageBox().


Eigenschaften #

Vor of_show zu setzen.

EigenschaftTypStandardZweck
is_titlestring""Titel, der in der Kopfzeile des Dialogfelds angezeigt wird
is_messagestring""Text der Meldung. Akzeptiert die Rich-Text-Auszeichnung ([b], [i], [br], [accent], [picture=…]…). Der Text der Meldung und der Anweisung lässt sich markieren und kopieren. Ein Wert aus Ihren Daten geht zuerst durch of_escape_markup: sonst würde eine Klammer darin als Auszeichnung gelesen — ein [action=x] in einem Kundennamen würde das Dialogfeld schließen
is_instructionstring""Hauptanweisung: die Frage selbst, größer über der Meldung angezeigt. Titel / Anweisung / Meldung ist der Aufbau, der einen Dialog auf einen Blick lesbar macht — „42 Zeilen löschen?“ dann „Dies kann nicht rückgängig gemacht werden“ — statt eines gleichförmigen Blocks. Nimmt die Auszeichnung an
is_iconstring""Symbol: eine ICON_*-Konstante oder Ihr eigenes Bild (Dateipfad oder DLL-Ressource meine.dll:NAME)
is_detailsstring""Details, unter der Meldung hinter einer Schaltfläche „Details anzeigen“ eingeklappt: ein Bericht, ein Aufrufstapel, eine SQL-Anweisung. Klartext in einer scrollenden Zone mit fester Zeichenbreite — eine Klammer bleibt eine Klammer. Strg+C kopiert ihn auch eingeklappt: Das ist es, was der Support verlangt
is_details_labelstring""Beschriftung der Schaltfläche, die is_details aufklappt ("" = das übersetzte „Details anzeigen / ausblenden“)
is_footerstring""Eine Fußnote unter den Schaltflächen: ein Hilfelink, eine Erinnerung. Rich-Text; ein [hyperlink] darin öffnet den Browser und lässt das Dialogfeld offen
is_footer_iconstring""Kleines Symbol vor der Fußnote: eine ICON_*-Konstante oder Ihr eigenes Bild ("" = keines)
is_checkboxstring""Text eines optionalen Kontrollkästchens im Stil „nicht mehr nachfragen" ("" = kein Kontrollkästchen)
ib_checkedbooleanfalseAnfangszustand des Kontrollkästchens (der Endzustand wird mit of_checked() gelesen)
ib_inputbooleanfalseFügt ein gestaltetes Eingabefeld hinzu (umbenennen, Grund, Kommentar), sodass eine Anwendung kein selbstgebautes Fenster mehr braucht, das weder dem Thema noch der Leserichtung folgt. Mit of_input_value() nach of_show auslesen. Alles in einem Aufruf: of_prompt — er berücksichtigt die vorher gesetzten Einstellungen des Feldes (Beschriftung, Maske, Pflicht, mehrzeilig, Länge, Muster)
is_input_labelstring""Beschriftung über dem Feld ("" = keine). Erfordert ib_input . Sie benennt das Feld für einen Bildschirmleser, und ein Klick darauf gibt dem Feld den Fokus; Rich-Text erlaubt, eine [action]-Zone darin antwortet wie eine Wahl
is_input_valuestring""Anfangsinhalt des Feldes. Er ist beim Öffnen ausgewählt: Tippen ersetzt ihn, wie in jedem Umbenennen-Dialog
is_input_placeholderstring""Hinweis, solange das Feld leer ist. Es ist kein Wert: Tippt der Benutzer nichts, wird nichts zurückgegeben
ib_input_passwordbooleanfalseVerbirgt die eingegebenen Zeichen . Ein Auge am Ende des Feldes zeigt sie an — mit der Maus oder Alt+F8 über die Tastatur. Der Wert wird nie von Strg+C kopiert noch dem Kennwort-Manager angeboten
ib_input_requiredbooleanfalseDie Standard-Schaltfläche bleibt deaktiviert, solange das Feld leer ist. Absenden zu lassen, um danach zurechtgewiesen zu werden, hilft niemandem; die Abbrechen-Schaltfläche bleibt erreichbar. Ein Countdown auf dieser Schaltfläche (of_add_button_timed) klickt sie nicht, solange das Feld leer ist: Er läuft ab, und die Schaltfläche wartet auf eine Hand. Eine Schaltfläche, die zugleich Standard und Abbrechen ist, ist ebenfalls außer Reichweite: Esc und Alt+F4 schließen das Dialogfeld dann ohne Auswahl (0) . Leerzeichen allein füllen das Feld nicht (der Wert kommt wie getippt zurück)
ib_input_multilinebooleanfalseDas Feld nimmt mehrere Zeilen auf (ein Kommentar, eine Adresse): Die Eingabetaste beginnt eine neue Zeile, Strg+Eingabe antwortet mit der Standardschaltfläche. Ein maskiertes Feld bleibt einzeilig
il_input_max_lengthlong0Höchstzahl an Zeichen (0 = keine Grenze); ein längerer Anfangswert wird gekürzt
is_input_patternstring""Ein regulärer Ausdruck, dem der ganze Wert entsprechen muss ([0-9]{4}: vier Ziffern). Solange er es nicht tut, erscheint eine Meldung unter dem Feld und die Standardschaltfläche bleibt außer Reichweite. Ein leeres Feld regelt ib_input_required
is_input_errorstring""Die Meldung unter einem Wert, den is_input_pattern ablehnt ("" = das übersetzte „Dieser Wert ist ungültig.“)
ib_buttons_reversebooleanfalseReihenfolge der Schaltflächen: false = von links nach rechts in der Reihenfolge des Hinzufügens; true = umgekehrt
ib_movablebooleantrueLässt sich das Fenster verschieben? Es hat keine Titelleiste — es zeichnet seine eigene Karte — also hat Windows keinen Griff daran: wir geben ihm einen, die Karte zieht das Fenster, außer dem, was schon auf einen Klick antwortet, und dem Meldungstext, der sich markieren lässt. Standardmäßig wahr, denn ein Dialog, der genau das verdeckt, was man zum Antworten lesen muss, ist eine Falle. Auf falsch setzen für ein Fenster, das bleiben muss, wo es ist . Eine Abkürzung wie of_info behält diese Einstellung
ib_closablebooleanfalseEsc und Alt+F4 bei einem Dialogfeld ohne Abbrechen-Schaltfläche. false folgt Windows: Ein Dialogfeld mit einer einzigen Schaltfläche schließt über diese (of_info liefert 1), eines mit mehreren (Ja / Nein) muss beantwortet werden — keine der beiden Tasten schließt es. true schließt es ohne Auswahl: of_show liefert 0
ib_soundbooleantrueDer Windows-Ton des Symbols beim Öffnen (Information, Warnung, Fehler, Frage). false = ein stummes Dialogfeld. Ein Dialogfeld ohne Symbol oder mit eigenem Bild spielt nichts
is_positionstringPOSITION_OWNERZentrierung: POSITION_OWNER (auf dem aufrufenden Fenster) oder POSITION_SCREEN (auf dem Bildschirm)
il_min_widthlong0Mindestbreite in Pixeln (0 = automatisch, 320); nie unter 200
il_max_widthlong0Maximalbreite in Pixeln (0 = automatisch): Der Text bricht innerhalb dieser Grenze um; nie unter 200
il_max_heightlong0Maximalhöhe in Pixeln (0 = automatisch): Darüber hinaus wird der Meldungstext gescrollt, statt das Fenster zu vergrößern
il_accentlong-1Akzentfarbe dieses Dialogfelds: Die Standardschaltfläche und das Kontrollkästchen übernehmen sie, und die lesbare Textfarbe wird daraus abgeleitet. -1 (Standard) folgt der Anwendung. Ein Fehler in Rot, ein Erfolg in Grün, ohne das Design anzutasten . Eine Abkürzung wie of_error behält ihn: setzen Sie ihn, dann rufen Sie die Abkürzung auf

Konstanten #

KonstanteWertVerwendung
ICON_INFORMATION"information"Neutrale Information
ICON_WARNING"warning"Warnung, riskante Aktion
ICON_ERROR"error"Fehlschlag, Fehler
ICON_QUESTION"question"Geschlossene Frage
ICON_SUCCESS"success"Bestätigung eines Erfolgs
ICON_NONE"none"Kein Symbol
POSITION_OWNER"owner"Auf dem aufrufenden Fenster zentriert
POSITION_SCREEN"screen"Auf dem Bildschirm zentriert
BUTTONS_OK"ok"of_messagebox: OK
BUTTONS_OK_CANCEL"okcancel"OK / Abbrechen
BUTTONS_YES_NO"yesno"Ja / Nein
BUTTONS_YES_NO_CANCEL"yesnocancel"Ja / Nein / Abbrechen
BUTTONS_RETRY_CANCEL"retrycancel"Wiederholen / Abbrechen
BUTTONS_ABORT_RETRY_IGNORE"abortretryignore"Abbrechen / Wiederholen / Ignorieren

Methoden #

MethodeZweck
of_add_button (string as_text) → longFügt eine einfache Schaltfläche hinzu. Liefert ihren Index ab 1
of_add_button (string as_text, boolean ab_default, boolean ab_cancel) → longDasselbe, wobei die Schaltfläche als Standard (Eingabetaste) und/oder als Abbrechen (Esc) gekennzeichnet wird. Liefert seinen Index, ab 1
of_add_button (string as_text, string as_icon, boolean ab_default, boolean ab_cancel) → longDasselbe, mit einem Symbol auf der Schaltfläche. Liefert seinen Index, ab 1
of_add_button_timed (string as_text, boolean ab_default, boolean ab_cancel, long al_enable_secs, long al_click_secs) → longSchaltfläche mit Countdown: bleibt al_enable_secs Sekunden lang deaktiviert (mit sichtbarem Zähler) und klickt sich dann selbst nach al_click_secs Sekunden (0 = Zeitgeber inaktiv). Solange eine Abbrechen-Schaltfläche noch herunterzählt, schließen weder Esc noch Alt+F4 das Dialogfeld: die Wartezeit soll zum Lesen bringen. Liefert seinen Index, ab 1
of_count ( ) → longLiefert die Anzahl der Schaltflächen, die der Dialog trägt. Sie werden über ihren Rang angesprochen — den of_add_button liefert und den of_show zurückgibt — sie tragen also keinen Schlüssel: of_keys_at und of_has gibt es hier nicht
of_show (long al_hwnd) → longZeigt das modale Dialogfeld und liefert den Index der angeklickten Schaltfläche. 0 = ohne Schaltfläche geschlossen: eine [action]-Zone oder eine Wahl (of_action), oder Esc / Alt+F4 mit ib_closable. Ohne Abbrechen-Schaltfläche antworten Esc und Alt+F4 über die einzige Schaltfläche eines Dialogfelds mit einer Schaltfläche und schließen keines mit mehreren — wie Windows. Ein negativer Wert bedeutet, dass kein Dialogfeld angezeigt werden konnte: -4, oder -6, wenn die WebView2-Laufzeit fehlt — of_get_last_error() nennt den Grund. Schließt sich das Besitzer-Fenster, während das Dialogfeld offen ist (ein Timer, ein Ereignis), verschwindet das Dialogfeld mit ihm und of_show liefert 0
of_get_last_error ( ) → stringWarum sich das letzte Dialogfeld nicht öffnen ließ — leere Zeichenkette, wenn es sich geöffnet hat. Nach einem of_show (oder einer Kurzform wie of_info) mit negativem Wert zu lesen, oder nach einem of_choose oder of_prompt, das eine leere Zeichenkette lieferte
of_checked ( ) → booleanZustand des Kontrollkästchens zum Zeitpunkt des letzten of_show
of_input_value ( ) → stringBeim letzten of_show eingegebener Text (leer, wenn ib_input aus war)
of_action ( ) → stringId der angeklickten [action=id]-Zone — in der Meldung, im Titel, in der Anweisung, in einer Beschriftung oder in der Fußnote — oder Schlüssel der angeklickten Wahl; sonst eine leere Zeichenkette. Eine solche Zone ist eine im Text selbst angebotene Wahl: sie schließt den Dialog und of_show liefert 0. Eine [hyperlink=url]-Zone dagegen öffnet im Browser und lässt den Dialog stehen — der Aufrufer steckt in of_show fest, ein Link kann also keine Antwort sein
of_info (long al_hwnd, string as_title, string as_message) → longDialog in einer Zeile, so wie MessageBox() einer ist: Informationssymbol und eine einzige OK-Schaltfläche, liefert 1. Die Beschriftungen stammen aus den Übersetzungen der Bibliothek (6 Sprachen), statt in jeder Anwendung geschrieben zu werden — genau dafür gibt es diese Kurzformen (negativ: kein Dialogfeld angezeigt, siehe of_get_last_error) Auch Esc liefert 1, wie MessageBox(…, OK!).
of_warning (long al_hwnd, string as_title, string as_message) → longWarnsymbol, eine OK-Schaltfläche. Liefert 1 (negativ: kein Dialogfeld angezeigt, siehe of_get_last_error)
of_error (long al_hwnd, string as_title, string as_message) → longFehlersymbol, eine OK-Schaltfläche. Liefert 1 (negativ: kein Dialogfeld angezeigt, siehe of_get_last_error)
of_success (long al_hwnd, string as_title, string as_message) → longErfolgssymbol, eine OK-Schaltfläche. Liefert 1 (negativ: kein Dialogfeld angezeigt, siehe of_get_last_error)
of_confirm (long al_hwnd, string as_title, string as_message { , long al_default }) → longFrage + OK / Abbrechen. Liefert 1 = OK, 2 = Abbrechen (auch Esc). al_default wählt die Standardschaltfläche: 2 legt die Eingabetaste auf Abbrechen, die sichere Vorgabe einer zerstörenden Aktion (-5 außerhalb des Bereichs) (negativ: kein Dialogfeld angezeigt, siehe of_get_last_error)
of_yes_no (long al_hwnd, string as_title, string as_message { , long al_default }) → longFrage + Ja / Nein. Liefert 1 = Ja, 2 = Nein. Wie ein Ja/Nein-Dialogfeld von Windows schließen Esc und Alt+F4 es nicht: Es muss beantwortet werden (ib_closable = true lässt sie 0 liefern). al_default wählt die Standardschaltfläche (-5 außerhalb des Bereichs) (negativ: kein Dialogfeld angezeigt, siehe of_get_last_error)
of_yes_no_cancel (long al_hwnd, string as_title, string as_message { , long al_default }) → longFrage + Ja / Nein / Abbrechen. Liefert 1, 2, 3 (Abbrechen, auch Esc). al_default wählt die Standardschaltfläche (-5 außerhalb des Bereichs) (negativ: kein Dialogfeld angezeigt, siehe of_get_last_error)
of_retry_cancel (long al_hwnd, string as_title, string as_message) → longFehler + Wiederholen / Abbrechen, Wiederholen als Standard. Liefert 1 = Wiederholen, 2 = Abbrechen (auch Esc) (negativ: kein Dialogfeld angezeigt, siehe of_get_last_error)
of_messagebox (long al_hwnd, string as_title, string as_text { , icon ae_icon { , button ae_buttons { , long al_default } } }) → longDas MessageBox() von PowerBuilder, Argument für Argument: Setzen Sie lnv_mb.of_messagebox(Handle(this), vor einen MessageBox(-Aufruf, und er kompiliert — Question!, YesNo! und die Standardschaltfläche, wie Sie sie geschrieben hatten. Liefert die Nummer der gedrückten Schaltfläche wie MessageBox() (Abbrechen 1 / Wiederholen 2 / Ignorieren 3). Die Texte erscheinen unverändert: eine Klammer bleibt eine Klammer, ~r~n bricht die Zeile um. Esc folgt Windows: die Abbrechen-Schaltfläche, das OK einer einzigen Schaltfläche, nichts bei Ja / Nein und Abbrechen / Wiederholen / Ignorieren. Die Beschriftungen sind übersetzt. -5 bei einer Standardschaltfläche außerhalb des Bereichs (nichts wird angezeigt); ein anderer negativer Wert: kein Dialogfeld angezeigt (of_get_last_error)
of_messagebox (long al_hwnd, string as_title, string as_text, string as_icon { , string as_buttons { , long al_default } }) → longDasselbe mit Zeichenketten: eine ICON_*-Konstante (oder Ihr Bild) und eine BUTTONS_*-Konstante. -5 bei einem unbekannten Schaltflächensatz. Liefert dieselbe Schaltflächennummer (1 für die erste).
of_add_choice (string as_key, string as_title, string as_description { , boolean ab_enabled }) → longFügt unter der Meldung eine Auswahl hinzu — Titel und Beschreibung, wie die Befehlslinks eines Windows-Aufgabendialogs. Ein Klick schließt den Dialog, of_action() liefert den Schlüssel (of_show liefert 0). Liefert den Rang der Auswahl (1 für die erste), -5 bei leerem, bereits vergebenem oder / bzw. ` enthaltendem Schlüssel — dann wird nichts hinzugefügt . Mit ab_enabled = false` erscheint die Wahl ausgegraut und lässt sich nicht wählen (die Pfeiltasten überspringen sie)
of_choose (long al_hwnd) → stringZeigt die Auswahlen mit einer einzigen Abbrechen-Schaltfläche (übersetzt) und liefert den Schlüssel der angeklickten Auswahl, oder eine leere Zeichenkette, wenn abgebrochen wurde. Die Liste rollt, wenn sie den Bildschirm sprengt. Ebenfalls leer, wenn kein Dialogfeld angezeigt werden konnte: of_get_last_error nennt dann den Grund. Ohne jede Auswahl wird nichts angezeigt: leere Zeichenkette, und of_get_last_error meldet „no choice to show“ . Eine [action]-Zone der Texte antwortet wie eine Wahl: Ihre Id kommt zurück
of_prompt (long al_hwnd, string as_title, string as_message, string as_default { , boolean ab_password, boolean ab_required }) → stringFragt einen Wert ab und liefert das Eingetippte, oder eine leere Zeichenkette bei Abbruch. Um eine leere Antwort von einem Abbruch zu unterscheiden, nehmen Sie of_show + of_input_value. Ebenfalls leer, wenn kein Dialogfeld angezeigt werden konnte: of_get_last_error nennt dann den Grund . Die vorher gesetzten Einstellungen des Feldes werden berücksichtigt (is_input_label, ib_input_password, ib_input_multiline, is_input_pattern…); die Überladung maskiert (ab_password) und verlangt (ab_required) nur für diesen Aufruf
of_reset ( ) → longLöscht alle Eigenschaften, die hinzugefügten Schaltflächen und Wahlen und die Antwort des letzten Dialogs (of_checked, of_action, of_input_value, of_get_last_error): Dieselbe Instanz beginnt bei null. Die Abkürzungen (of_info, of_confirm, of_prompt…) ersetzen nur den Inhalt: Sie behalten das Erscheinungsbild (Akzent, Position, Verschieben, Größen, Reihenfolge der Schaltflächen, ib_closable, ib_sound) und die Einstellungen des Feldes Liefert 0, sobald erledigt.

Die Beschriftung einer Schaltfläche akzeptiert die Rich-Text-Auszeichnung und das Mnemonik-Zeichen & ("&Speichern" unterstreicht das S und aktiviert die Schaltfläche mit Alt+S); && zeigt ein wörtliches Und-Zeichen an.


Die Tastatur #

TasteWirkung
EingabetasteLöst die als Standard markierte Schaltfläche aus — außer wenn der Fokus auf einer anderen Schaltfläche oder einer Wahl liegt: diese antwortet. In einem mehrzeiligen Feld beginnt die Eingabetaste eine neue Zeile und Strg+Eingabe antwortet
EscLöst die als Abbrechen markierte Schaltfläche aus; ohne sie die einzige Schaltfläche eines Dialogfelds mit einer Schaltfläche (of_info liefert 1) und nichts bei einem Dialogfeld mit mehreren Schaltflächen (Ja / Nein): Es muss beantwortet werden, wie unter Windows — außer ib_closable = true, das es schließt und 0 liefert. Alt+F4 tut dasselbe. Solange die Abbrechen-Schaltfläche noch herunterzählt (of_add_button_timed), schließt keine der beiden
Alt + BuchstabeLöst die Schaltfläche aus, deren Beschriftung dieses Kürzel trägt. Tragen es mehrere, wandert der Fokus von einer zur nächsten, ohne zu antworten (wie unter Windows): Die Eingabetaste wählt
TabVerschiebt den Fokus von einem Element zum nächsten: Wahlen, Feld, Schaltfläche „Details“, Kontrollkästchen, Schaltflächen
Strg + CKopiert das Dialogfeld (Titel, Anweisung, Meldung, Details, Wahlen mit ihrer Beschreibung, „Beschriftung: Wert“ des Feldes — nie ein Kennwort —, Kontrollkästchen mit seinem Zustand [x] oder [ ], Fußnote, Beschriftungen der Schaltflächen) in die Zwischenablage, wie jedes Windows-Dialogfeld — praktisch, wenn ein Fehler an den Support weitergeleitet werden muss. Ist im Meldungstext Text markiert, wird nur die Markierung kopiert
↑ ↓ Pos1 Ende Bild↑ Bild↓Durchlaufen die Liste der Wahlen (eine deaktivierte Wahl wird übersprungen); die Eingabetaste wählt die mit dem Fokus
Alt + F8Zeigt ein Kennwort an oder verbirgt es, aus dem Feld heraus

Beim Öffnen zeigt keine Schaltfläche einen Fokusrahmen: Das ist beabsichtigt und entspricht dem Verhalten moderner Windows-Dialoge. Der Rahmen erscheint erst nach dem ersten Druck auf Tab, also sobald der Benutzer ausdrücklich zur Tastatur wechselt. Eingabetaste und Esc sind von der ersten Sekunde an aktiv, auch ohne sichtbaren Fokus.


Beispiele #

Geschlossene Frage mit Standardschaltfläche #

// Lokale Variablen
n_pbt_messagebox lnv_mb
long ll_answer

// Das Dialogobjekt erzeugen
lnv_mb = create n_pbt_messagebox

// Das Dialogfeld konfigurieren
lnv_mb.is_title   = "Änderungen speichern"
lnv_mb.is_icon    = lnv_mb.ICON_QUESTION
lnv_mb.is_message = "Der Ordner wurde geändert. Möchten Sie vor dem Schließen speichern ?"

// Die Schaltflaechen hinzufuegen
lnv_mb.of_add_button(/*text*/ "&Speichern",     /*default*/ true,  /*cancel*/ false)  // 1
lnv_mb.of_add_button(/*text*/ "&Nicht speichern", /*default*/ false, /*cancel*/ false) // 2
lnv_mb.of_add_button(/*text*/ "Abbrechen",          /*default*/ false, /*cancel*/ true)   // 3

// Modal anzeigen, dann das Dialogobjekt freigeben
ll_answer = lnv_mb.of_show(/*hwnd*/ Handle(this))
destroy lnv_mb

// Je nach geklickter Schaltflaeche handeln (Rang ab 1)
choose case ll_answer
    case 1 ; of_save() ; Close(parent)
    case 2 ; Close(parent)
    case else ; // 3 oder 0 : nicht schliessen
end choose

Formatierte Meldung und Symbol #

// Das Dialogfeld konfigurieren
lnv_mb.is_title   = "Import abgeschlossen"
lnv_mb.is_icon    = lnv_mb.ICON_SUCCESS
lnv_mb.is_message = "[b]1 240 Zeilen[/b] übernommen.[br][br]" &
                  + "[accent]18 Duplikate[/accent] wurden übersprungen."

// Die Schaltflaeche hinzufuegen, dann das Dialogfeld anzeigen
lnv_mb.of_add_button(/*text*/ "OK", /*default*/ true, /*cancel*/ false)
lnv_mb.of_show(/*hwnd*/ Handle(this))

Ein Wert aus Ihren Daten in der Meldung #

Die Meldung ist Rich-Text: eine Klammer darin ist ein Tag. Ein Kundenname, eine vom Benutzer eingegebene Bezeichnung geht vorher durch of_escape_markup (aus n_pbt_utils) — sonst würde „Schmidt [action=x]“ das Dialogfeld wie eine Auswahl schließen.

// Lokale Variablen
n_pbt_utils lnv_utils
string ls_name

// Der Name kommt aus der Datenbank (hier von Hand geschrieben)
ls_name = "Smith [action=x] & Co"

// Den Namen maskieren : er wird unveraendert angezeigt
lnv_mb.is_title   = "Delete customer"
lnv_mb.is_message = "Delete the customer [b]" + lnv_utils.of_escape_markup(/*text*/ ls_name) + "[/b] ?"

// Die Schaltflaechen hinzufuegen, Abbrechen als Standard, dann das Dialogfeld anzeigen
lnv_mb.of_add_button(/*text*/ "Delete", /*default*/ false, /*cancel*/ false)
lnv_mb.of_add_button(/*text*/ "Cancel", /*default*/ true, /*cancel*/ true)
lnv_mb.of_show(/*hwnd*/ Handle(this))

Kontrollkästchen „nicht mehr nachfragen" #

// Lokale Variablen
n_pbt_messagebox lnv_mb

// Das Dialogobjekt erzeugen
lnv_mb = create n_pbt_messagebox

// Das Dialogfeld konfigurieren
lnv_mb.is_title    = "Löschen"
lnv_mb.is_icon     = lnv_mb.ICON_WARNING
lnv_mb.is_message  = "Die ausgewählten Zeilen löschen ? Diese Aktion kann nicht rückgängig gemacht werden."
lnv_mb.is_checkbox = "Nicht mehr nachfragen"
lnv_mb.ib_checked  = false

// Die Schaltflaechen hinzufuegen
lnv_mb.of_add_button(/*text*/ "Löschen", /*default*/ true,  /*cancel*/ false)
lnv_mb.of_add_button(/*text*/ "Abbrechen",   /*default*/ false, /*cancel*/ true)

// Modal anzeigen, dann auf die erste Schaltflaeche reagieren
if lnv_mb.of_show(/*hwnd*/ Handle(this)) = 1 then
    of_delete()

    // Die Wahl des Benutzers merken
    ib_confirm_delete = not lnv_mb.of_checked()
end if

// Das Dialogobjekt freigeben
destroy lnv_mb

Schaltfläche mit Countdown #

// Das Dialogfeld konfigurieren
lnv_mb.is_title   = "Neustart"
lnv_mb.is_icon    = lnv_mb.ICON_INFORMATION
lnv_mb.is_message = "Die Anwendung wird neu gestartet, um das Update anzuwenden."

// "Weiter" bleibt 3 Sekunden lang grau (ein Zaehler wird angezeigt)
lnv_mb.of_add_button_timed(/*text*/ "Weiter", /*default*/ true, /*cancel*/ false, /*enable_secs*/ 3, /*click_secs*/ 0)

// "Spaeter" klickt sich nach 10 Sekunden von selbst
lnv_mb.of_add_button_timed(/*text*/ "Später", /*default*/ false, /*cancel*/ true, /*enable_secs*/ 0, /*click_secs*/ 10)

// Modal anzeigen
lnv_mb.of_show(/*hwnd*/ Handle(this))

Lange Meldung: die Größe begrenzen #

// Lokale Variablen
string ls_notes

// Ein umfangreicher Text : das Dialogfeld ist gedeckelt und der Text scrollt
ls_notes = Fill("Lorem ipsum dolor sit amet. ", 200)
lnv_mb.is_title      = "Versionshinweise"
lnv_mb.is_message    = ls_notes
lnv_mb.il_max_width  = 480
lnv_mb.il_max_height = 320

// Die Schaltflaeche hinzufuegen, dann das Dialogfeld anzeigen
lnv_mb.of_add_button(/*text*/ "Schließen", /*default*/ true, /*cancel*/ true)
lnv_mb.of_show(/*hwnd*/ Handle(this))

Eine Instanz wiederverwenden #

// Eine Fensterinstanz, mehrere Dialoge : of_reset zwischen jedem Aufruf
inv_mb.of_reset()      // loescht die Eigenschaften UND die vorherigen Schaltflaechen

// Das neue Dialogfeld konfigurieren und anzeigen
inv_mb.is_title   = "Zweiter Dialog"
inv_mb.is_message = "Jedes of_reset beginnt wieder mit einem leeren Dialogfeld."
inv_mb.of_add_button(/*text*/ "OK", /*default*/ true, /*cancel*/ false)
inv_mb.of_show(/*hwnd*/ Handle(this))

Einen MessageBox()-Aufruf migrieren #

of_messagebox nimmt die Argumente von MessageBox() in derselben Reihenfolge, das Fenster vorneweg: Suchen und Ersetzen migriert einen Aufruf, und die gelieferten Werte sind dieselben.

// Lokale Variablen
n_pbt_messagebox lnv_mb
long ll_answer

// Das Dialogobjekt erzeugen
lnv_mb = create n_pbt_messagebox

// Die Argumente von MessageBox, das Fenster vorneweg : Nein ist die Standardschaltflaeche
ll_answer = lnv_mb.of_messagebox(/*hwnd*/ Handle(this), /*title*/ "Delete", /*text*/ "Delete the customer ?", /*icon*/ Question!, /*buttons*/ YesNo!, /*default*/ 2)

// Das Dialogobjekt freigeben
destroy lnv_mb

// Dieselben Zahlen wie MessageBox : 1 = Ja, 2 = Nein
if ll_answer = 1 then
    of_delete()
end if

Eine Liste von Wahlen #

// Lokale Variablen
n_pbt_messagebox lnv_mb
string ls_format

// Das Dialogobjekt erzeugen
lnv_mb = create n_pbt_messagebox

// Die Frage, dann eine Wahl je Antwort : ein Schluessel, ein Titel, eine Beschreibung
lnv_mb.is_title       = "Export"
lnv_mb.is_instruction = "How should the report leave ?"
lnv_mb.of_add_choice(/*key*/ "pdf", /*title*/ "PDF document", /*description*/ "One file, ready to send.")
lnv_mb.of_add_choice(/*key*/ "xlsx", /*title*/ "Excel workbook", /*description*/ "Figures stay figures.")

// Eine Wahl, die der Benutzer gerade nicht treffen kann : ausgegraut
lnv_mb.of_add_choice(/*key*/ "fax", /*title*/ "Fax", /*description*/ "No fax line is configured.", /*enabled*/ false)

// Die Wahlen mit einer einzigen Abbrechen-Schaltflaeche zeigen : der Schluessel kommt zurueck, "" bei Abbruch
ls_format = lnv_mb.of_choose(/*hwnd*/ Handle(this))

// Das Dialogobjekt freigeben
destroy lnv_mb

// Je nach Schluessel handeln
choose case ls_format
    case "pdf"
        of_export_pdf()
    case "xlsx"
        of_export_xlsx()
end choose

Nach einem Wert fragen #

// Lokale Variablen
n_pbt_messagebox lnv_mb
string ls_name
long ll_answer

// Das Dialogobjekt erzeugen
lnv_mb = create n_pbt_messagebox

// Eine Zeile : liefert das Getippte, "" wenn der Benutzer abbricht
ls_name = lnv_mb.of_prompt(/*hwnd*/ Handle(this), /*title*/ "Rename", /*message*/ "New name of the report :", /*default*/ "Sales 2026")
if ls_name <> "" then
    of_rename(ls_name)
end if

// Ein Feld mit einer Regel : vier Ziffern, sonst bleibt OK ausser Reichweite
lnv_mb.of_reset()
lnv_mb.is_title         = "PIN"
lnv_mb.ib_input         = true
lnv_mb.is_input_label   = "PIN code"
lnv_mb.is_input_pattern = "[0-9]{4}"
lnv_mb.is_input_error   = "Four digits, please."
lnv_mb.of_add_button(/*text*/ "OK", /*default*/ true, /*cancel*/ false)
lnv_mb.of_add_button(/*text*/ "Cancel", /*default*/ false, /*cancel*/ true)

// of_show und dann of_input_value unterscheiden eine leere Antwort von einem Abbruch
ll_answer = lnv_mb.of_show(/*hwnd*/ Handle(this))
if ll_answer = 1 then
    of_check_pin(lnv_mb.of_input_value())
end if

// Das Dialogobjekt freigeben
destroy lnv_mb

Ein Fehlerbericht: Anweisung, Details, Fußnote #

// Lokale Variablen
n_pbt_messagebox lnv_mb
long ll_answer

// Das Dialogobjekt erzeugen
lnv_mb = create n_pbt_messagebox

// Die kurze Geschichte : die Frage gross, ihre Folge darunter
lnv_mb.is_title       = "Save failed"
lnv_mb.is_icon        = n_pbt_messagebox.ICON_ERROR
lnv_mb.is_instruction = "The order could not be saved"
lnv_mb.is_message     = "Another order already carries the number 4152."

// Die lange Geschichte, eingeklappt : Klartext, den der Support mit Strg+C kopiert
lnv_mb.is_details = "SQLSTATE = 23000~r~nViolation of PRIMARY KEY constraint 'pk_order'."

// Ein Hilfelink unter den Schaltflaechen, und das Dialogfeld in Rot
lnv_mb.is_footer = "Read [hyperlink=https://example.com/help]what to do[/hyperlink]."
lnv_mb.il_accent = RGB(/*red*/ 196, /*green*/ 43, /*blue*/ 28)

// Die Schaltflaechen hinzufuegen, dann das Dialogfeld anzeigen
lnv_mb.of_add_button(/*text*/ "&Retry", /*default*/ true, /*cancel*/ false)
lnv_mb.of_add_button(/*text*/ "Cancel", /*default*/ false, /*cancel*/ true)
ll_answer = lnv_mb.of_show(/*hwnd*/ Handle(this))

// Ein negativer Wert : kein Dialogfeld konnte angezeigt werden, der Grund bleibt erhalten
if ll_answer < 0 then
    of_log(lnv_mb.of_get_last_error())
end if

// Das Dialogobjekt freigeben
destroy lnv_mb

Eine Wahl im Satz #

// Lokale Variablen
n_pbt_messagebox lnv_mb

// Das Dialogobjekt erzeugen
lnv_mb = create n_pbt_messagebox

// Eine [action]-Zone ist eine im Text selbst angebotene Antwort
lnv_mb.is_title   = "Disk full"
lnv_mb.is_icon    = n_pbt_messagebox.ICON_WARNING
lnv_mb.is_message = "The folder is full. [action=folder]Open the folder[/action] to make room."
lnv_mb.of_add_button(/*text*/ "Cancel", /*default*/ false, /*cancel*/ true)

// Die Zone schliesst das Dialogfeld : of_show liefert 0 und of_action ihre Id
if lnv_mb.of_show(/*hwnd*/ Handle(this)) = 0 and lnv_mb.of_action() = "folder" then
    of_open_folder()
end if

// Das Dialogobjekt freigeben
destroy lnv_mb

Best Practices #


← Komponentenreferenz · Inhalt des Handbuchs