PBToolboxAI v4 ← Site

picture — u_pbt_picture #

← Komponentenreferenz · Inhalt des Handbuchs

Bildanzeige: alle gängigen Formate, Zuschnittmodi, Ausrichtung, automatische Graustufendarstellung und Zähler-Plakette.

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


Auf einen Blick #

Userobjectu_pbt_picture
Item-Klasse— (Komponente ohne Items)
WofürEin PowerBuilder-picture ersetzen: moderne Formate (SVG, WebP, animiertes GIF), beherrschter Zuschnitt, anklickbares Bild, automatische Graustufendarstellung
Opt-in-Optionenib_track_mouse

Schnellstart #

// open-Event des Fensters
uo_image.is_source  = "img\logo.png"
uo_image.is_stretch = uo_image.STRETCH_UNIFORM   // passt an, ohne zu verzerren
uo_image.is_align   = uo_image.ALIGN_CENTER
uo_image.is_tooltip = "Logo der Firma"

Woher das Bild kommt: is_source #

is_source akzeptiert vier Formen, die alle austauschbar sind:

FormBeispielVerwendung
Lokale Dateiimg\logo.pngpng, jpg, jfif, bmp, gif, ico, svg, webp, avif
Webadressehttps://…/logo.pngVon einem Server geladenes Bild (nur https: eine http://-Adresse wird abgelehnt, siehe unten)
Eingebettete Datendata:image/png;base64,…Bereits im Speicher vorliegendes Bild, ohne Zwischendatei
DLL-Ressourceimg\packimages.dll:SAMPLEIn einer Ressourcen-DLL verpacktes Bild

Einem GIF kann das Präfix anim: vorangestellt werden, um eine Animation ausdrücklich zu kennzeichnen (GIFs werden ohnehin animiert).

Wenn derselbe Name in einer DLL unter mehreren Ressourcentypen vorkommt, geben Sie den Typ an: img\packimages.dll:PNG/SAMPLE, SVG/SAMPLE, ICON/APP, RCDATA/BLOB. Siehe Bilder und Symbole für die Präfixe mono: und tint:, die ein Glyph passend zum Design umfärben.

Eine http://-Adresse wird abgelehnt: Die Seite der Komponente ist gesichert, und die Engine würde das Bild stillschweigend auf https:// umstellen — auf einem Intranet-Server ohne TLS schlüge es dann mit einer irreführenden Meldung fehl. Die Komponente lehnt sie deshalb von vornherein ab: Fehlerzeichen und ue_error mit REASON_INSECURE. Für ein Bild auf einem unverschlüsselten Server laden Sie es zuerst mit n_pbt_restclient.of_download in einen temporären Ordner herunter und zeigen dann diesen Pfad an. Denselben Pfad erneut zuzuweisen liest die Datei neu: Ein Bild, das Ihre Anwendung gerade neu geschrieben hat (Foto, Scan, Zuschnitt), erscheint, wie beim nativen Picture. Ein Bild auf dem Datenträger ist auf 32 MB begrenzt.


Wie es zugeschnitten wird: is_stretch #

KonstanteWirkung
STRETCH_UNIFORMStandard. Das Bild wird ohne Verzerrung skaliert und bleibt vollständig sichtbar; es können Ränder entstehen
STRETCH_UNIFORMTOFILLOhne Verzerrung skaliert, aber der Rahmen wird vollständig gefüllt; Überstände werden beschnitten
STRETCH_FILLDas Bild wird gedehnt, bis es genau den Rahmen ausfüllt — es kann verzerrt werden
STRETCH_NONEUrsprungsgröße, ohne Skalierung

is_align bestimmt die waagerechte Lage des Bildes, wenn es kleiner als das Steuerelement ist: ALIGN_CENTER (Standard), ALIGN_START, ALIGN_END. Die senkrechte Achse hat ihre eigene Eigenschaft, is_valign. Die Platzierung gilt auf dem Bildschirm: ALIGN_START bleibt am Anfangsrand, unabhängig von ii_rotation und ib_mirror. Ein unbekannter Wert wird als center zurückgelesen.


