contextmenu — u_pbt_contextmenu #
← Komponentenreferenz · Inhalt des Handbuchs
Das Kontextmenü von Windows, im Design der Anwendung: eine kaskadierende Liste, die sich am Cursor, unter einem Steuerelement oder an einem Bildschirmpunkt öffnet — Symbole, angezeigte Tastenkürzel, Häkchen, Optionseinträge, Abschnittsüberschriften, lange Listen, die scrollen und auf Tippen reagieren.
▶ Live ansehen — Demoanwendung, Kachel Context menu: die Vorschau, der erzeugende Code und diese Seite nebeneinander.
Kurz gefasst #
| Userobject | u_pbt_contextmenu |
| Elementklasse | n_pbt_contextmenu_item (of_item(keys)) |
| Dient zu | Beim Rechtsklick oder unter einer Schaltfläche die Befehle anbieten, die für das gerade Angeklickte gelten |
| Prinzip | Sie beschreiben die Einträge über ihre Adresse; Fenster, Tastatur und Kaskaden übernehmen wir |
| Opt-in-Option | ib_track_hover |
Schnellstart #
// The menu of a grid : three commands, a separator, a cascade
uo_menu.of_add_item(/*keys*/ "copy", /*text*/ "&Copy")
uo_menu.of_add_item(/*keys*/ "paste", /*text*/ "&Paste")
uo_menu.of_add_item(/*keys*/ "delete", /*text*/ "&Delete")
uo_menu.of_add_separator(/*keys*/ "")
uo_menu.of_add_item(/*keys*/ "export", /*text*/ "&Export")
uo_menu.of_add_item(/*keys*/ "export/pdf", /*text*/ "PDF")
uo_menu.of_add_item(/*keys*/ "export/csv", /*text*/ "CSV")
// It opens from the right-click event of the grid : see Where to call of_show
// event ue_item_selected of uo_menu : (string as_keys)
// as_keys is the ADDRESS of the chosen entry
choose case as_keys
case "copy"
of_copy_selection()
case "export/pdf"
of_export("pdf")
end choose
Das Menü öffnen #
Die Komponente selbst ist unsichtbar: Sie nimmt im Fenster keinen Platz ein. Legen Sie sie irgendwo ab, Breite und Höhe null — sie existiert nur, solange das Menü offen ist. Vier Arten, es zu öffnen:
of_show()— am Cursor, aus dem Rechtsklick des Steuerelements, das die Geste empfängt — siehe die Tabelle unten.of_show_under(Steuerelement)— unter einem Steuerelement: Das Menü hängt an seiner Unterkante, an seiner Anfangskante ausgerichtet (seiner rechten Kante bei Rechts-nach-links-Layout), und öffnet sich darüber, wenn der Bildschirm darunter endet. Was eine Schaltfläche Mehr oder … braucht — und die Tastatur:of_show_under(Steuerelement, true)markiert den ersten aktiven Eintrag.of_show(x, y)— an einem Bildschirmpunkt, in Pixeln. Negative Koordinaten sind ein echter Punkt: ein Bildschirm links oder oberhalb des Hauptbildschirms.of_show_at(Steuerelement, x, y)— an einem Punkt in einem Steuerelement, in PowerBuilder-Einheiten ab seiner linken oberen Ecke: der Punkt, denPopMenunahm, nichts umzurechnen.of_source()nennt dieses Steuerelement dann inue_item_selected— ein Menü für mehrere Steuerelemente.
// event rbuttondown of a DataWindow : the row under the cursor first
if row > 0 then dw_list.SetRow(/*row*/ row)
uo_menu.of_show()
// event ue_clicked of a "More" button : the menu hangs from it
uo_menu.of_show_under(/*control*/ uo_more)
// event rbuttondown of a DataWindow, another way : the point in the control, in
// PowerBuilder units, as PopMenu took it
uo_menu.of_show_at(/*control*/ dw_list, /*x*/ dw_list.PointerX(), /*y*/ dw_list.PointerY())
Wo of_show aufrufen #
| Steuerelement | Ereignis | Gut zu wissen |
|---|---|---|
| DataWindow | rbuttondown | Machen Sie zuerst die angeklickte Zeile aktuell (SetRow(row)). Das Drücken genügt: Nur ein Drücken wählt einen Eintrag, nie das folgende Loslassen |
| ListView, TreeView | rightclicked | Das Ereignis liefert das angeklickte Element |
| PBToolboxAI-Komponente | ue_rclicked | Eine Komponente mit Elementen hat auch ein Rechtsklick-Ereignis je Element, das es über seine Adresse nennt |
| Eingabefeld | ein Benutzerereignis auf pbm_contextmenu | Es kommt beim Rechtsklick; return 1 verhindert, dass das Feld zusätzlich sein eigenes Windows-Menü öffnet (Ausschneiden, Kopieren, Einfügen). Die Tastatur kommt unter PowerBuilder 10 nicht dort an: siehe das Rezept unten |
of_show() öffnet sich dort, wo der Cursor ist, also wo der Benutzer geklickt hat: keine Einheit umzurechnen. of_show(x, y) erwartet Bildschirmpixel, nie die PowerBuilder-Einheiten eines auf das Steuerelement bezogenen xpos/ypos. Für einen Punkt in einem Steuerelement, in PowerBuilder-Einheiten: of_show_at(Steuerelement, x, y).
Über die Tastatur — Umschalt+F10 oder die Menütaste — ist die Maus irgendwo: Öffnen Sie das Menü unter dem Steuerelement mit dem Fokus, mit of_show_under(Steuerelement, true). Wie in Windows ist dann sein erster aktiver Eintrag markiert: Eingabe wählt ihn, die Pfeiltasten gehen von dort aus. Unter PowerBuilder 10 empfängt pbm_contextmenu nur den Rechtsklick, und Umschalt+F10 erreicht ein Eingabefeld nicht (gemessen: weder pbm_contextmenu noch pbm_keydown noch pbm_syskeydown). Die Taste, die das Menü auf einem PowerBuilder-Steuerelement öffnet, ist also die Menütaste (KeyApps!), in einem Benutzerereignis auf pbm_keydown — pbm_dwnkey bei einem DataWindow, dessen Rechtsklick über sein Ereignis rbuttondown läuft: pbm_contextmenu kommt bei einem Klick in eine Zelle dort nicht an (gemessen). Umschalt+F10 empfangen die PBToolboxAI-Komponenten selbst weiterhin (ihr ue_rclicked).
// User event ue_contextmenu of an edit field, mapped on pbm_contextmenu :
// the right-click opens the menu at the cursor
uo_menu.of_show()
// The field does not open its own Windows menu as well
return 1
// User event ue_key of the same field, mapped on pbm_keydown : the Menu key
// opens the menu under the field, its first entry highlighted
if key = KeyApps! then
uo_menu.of_show_under(/*control*/ this, /*keyboard*/ true)
return 1
end if
// User event ue_key of a DataWindow, mapped on pbm_dwnkey : the Menu key
if key = KeyApps! then
uo_menu.of_show_under(/*control*/ this, /*keyboard*/ true)
return 1
end if
Eine Antwort pro Öffnung: Ein geöffnetes Menü endet mit einer Wahl (ue_item_selected) oder ohne (ue_dismissed — ein Klick daneben, Esc, of_close). Ein Menü, das nichts zu zeigen hat, öffnet sich nicht: ue_dismissed kommt sofort. Solange das Menü auf dem Bildschirm ist, läuft die Anwendung weiter: Ein inzwischen ausgegrauter, ausgeblendeter oder entfernter Eintrag kann nicht mehr gewählt werden (stattdessen ue_dismissed), und of_remove_item, of_clear oder of_reset schließen das offene Menü. ue_dismissed(as_reason) sagt, warum: REASON_ESCAPE (Esc), REASON_OUTSIDE (ein Klick daneben), REASON_FOCUS (ein anderes Fenster hat den Fokus genommen), REASON_USER (auf andere Weise, ein anderes Menü übernimmt), REASON_CODE (of_close, ein entfernter Eintrag oder das geleerte Menü), REASON_REPLACED (ein zweites of_show), REASON_EMPTY (nichts zu zeigen), REASON_UNAVAILABLE (der gewählte Eintrag war nicht mehr verfügbar).
Ein Menü zur Zeit: Ein zweites of_show ersetzt das offene Menü, das zuerst ue_dismissed liefert. Und of_close direkt nach of_show schließt das Menü, noch bevor es gezeichnet ist — auch dann folgt ue_dismissed.
Über die Tastatur durchlaufen die Pfeiltasten die Einträge und überspringen ausgegraute, → öffnet eine Kaskade und ← schließt sie, Eingabe wählt, Esc steigt eine Ebene hinauf und schließt dann. Der unterstrichene Buchstabe — der nach & in der Beschriftung, && für ein kaufmännisches Und — wählt den Eintrag direkt; sonst führt das Tippen der ersten Buchstaben einer Beschriftung zu diesem Eintrag, Leerzeichen inbegriffen („report 2“). Eine lange Liste (auch fünfhundert Einträge und mehr) scrollt und bleibt flüssig. Von rechts nach links gelesen richtet sich das Menü rechts aus und die Kaskaden öffnen sich nach links.
Kaskaden, Abschnitte und Markierungen #
Ein Eintrag wird über seine Adresse benannt: oben sein Schlüssel allein (copy), in einer Kaskade die Schlüssel seiner Eltern und dann der eigene, durch / verbunden (export/pdf). Das Elternelement muss existieren; ein Schlüssel enthält weder / noch | und beginnt nicht mit __. ue_item_selected liefert genau diese Adresse zurück: Zwei Kaskaden dürfen ihre Einträge gleich benennen.
Eine Trennlinie (of_add_separator) und eine Abschnittsüberschrift (of_add_header) kommen ans Ende des Menüs (leere Adresse) oder der Kaskade eines Eintrags. Keine von beiden ist ein Eintrag: nie gewählt, nie gezählt. Eine Trennlinie erscheint nie am Anfang, am Ende oder doppelt; eine Überschrift, deren Einträge alle ausgeblendet sind, verschwindet mit ihnen.
Ein Häkchen (ib_checked) zeigt, dass eine Option aktiv ist; ein Optionseintrag (is_group) ist eine Wahl unter mehreren: Die Einträge einer Gruppe unter demselben Elternelement schließen sich aus — einen anzuhaken, per Code oder durch die Wahl des Benutzers, entfernt den Haken der anderen, und ein runder Punkt ersetzt das Häkchen. Das Tastenkürzel (is_shortcut) steht rechts neben dem Eintrag; es wird nur angezeigt: Die Taste gehört dem Steuerelement, um das es im Menü geht (ein Eingabefeld kopiert bereits mit Strg+C), und ein Kontextmenü, das sie belegte, nähme sie allen Steuerelementen des Fensters weg.
Ein angehakter Eintrag außerhalb einer Gruppe schaltet nicht von selbst um, wenn der Benutzer ihn wählt — wie in jedem Windows-Menü: Schalten Sie ihn in ue_item_selected um. Ein zerstörender Befehl hebt sich durch seinen Ton ab: is_tone = TONE_DANGER schreibt seinen Text im Rot des Designs, hell wie dunkel lesbar. Damit eine Option bei der Wahl von selbst umschaltet, setzen Sie ib_auto_check = true: Das Häkchen wechselt vor ue_item_selected. Eine Option ist ein Kontrollkästchen — von einem Bildschirmleser als „nicht aktiviert“ angesagt —, sobald sie einmal angehakt war oder sobald ib_checkable = true gilt.
// A section of three exclusive entries in the View cascade
uo_menu.of_add_header(/*keys*/ "view", /*text*/ "Layout")
uo_menu.of_add_item(/*keys*/ "view/list", /*text*/ "&List")
uo_menu.of_add_item(/*keys*/ "view/details", /*text*/ "&Details")
uo_menu.of_item(/*keys*/ "view/list").is_group = "layout"
uo_menu.of_item(/*keys*/ "view/details").is_group = "layout"
// Checking one unchecks the other
uo_menu.of_item(/*keys*/ "view/details").ib_checked = true
// The shortcut SHOWN at the right of an entry
uo_menu.of_item(/*keys*/ "copy").is_shortcut = "Ctrl+C"
// A command that destroys : the red of the theme
uo_menu.of_item(/*keys*/ "delete").is_tone = uo_menu.TONE_DANGER
// event ue_item_selected : a check mark outside a group is switched by you
if as_keys = "wrap" then uo_menu.of_item(/*keys*/ as_keys).ib_checked = not uo_menu.of_item(/*keys*/ as_keys).ib_checked
// ... or by the entry itself, before ue_item_selected
uo_menu.of_item(/*keys*/ "grid").ib_auto_check = true
Ein PowerBuilder-Menü übernehmen #
Ihre Popup-Menüs sind schon geschrieben? of_load_menu macht daraus das Menü der Komponente: Übergeben Sie das Element, auf dem Sie PopMenu aufriefen. Jedes Element wird ein Eintrag, Kaskaden inbegriffen, mit seinem Text (& inbegriffen), seinem Zustand (Enabled, Checked, Visible), seinem rechts angezeigten Shortcut — wie der Text nach einem Tabulator — und seinem Symbolleistenbild, wenn es eine vorhandene Datei ist. Sein Schlüssel ist der ClassName des Elements, auf jeder Ebene. Bei einer Wahl läuft zuerst das Clicked-Skript des Elements, dann ue_item_selected: Der für PopMenu geschriebene Code funktioniert weiter. Das Menü bleibt lebendig, wie mit PopMenu: Jedes Öffnen liest die Elemente erneut (Text, Enabled, Checked, Visible, Shortcut). Der Code vor PopMenu — m_paste.Enabled = (Clipboard() <> "") — und ein Clicked, das this.Checked = not this.Checked ausführt, zeigen sich also beim nächsten Öffnen; ein Element, das bei offenem Menü ausgegraut oder ausgeblendet wird, startet sein Clicked nicht (ue_dismissed(REASON_UNAVAILABLE)). Halten Sie das Menüobjekt am Leben, solange die Komponente es nutzt. of_loaded_item liefert das Element eines Eintrags, um zu lesen, was nur das Menü weiß (seine MicroHelp) — prüfen Sie es mit IsValid, ein von Hand hinzugefügter Eintrag hat keines. Ein Clicked-Skript, das ParentWindow liest, findet dort ein gültiges Fenster — gemessen unter PowerBuilder 10, auch für ein mit create erzeugtes und nie an ein Fenster gebundenes Menü —, doch PowerBuilder wählt es aus: Nichts garantiert, dass es das Fenster ist, das das Kontextmenü trägt. Damit ein Clicked ein bestimmtes Fenster erreicht, geben Sie es dem Menü in einer Instanzvariablen, gesetzt vor of_load_menu, oder verlegen Sie diesen Code nach ue_item_selected.
// Instance variable of the window : the menu lives as long as it does
// m_popup im_popup
// open event of the window : the items of m_popup.m_edit become the menu
im_popup = create m_popup
uo_menu.of_load_menu(/*menu*/ im_popup.m_edit)
// event rbuttondown of the DataWindow : the code before PopMenu stays,
// of_show replaces PopMenu - the items are read again as it opens
im_popup.m_edit.m_paste.Enabled = (Clipboard() <> "")
uo_menu.of_show()
// event ue_item_hover of uo_menu (ib_track_hover = true) : the MicroHelp
if IsValid(uo_menu.of_loaded_item(/*keys*/ as_keys)) then st_help.text = uo_menu.of_loaded_item(/*keys*/ as_keys).MicroHelp
// A Clicked that must reach ONE given window : the menu keeps that window
// itself. Instance variable of m_popup : window iw_owner
// Clicked of m_edit.m_copy
iw_owner.TriggerEvent("ue_copy")
// open event of the window, before of_load_menu
im_popup.iw_owner = this
Eigenschaften #
| Eigenschaft | Typ | Standard | Rolle |
|---|---|---|---|
ib_track_hover | boolean | false | Schaltet ue_item_hover ein, das meldet, auf welchem Eintrag Mauszeiger oder Tastatur stehen — für die Hilfezeile einer Statusleiste. Ohne sie meldet das Menü es nicht einmal: Ein bei jeder Bewegung ausgelöstes Ereignis wird nur einer Anwendung gesendet, die es angefordert hat — setzen Sie sie vor of_show: Bei offenem Menü geändert, gilt sie ab dem nächsten Öffnen |
is_theme_style | string | "" | Visueller Stil der Komponente (Konstanten THEME_STYLE_*); leer = der der Anwendung, bei jeder Änderung übernommen |
is_theme_mode | string | "" | Helle oder dunkle Variante (Konstanten THEME_MODE_*); leer = die der Anwendung, bei jeder Änderung übernommen |
il_theme_accent | long | -1 | Akzentfarbe dieser Komponente (-1 = Akzent der Anwendung, sonst der des Designs) |
Methoden #
| Methode | Rolle | |
|---|---|---|
of_add_header (string as_keys, string as_text) | Fügt am Ende des Menüs (leere Adresse) oder der Kaskade eines Eintrags eine Abschnittsüberschrift hinzu: eine Titelzeile über den folgenden Einträgen. Nie gewählt oder gezählt. Gibt 0 zurück, sobald hinzugefügt, -5, wenn an dieser Adresse kein Eintrag existiert, -2, wenn die Komponente nicht erstellt ist | |
of_add_item (string as_keys, string as_text) | Fügt einen Eintrag an seiner Adresse hinzu: copy im Menü, export/pdf in der Kaskade eines vorhandenen Eintrags export, so tief wie nötig. Eine leere Beschriftung zeigt den Schlüssel; & kennzeichnet den Buchstaben, der ihn über die Tastatur wählt. Gibt 0 zurück, sobald hinzugefügt, -5, wenn die Adresse abgelehnt wird (Elternelement nicht gefunden, Adresse schon vergeben, leere Ebene wie export/, Schlüssel mit ` | oder beginnend mit __), -2`, wenn die Komponente nicht erstellt ist |
of_add_item (string as_keys, string as_text, string as_image, boolean ab_checked) | Ebenso, mit Symbol und Häkchen — das Symbol an dritter Stelle, wie überall in der Bibliothek. Ein Eintrag wird über seinen Handle ausgegraut: of_item(keys).ib_enabled = false. Gibt 0 zurück, sobald hinzugefügt, -5, wenn die Adresse abgelehnt wird, -2, wenn die Komponente nicht erstellt ist | |
of_add_separator (string as_keys) | Fügt am Ende des Menüs (leere Adresse) oder der Kaskade eines Eintrags eine Trennlinie hinzu. Gibt 0 zurück, sobald hinzugefügt, -5, wenn an dieser Adresse kein Eintrag existiert, -2, wenn die Komponente nicht erstellt ist | |
of_clear ( ) | Leert das Menü und gibt die über of_item erhaltenen Handles frei. Ein offenes Menü schließt sich, und ue_dismissed meldet es. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist | |
of_close ( ) | Schließt das Menü der Komponente, wenn es auf dem Bildschirm ist, ohne Wahl: ue_dismissed folgt, wie bei einem Klick daneben. Nichts offen, nichts geschieht. Gibt 0 zurück, sobald angefordert, -2, wenn die Komponente nicht erstellt ist | |
of_insert_item (string as_keys, string as_text, long al_index) | Fügt einen Eintrag an einem Rang seiner Liste ein statt an ihrem Ende: as_keys ist die Adresse, die er haben wird, al_index seine Stelle unter den Einträgen dieser Liste, ab 1 (0 oder weniger = der erste, darüber hinaus = das Ende). Trennlinien und Überschriften zählen nicht: Der Eintrag kommt direkt vor den, der diesen Rang innehatte. Gibt 0 zurück, sobald hinzugefügt, -5, wenn die Adresse abgelehnt wird (wie bei of_add_item), -2, wenn die Komponente nicht erstellt ist | |
of_insert_item (string as_keys, string as_text, string as_image, boolean ab_checked, long al_index) | Ebenso, mit Symbol und Häkchen, wie of_add_item sie nimmt. Gibt 0 zurück, sobald hinzugefügt, -5, wenn die Adresse abgelehnt wird, -2, wenn die Komponente nicht erstellt ist | |
of_is_open ( ) | true, solange ein Menü der Komponente auf dem Bildschirm ist — geöffnet und noch nicht durch eine Wahl oder ein Schließen beantwortet | |
of_item (string as_keys) | Gibt den Handle eines Eintrags über seine Adresse zurück, um ihn später zu lesen oder zu ändern (Beschriftung, Zustand, Symbol, Tastenkürzel, Gruppe, Farben). Ein einzelner Schlüssel wird in die vollständige Adresse des einzigen Eintrags aufgelöst, der ihn trägt: of_item("pdf") und of_item("export/pdf") geben dann denselben Handle zurück. Mehrdeutig oder von keinem Eintrag getragen, gibt er einen Handle zurück, der nichts ändert, statt des falschen Eintrags | |
of_load_menu (menu am_menu) | Baut das Menü aus einem PowerBuilder-Menü: Übergeben Sie das Element, auf dem Sie PopMenu aufriefen. Seine Elemente werden die Einträge, Kaskaden inbegriffen, Schlüssel = ClassName; bei einer Wahl läuft das Clicked des Elements vor ue_item_selected. Die Elemente werden bei jedem Öffnen neu gelesen. Das Menü ersetzt, was die Komponente enthielt. Gibt 0 zurück, sobald geladen, -5, wenn das Menü ungültig ist, -2, wenn die Komponente nicht erstellt ist | |
of_loaded_item (string as_keys) | Das PowerBuilder-Menüelement, aus dem ein Eintrag stammt (of_load_menu), über seine Adresse — um seine MicroHelp zu lesen. Eine Adresse, die nicht aus einem Menü stammt, liefert einen ungültigen Verweis: Prüfen Sie ihn mit IsValid | |
of_remove_item (string as_keys) | Entfernt einen Eintrag samt Kaskade; die anderen bleiben. Seine Handles werden freigegeben; ein offenes Menü schließt sich (ue_dismissed). Gibt 0 zurück, sobald entfernt, -5, wenn an dieser Adresse kein Eintrag existiert, -2, wenn die Komponente nicht erstellt ist | |
of_reset ( ) | Leert das Menü und setzt jede Eigenschaft auf ihren Standardwert zurück, ohne ein Ereignis auszulösen. Gibt 0 zurück, sobald angewendet, -2, wenn die Komponente nicht erstellt ist | |
of_show ( ) | Öffnet das Menü am Cursor. Rufen Sie es aus dem Rechtsklick des Steuerelements auf, das die Geste empfängt. Ein Menü ohne sichtbaren Eintrag öffnet sich nicht: ue_dismissed wird ausgelöst. Gibt 0 zurück, sobald angefordert, -2, wenn die Komponente nicht erstellt ist | |
of_show (long al_x, long al_y) | Ebenso, an einer Bildschirmposition in Pixeln. Negative Koordinaten sind ein echter Punkt: ein Bildschirm links oder oberhalb des Hauptbildschirms. Gibt 0 zurück, sobald angefordert, -2, wenn die Komponente nicht erstellt ist | |
of_show_at (dragobject ado_control, long al_x, long al_y) | Öffnet das Menü an einem Punkt in einem Steuerelement, in PowerBuilder-Einheiten ab seiner linken oberen Ecke — der Punkt, den PopMenu nahm: of_show_at(dw_list, dw_list.PointerX(), dw_list.PointerY()). Das Steuerelement wird gemerkt: of_source nennt es. Gibt 0 zurück, sobald angefordert, -5, wenn das Steuerelement ungültig oder eine Koordinate null ist, -2, wenn die Komponente nicht erstellt ist | |
of_show_under (dragobject ado_control) | Öffnet das Menü unter einem Steuerelement: Es hängt an dessen Unterkante, an seiner Anfangskante ausgerichtet (seiner rechten Kante bei Rechts-nach-links-Layout), und öffnet sich darüber, wenn der Bildschirm darunter endet. Gibt 0 zurück, sobald angefordert, -5, wenn das Steuerelement ungültig ist, -2, wenn die Komponente nicht erstellt ist — unter einer Komponente mit Elementen (eine Buttonbar, eine Toolbar) hängt das Menü unter der ganzen Komponente, nicht unter einer ihrer Schaltflächen | |
of_show_under (dragobject ado_control, boolean ab_keyboard) | Ebenso, mit der Angabe, wie das Menü angefordert wurde: true für die Tastatur (Umschalt+F10, Menütaste) — der erste aktive Eintrag ist markiert, Eingabe wählt ihn, wie in Windows. Gibt 0 zurück, sobald angefordert, -5, wenn das Steuerelement ungültig ist, -2, wenn die Komponente nicht erstellt ist | |
of_source ( ) | Das Steuerelement, aus dem das Menü auf dem Bildschirm — oder das letzte — geöffnet wurde: das an of_show_under oder of_show_at übergebene. Lesen Sie es in ue_item_selected, wenn ein Menü mehreren Steuerelementen dient. Ein am Cursor oder an einem Bildschirmpunkt (of_show) geöffnetes Menü hat keines: Der Verweis ist ungültig, prüfen Sie ihn mit IsValid |
Ereignisse #
| Ereignis | Ausgelöst wenn |
|---|---|
ue_item_selected (string as_keys) | Der Benutzer hat einen Eintrag gewählt, per Maus oder Tastatur. as_keys ist seine vollständige Adresse (export/pdf). Ein Eintrag einer Gruppe wird vor dem Ereignis angehakt und die anderen seiner Gruppe abgehakt |
ue_dismissed (string as_reason) | Das Menü wurde ohne Wahl geschlossen: ein Klick daneben, Esc, of_close, ein entfernter Eintrag oder das geleerte Menü, während es offen war, ein zweites of_show, das es ersetzt hat — und auch, wenn of_show nichts zu zeigen hatte — as_reason sagt, welches: REASON_ESCAPE, REASON_OUTSIDE, REASON_FOCUS, REASON_USER, REASON_CODE, REASON_REPLACED, REASON_EMPTY, REASON_UNAVAILABLE (ein seit dem Öffnen ausgegrauter, ausgeblendeter oder entfernter Eintrag) |
ue_item_hover (string as_keys) | Mit ib_track_hover = true: der Eintrag, auf dem der Mauszeiger steht, über seine Adresse — auch ein ausgegrauter, damit seine Hilfe sagen kann, warum; über die Tastatur die Einträge, auf denen sie stehen bleibt, ausgegraute übersprungen. Einmal pro Eintrag ausgelöst, dann mit einer leeren Adresse, wenn das Menü schließt: Leeren Sie dann die Hilfezeile. of_reset schließt ein offenes Menü, ohne es auszulösen: Leeren Sie sie selbst |
Elementeigenschaften #
| Eigenschaft | Typ | Standard | Rolle |
|---|---|---|---|
is_text | string | "" | Beschriftung des Eintrags. & kennzeichnet den Buchstaben, der ihn über die Tastatur wählt (&& für ein kaufmännisches Und); leer, wird der Schlüssel angezeigt und die Beschriftung leer zurückgelesen |
ib_enabled | boolean | true | Auf false gesetzt, ist der Eintrag ausgegraut: angezeigt, nie gewählt, seine Kaskade geschlossen |
ib_visible | boolean | true | Auf false gesetzt, verlässt der Eintrag das Menü — samt Kaskade —, ohne entfernt zu werden: Er behält Schlüssel und Zustand und kehrt an seinen Platz zurück. Eine Kaskade, deren Einträge alle ausgeblendet sind, bleibt ausgegraut |
ib_checked | boolean | false | Ein Häkchen am Eintrag — ein runder Punkt bei einem Eintrag einer Gruppe. Einen Eintrag einer Gruppe anzuhaken, entfernt den Haken der anderen der Gruppe; außerhalb einer Gruppe schaltet der Eintrag bei der Wahl nicht von selbst um: Tun Sie es in ue_item_selected, oder setzen Sie ib_auto_check |
ib_checkable | boolean | false | Ein Kontrollkästchen: Die Option wird auch nicht angehakt als solches gezeigt und angesagt („nicht aktiviert“ für einen Bildschirmleser). Ein einmal angehakter Eintrag wird es von selbst; setzen Sie es für eine Option, die nicht angehakt beginnt. Ein Optionseintrag (is_group) ist nie eines |
ib_auto_check | boolean | false | Auf true gesetzt, schaltet die Wahl des Eintrags sein Häkchen von selbst um, vor ue_item_selected — ib_checked nennt dort den neuen Zustand. Er wird ein Kontrollkästchen; ohne Wirkung auf einen Eintrag einer Gruppe |
is_group | string | "" | Macht den Eintrag zu einem Optionseintrag der genannten Gruppe: Die Einträge einer Gruppe unter demselben Elternelement schließen sich aus. Leer: ein gewöhnlicher Eintrag |
is_image | string | "" | Symbol des Eintrags, an Ort und Stelle geändert. Dieselben Pfade wie bei of_add_item (mono:, tint:, datei.dll:NAME); leer, verschwindet es |
is_shortcut | string | "" | Das rechts neben dem Eintrag angezeigte Tastenkürzel (Ctrl+C). Nur angezeigt: Die Taste gehört dem Steuerelement, um das es im Menü geht. Nie an einem Eintrag gezeigt, der eine Kaskade öffnet |
is_tone | string | "" | Der Ton des Befehls: sein Text im Ruhezustand in einer Farbe des hellen oder dunklen Designs — TONE_DANGER für den zerstörenden, TONE_WARN, TONE_SUCCESS, TONE_INFO; leer oder TONE_NEUTRAL = der Text des Designs. Beim Zeigen nimmt der Eintrag die Hover-Farben des Designs an; ein il_text_color des Eintrags hat Vorrang. Die Konstanten liegen auf u_pbt_contextmenu |
il_accent | long | -1 | Akzent dieses Eintrags: sein Häkchen und sein Rand, wenn er angezeigt wird (-1 = der des Designs) |
il_back_color | long | -1 | Hintergrund dieses Eintrags im Ruhezustand (-1 = der des Designs). Allein gesetzt, nimmt der Text eine darauf lesbare Farbe an |
il_text_color | long | -1 | Textfarbe dieses Eintrags (-1 = die des Designs). Eine einzige Farbe ist nicht auf hellem und dunklem Design lesbar: Setzen Sie il_back_color dazu, oder nehmen Sie lieber is_tone, das dem Design folgt |
il_back_color_hover | long | -1 | Hintergrund dieses Eintrags, solange auf ihn gezeigt wird (-1 = der des Designs) |
il_text_color_hover | long | -1 | Textfarbe dieses Eintrags, solange auf ihn gezeigt wird (-1 = die des Designs): Setzen Sie il_back_color_hover dazu, der Hover des Designs wechselt von Design zu Design |
Ein Eintrag zeigt keine QuickInfo: Das native Menü hat keine. Das vom Handle geerbte is_tooltip wird gespeichert und lässt sich zurücklesen, wird aber nie angezeigt — für eine Hilfe ib_track_hover und ue_item_hover.
Beispiele #
Ein Menü für das Angeklickte #
// event ue_rclicked of the list : the menu is rebuilt for the current row
uo_menu.of_clear()
uo_menu.of_add_item(/*keys*/ "open", /*text*/ "&Open")
uo_menu.of_add_item(/*keys*/ "rename", /*text*/ "Re&name")
uo_menu.of_add_separator(/*keys*/ "")
uo_menu.of_add_item(/*keys*/ "delete", /*text*/ "&Delete")
// A row the user may not change : its commands are greyed
uo_menu.of_item(/*keys*/ "rename").ib_enabled = ib_can_edit
uo_menu.of_item(/*keys*/ "delete").ib_enabled = ib_can_edit
// At the cursor
uo_menu.of_show()
Eine Schaltfläche Mehr #
// event ue_clicked of the button : the menu hangs from it
uo_menu.of_show_under(/*control*/ uo_more)
Eine Hilfezeile in der Statusleiste #
// Once, after the menu is built : report the pointed entry
uo_menu.ib_track_hover = true
// event ue_item_hover of uo_menu : (string as_keys), "" when the menu closes
choose case as_keys
case "delete"
st_help.text = "Deletes the row, without the clipboard."
case else
st_help.text = ""
end choose
Bewährte Praxis #
- Öffnen Sie aus dem Rechtsklick-Ereignis des Steuerelements (siehe Tabelle): Nur ein Drücken wählt einen Eintrag, das folgende Loslassen wählt nichts.
- Ein kurzes Menü. Die häufigen Befehle oben, die zerstörenden unten, nach einer Trennlinie, mit
TONE_DANGER. - Lieber ausgrauen als ausblenden, wenn ein Befehl existiert, hier aber nicht gilt: Der Benutzer lernt, wo er ist.
- Zeigen Sie die Tastenkürzel Ihrer Befehle: In einem Kontextmenü lernt man sie.
- Eine Kaskade, nicht zwei: Jenseits einer Ebene liest sich ein Dialog besser.
Demoversion #
Ohne Schlüssel zeigt jede Liste des Menüs — die Wurzel wie jede Kaskade — ihre ersten sechs sichtbaren Einträge; Trennlinien und Überschriften zählen nicht. Die letzte, ausgegraute Zeile sagt, wie viele Einträge nicht angezeigt werden — oder trägt, wenn nichts gekürzt ist, den Vermerk „PBToolboxAI — DEMO“. Das Modell behält alles: Ein Schlüssel zeigt beim nächsten Öffnen das ganze Menü.
Der Starter hat keine Fläche: Von den unten geerbten Mitgliedern haben of_save_as_png, of_print und of_focus_webview nichts aufzunehmen, zu drucken oder zu empfangen. of_register_shortcut bleibt nützlich — ein Fensterkürzel, das das Menü mit of_show_under öffnet.
Vom gemeinsamen Sockel geerbt #
Diese Mitglieder gibt es bei jeder visuellen Komponente — sie sind nicht dieser eigen. Sie werden einmal in den übergreifenden Kapiteln beschrieben; diese Tabelle sagt nur, wo man sie liest.
| Mitglieder | Rolle | Beschrieben in |
|---|---|---|
of_count · of_keys_at · of_has | Durchlaufen, was die Komponente enthält | 3.2 Die Items |
of_reset | Die Komponente zurücksetzen | 3.6 Eine Komponente zurücksetzen: of_reset() |
of_register_shortcut · of_clear_shortcuts | Tastenkürzel der Komponente | 3.5 Tastenkombinationen |
of_is_created · of_is_ready · of_get_last_error | Ob sie entstanden ist, ob sie bereit ist, was fehlschlug | 3.7 Diagnose |
of_save_as_png · of_save_as_jpg | Die Darstellung als Bild exportieren | 3.8 Die Darstellung als Bild exportieren |
of_set_redraw | Änderungen zu einem einzigen Neuzeichnen bündeln | 3.10 Best Practices |
of_preload_icons | Symbole ohne Verzögerung | Sofortige Anzeige: of_icon |
of_set_translation | Eine Beschriftung der Komponente übersetzen | 5.2 Eine Beschriftung anpassen: of_set_translation |
of_focus_webview | Der Komponente den Fokus geben | 6.4 Tastatur und Fokus |
of_print · of_print_to_pdf | Drucken oder ein PDF schreiben | 6.9 Drucken |
of_set_property · of_get_property · of_component_name | Eine Eigenschaft über ihren Namen steuern | 3.1 Die Eigenschaften-Engine |
is_accessible_name · is_accessible_description | Name und Beschreibung, die ein Bildschirmleser sagt | 3.4 Optionale Eigenschaften und Events |
Bei diesem unsichtbaren Starter durchlaufen of_count und of_keys_at, was Sie hinzugefügt haben, ausgeblendete Zweige eingeschlossen — nicht, was das Rad zeichnen wird. Der Bildexport, das Drucken, of_focus_webview und of_set_redraw haben hier keine nützliche Wirkung: Die Komponente zeichnet nichts Eigenes, das Rad lebt in seinem eigenen Fenster.
Zwei Helfer werden nicht geerbt: of_icon und of_escape_markup liegen auf n_pbt_utils. Deklarieren Sie eines — n_pbt_utils lnv_utils, nichts zu erzeugen — und rufen Sie sie darauf auf.