Konstanten #

KonstanteWertFür
STRETCH_NONE · STRETCH_FILL · STRETCH_UNIFORM · STRETCH_UNIFORMTOFILL"none" "fill" "uniform" "uniformtofill"is_stretch
ALIGN_CENTER · ALIGN_START · ALIGN_END"center" "start" "end"is_align
VALIGN_TOP · VALIGN_CENTER · VALIGN_BOTTOM"top" "center" "bottom"is_valign
ROTATION_NONE · ROTATION_90 · ROTATION_180 · ROTATION_2700 90 180 270ii_rotation
REASON_NOT_FOUND · REASON_TOO_LARGE · REASON_INSECURE · REASON_UNSUPPORTED · REASON_FAILED"notfound" "toolarge" "insecure" "unsupported" "failed"ue_error (as_reason)

ALIGN_START und ALIGN_END sind logisch: Sie folgen der Schreibrichtung (Sprache und RTL). Die physischen Werte left und right werden weiterhin als Aliasnamen akzeptiert.


Eigenschaften #

EigenschaftTypStandardZweck
is_sourcestring""Das anzuzeigende Bild (siehe die vier Formen oben)
is_stretchstring"uniform"Zuschnittmodus: STRETCH_NONE, STRETCH_FILL, STRETCH_UNIFORM, STRETCH_UNIFORMTOFILL
is_alignstring"center"Horizontale Platzierung, wenn das Bild kleiner als das Steuerelement ist: ALIGN_CENTER, ALIGN_START, ALIGN_END. Die vertikale Achse ist is_valign
is_valignstringVALIGN_CENTERSenkrechte Platzierung, wenn das Bild kleiner als das Steuerelement ist: VALIGN_TOP, VALIGN_CENTER, VALIGN_BOTTOM. Die beiden Achsen sind unabhängig — is_align gibt die Spalte, diese die Zeile — und genau das macht eine Ecke erreichbar
ib_enabledbooleantrueBei false wird das Bild in Graustufen angezeigt und reagiert auf nichts mehr: Klicks, Mausrad, Tastatur und abgelegte Dateien
ii_badgeinteger0Zähler-Plakette in der oberen Ecke am Zeilenende: rechts bei Leserichtung links nach rechts, links bei rechts nach links (0 = keine)
il_badge_colorlong-1Hintergrund der Plakette, als PowerBuilder-RGB (-1 = nicht gesetzt: die Farbe aus dem Design; 0 ist Schwarz, wie bei jeder anderen Farbe). Die Textfarbe wird automatisch gewählt, damit der Zähler lesbar bleibt
ii_badge_sizeinteger0Höhe der Plakette in Pixeln (0 = die Größe aus dem Design). Die Schriftgröße folgt von selbst: der Zähler bleibt bei jeder Größe zentriert
ib_track_mousebooleanfalseOpt-in: aktiviert ue_mouse_enter / ue_mouse_leave
is_placeholderstring""Platzhalterbild, angezeigt solange is_source leer ist (ein Rahmen « Foto hinzufügen », eine Silhouette). Gedämpft dargestellt: ein Platzhalter ist nicht der Inhalt und wird nie als geladenes Bild gemeldet. Akzeptiert das Präfix mono:, das ein einfarbiges Zeichen mit dem Design einfärbt
is_error_sourcestring""Ersatzbild, wenn die Quelle beim Laden fehlschlägt. Lassen Sie es leer, und die Komponente zeigt ihr eigenes Fehlerzeichen — nie ein leeres Feld, das dem Benutzer nichts sagt, während ue_error nur zu Ihrem Code gelangt. Akzeptiert das Präfix mono:
ii_rotationinteger0Vierteldrehungen, für Scans und Fotos, die liegend ankommen: ROTATION_NONE, ROTATION_90, ROTATION_180, ROTATION_270 (jeder andere Wert gilt als 0). Eine Vierteldrehung tauscht auch die Einpassachsen, damit das Bild seine Proportionen behält, statt gequetscht zu werden
ib_mirrorbooleanfalseWaagerechte Spiegelung auf dem Bildschirm: das Bild wird von links nach rechts gespiegelt, unabhängig von ii_rotation
ib_zoomablebooleanfalseOpt-in: Der Benutzer darf heranzoomen (Mausrad, zum Mauszeiger hin, oder Tasten + und -), sich bewegen (Ziehen, oder Pfeiltasten — bei Leserichtung rechts nach links umgekehrt) und zur Einpassung zurückkehren (Doppelklick, oder 0); die Taste 1 zeigt das Bild in seiner TATSÄCHLICHEN Größe, ein Bildpixel pro Bildschirmpixel. Größer als sein Rahmen, deckt das Bild ihn immer ab: Ziehen legt nie einen leeren Streifen frei; kleiner, bleibt es dort, wo is_align und is_valign es platzieren. Nur die linke Maustaste verschiebt es. Für einen Plan, einen Scan, ein Foto — wo vier feste Einpassmodi nicht genügen
id_zoomdouble1.0Zoomfaktor: 1.0 = die von is_stretch gewählte Einpassung, bis id_max_zoom (standardmäßig 8.0). Zurückgelesen liefert er den aktuellen Faktor, Rad und Tastatur eingeschlossen (ue_zoom_changed meldet jede Änderung: eine Geste des Benutzers oder diese von Ihrem Code gesetzte Eigenschaft). Erfordert ib_zoomable, zuvor gesetzt: ohne es bleibt der Faktor 1.0
id_max_zoomdouble8.0Die OBERGRENZE des Zooms, in der Einheit von id_zoom (1.0 = die Einpassung): Mausrad, Tasten und id_zoom halten dort an. Jeder Wert ab 1.0; darunter gilt wieder der Standard. Die TATSÄCHLICHE Größe bleibt immer erreichbar — die Taste 1 führt dorthin, und ein großer, klein angezeigter Scan bleibt Pixel für Pixel lesbar. Unter den aktuellen Zoom gesenkt, geht der Zoom darauf zurück und ue_zoom_changed meldet es
ib_allow_dropbooleanfalseOpt-in: nimmt aus dem Windows-Explorer abgelegte Dateien an. Der Rahmen zeigt die Bereitschaft, und die vollständigen Pfade kommen über ue_drop_files — sie in is_source zu laden bleibt Ihrer Anwendung überlassen. Ein deaktiviertes Bild (ib_enabled = false) lehnt jedes Ablegen ab, und ib_allow_drop liest sich weiter wie gesetzt
ib_auto_heightbooleanfalseOpt-in: Das Userobject nimmt die Höhe an, die die Proportionen des Bildes bei seiner aktuellen Breite wahrt. Für ein Bild ist diese Höhe ableitbar: Sie müssen sie nicht selbst aus den von ue_loaded gemeldeten Maßen berechnen
is_alt_textstring""Alternativtext: was ein Bildschirmleser über das Bild sagt. Für ein rein dekoratives Bild leer lassen
is_theme_stylestring""Visueller Stil der Komponente (Konstanten THEME_STYLE_*); leer = der der Anwendung, bei jeder Änderung übernommen
is_theme_modestring""Helle oder dunkle Variante (Konstanten THEME_MODE_*); leer = die der Anwendung, bei jeder Änderung übernommen
il_theme_accentlong-1Akzentfarbe dieser Komponente (-1 = Akzent der Anwendung, sonst der des Designs)
is_tooltipstring""Einfacher Tooltip beim Überfahren der Komponente
is_super_tooltip_titlestring""Titel des erweiterten Tooltips (hat Vorrang vor is_tooltip)
is_super_tooltip_textstring""Text des erweiterten Tooltips (Rich-Markup zulässig)
is_super_tooltip_imagestring""Bild des erweiterten Tooltips

Methoden #

MethodeZweck
of_reset ( )Setzt alle Eigenschaften auf ihren Standard zurück und entfernt das Bild. Liefert 0 nach der Anwendung, -2 wenn die Komponente nicht erzeugt ist
of_set_redraw (boolean)Fasst eine Folge von Änderungen zu einer einzigen Darstellung zusammen. Liefert 0 nach der Anwendung, -2 wenn die Komponente nicht erzeugt ist
of_save_as_png (string) · of_save_as_jpg (string)Exportiert die Darstellung als Bild. Liefert 0 nach dem Schreiben des Bildes, -4 wenn das Schreiben fehlschlägt, -2 wenn die Komponente nicht erzeugt ist

Events #

EventAusgelöst wenn
ue_clicked ( )Linksklick auf das Bild. Das Verschieben des gezoomten Bildes ist kein Klick, und ein Doppelklick löst nur einen aus, wie das native Picture
ue_loaded (long al_width, long al_height)Das Bild ist geladen; die Parameter tragen seine ursprünglichen Maße in Pixeln
ue_error (string as_message, string as_reason)Das Bild konnte nicht geladen werden. as_message nennt die Quelle (image load failed : <source>), as_reason sagt warum: REASON_NOT_FOUND (fehlende Datei), REASON_TOO_LARGE (über 32 MB), REASON_INSECURE (eine http://-Adresse, abgelehnt), REASON_UNSUPPORTED (ein Format, das die Komponente nicht anzeigt), REASON_FAILED (alles andere: eine Datei, die sich nicht dekodieren lässt, ein Server, der nicht antwortet)
ue_rclicked ( )Rechtsklick auf das Bild
ue_double_clicked ( )Doppelklick auf das Bild. Ein einziges ue_clicked geht ihm voraus, nie zwei — wie beim nativen Picture. Ist ib_zoomable aktiv, führt der Doppelklick außerdem zur Einpassung zurück: das Ereignis wird in beiden Fällen ausgelöst, seine Bedeutung bestimmen Sie
ue_zoom_changed (double ad_zoom)Der Zoomfaktor hat sich geändert: Mausrad, Doppelklick, die Tasten +, - und 0, oder id_zoom, von Ihrem Code gesetzt — nichts, wenn der Faktor gleich bleibt. 1.0 heißt: zurück zur Einpassung von is_stretch
ue_auto_height (long al_height)Die Komponente hat sich auf eine neue Höhe festgelegt; das Userobject ist beim Auslösen bereits angepasst. Erfordert ib_auto_height
ue_drop_files (string as_files[])Aus dem Explorer abgelegte Dateien: vollständige Pfade, ein Eintrag je Datei. Erfordert ib_allow_drop
ue_drag_enter ( )Ein Dateiziehen hat die Komponente erreicht (ib_allow_drop)
ue_drag_leave ( )Das Dateiziehen hat die Komponente verlassen
ue_mouse_enter ( )Die Maus tritt ein — erfordert ib_track_mouse = true
ue_mouse_leave ( )Die Maus verlässt den Bereich — erfordert ib_track_mouse = true
ue_ready ( )Die Komponente ist fertig geladen; alles zuvor Gesendete wurde nachgespielt
ue_runtime_missing ( )Die WebView2-Runtime fehlt: die Komponente bleibt leer
ue_bg_color (long al_color)Die Komponente hat ihre Design-Hintergrundfarbe berechnet; das Userobject hat sie bereits übernommen (backcolor)

Beispiele #

Das Foto eines Datensatzes anzeigen #

// Event ue_row_changed der DataWindow : das Foto des aktuellen Kunden anzeigen
uo_photo.is_source  = "photos\" + ls_customer_code + ".jpg"
uo_photo.is_stretch = uo_photo.STRETCH_UNIFORMTOFILL   // fuellt den Rahmen, der Ueberstand wird beschnitten
uo_photo.is_align   = uo_photo.ALIGN_CENTER
// Event ue_error von uo_photo : (string as_message, string as_reason)
if as_reason = uo_photo.REASON_NOT_FOUND then
    uo_photo.is_source = "img\photo_missing.svg"     // Ersatzbild
end if

ue_error zu behandeln ist der richtige Weg, um mit einem fehlenden Foto umzugehen: Es ist unnötig, vor der Zuweisung zu prüfen, ob die Datei vorhanden ist.

Ein anklickbares Bild, wie eine Schaltfläche #

// Das Bild und der Tooltip, der erscheint, wenn die Maus darauf ruht
uo_avatar.is_source    = "photos\user.png"
uo_avatar.is_tooltip   = "Mein Konto"
// Event ue_clicked von uo_avatar
of_open_my_account()

Zähler und Graustufendarstellung #

// Eine Benachrichtigungs-Plakette auf einem E-Mail-Symbol
uo_mail.is_source = "img\packimages.dll:SVG/MAIL"
uo_mail.ii_badge  = ll_unread       // 0 laesst die Plakette verschwinden

// Rote Plakette oberhalb einer Schwelle, sonst die Farbe des Designs (-1)
if ll_unread > 20 then
    uo_mail.il_badge_color = RGB(/*red*/ 200, /*green*/ 30, /*blue*/ 30)
else
    uo_mail.il_badge_color = -1
end if

// Funktion nicht verfuegbar : das Bild wechselt in Graustufen, ohne zweites Bild
uo_mail.ib_enabled = ib_mail_allowed

Die Graustufendarstellung wird automatisch berechnet: Sie müssen kein zweites, „deaktiviertes“ Bild bereitstellen.

Die tatsächlichen Maße des Bildes erfahren #

// Show the file the user has chosen
uo_preview.is_source = ls_chosen_file
// Event ue_loaded von uo_preview : (long al_width, long al_height)
uo_status.of_panel(/*key*/ "main").is_text = String(al_width) + " x " + String(al_height) + " px"

// Ein Bild, das kleiner als der Rahmen ist : nicht unnoetig vergroessern
if al_width < uo_preview.width and al_height < uo_preview.height then
    uo_preview.is_stretch = uo_preview.STRETCH_NONE
end if

Ein Banner über die gesamte Breite #

// Das Bannerbild, das seinen Streifen fuellt
uo_banner.is_source  = "img\banniere.jpg"
uo_banner.is_stretch = uo_banner.STRETCH_UNIFORMTOFILL   // fuellt die ganze Bahn, ohne zu verzerren
uo_banner.is_valign   = uo_banner.VALIGN_TOP               // haelt den oberen Teil des Bildes sichtbar

Best Practices #

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.

MitgliederRolleBeschrieben in
of_resetDie Komponente zurücksetzen3.6 Eine Komponente zurücksetzen: of_reset()
of_register_shortcut · of_clear_shortcutsTastenkürzel der Komponente3.5 Tastenkombinationen
of_is_created · of_is_ready · of_get_last_errorOb sie entstanden ist, ob sie bereit ist, was fehlschlug3.7 Diagnose
of_save_as_png · of_save_as_jpgDie Darstellung als Bild exportieren3.8 Die Darstellung als Bild exportieren
of_set_redrawÄnderungen zu einem einzigen Neuzeichnen bündeln3.10 Best Practices
of_preload_iconsSymbole ohne VerzögerungSofortige Anzeige: of_icon
of_set_translationEine Beschriftung der Komponente übersetzen5.2 Eine Beschriftung anpassen: of_set_translation
of_focus_webviewDer Komponente den Fokus geben6.4 Tastatur und Fokus
of_print · of_print_to_pdfDrucken oder ein PDF schreiben6.9 Drucken
of_set_property · of_get_property · of_component_nameEine Eigenschaft über ihren Namen steuern3.1 Die Eigenschaften-Engine

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.


← Komponentenreferenz · Inhalt des Handbuchs